00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00050 #ifndef TOPPERS_RENDEZVOUS_HPP_
00051 #define TOPPERS_RENDEZVOUS_HPP_
00052
00053 #include <toppers/object.hpp>
00054
00055 namespace toppers
00056 {
00057
00068 template <class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00069 class Stub = TOPPERS_DEFAULT_STUB >
00070 class rendezvous : Diagnostics
00071 {
00072 RDVNO rdvno_;
00073
00074 public:
00076 typedef t_rrdv reference;
00077
00079 explicit rendezvous(RDVNO rdvno = 0) : rdvno_(rdvno) {}
00080
00082 ER refer(reference* pk_robj) const
00083 {
00084 ER ercd = Stub::stub_ref_rdv(rdvno_, pk_robj);
00085 return handle_error(ercd);
00086 }
00087
00089 ER reply(const void* msg, UINT rmsgsz)
00090 {
00091 ER ercd = Stub::stub_rpl_rdv(rdvno_, msg, rmsgsz);
00092 if (ercd == E_OK)
00093 rdvno_ = 0;
00094 return handle_error(ercd);
00095 }
00096
00098 RDVNO no() const { return rdvno_; }
00100 void attach(RDVNO rdvno) { rdvno_ = rdvno; }
00101 };
00102
00113 template <ID Id = 0,
00114 class Diagnostics = TOPPERS_DEFAULT_DIAGNOSTICS,
00115 class Stub = TOPPERS_DEFAULT_STUB >
00116 class rendezvousport : Diagnostics
00117 {
00118 typedef object_controller<Id, obj_rendezvousport, Stub> controller;
00119 object_id<Id> objid_;
00120
00121 public:
00123 typedef t_cpor creation;
00125 typedef t_rpor reference;
00126
00129
00131 rendezvousport() {}
00133 explicit rendezvousport(ID id) : objid_(id) {}
00134
00136 template <ID Id2, class Diagnostics2, class Stub2>
00137 rendezvousport(const rendezvousport<Id2, Diagnostics2, Stub2>& other)
00138 : objid_(get_unsafe_id(other))
00139 {
00140 TOPPERS_STATIC_ASSERT(Id == 0);
00141 }
00142
00144
00147
00148
00149 ER create(creation* pk_cobj)
00150 {
00151 ER ercd = controller::create(objid_, pk_cobj);
00152 return handle_error(ercd);
00153 }
00155 ER create(const creation* pk_cobj)
00156 {
00157 ER ercd = controller::create(objid_, pk_cobj);
00158 return handle_error(ercd);
00159 }
00161 ER create(ATR poratr = TA_TFIFO, UINT maxcmsz = 256, UINT maxrmsz = 256)
00162 {
00163 creation packet;
00164 packet.poratr = poratr;
00165 packet.maxcmsz = maxcmsz;
00166 packet.maxrmsz = maxrmsz;
00167 return create(&packet);
00168 }
00170 ER destroy()
00171 {
00172 ER ercd = controller::destroy(objid_);
00173 return handle_error(ercd);
00174 }
00175
00177
00180
00182 ER refer(reference* pk_robj) const
00183 {
00184 ER ercd = controller::refer(objid_, pk_robj);
00185 return handle_error(ercd);
00186 }
00187
00189
00192
00194 ER_UINT call(RDVPTN calptn, void* msg, UINT cmsgsz, forever_tag = forever) const
00195 {
00196 ER_UINT ercd = Stub::stub_cal_por(objid_.id(), calptn, msg, cmsgsz);
00197 return handle_error(ercd);
00198 }
00200 ER_UINT call(RDVPTN calptn, void* msg, UINT cmsgsz, TMO tmout) const
00201 {
00202 ER_UINT ercd = Stub::stub_tcal_por(objid_.id(), calptn, msg, cmsgsz, tmout);
00203 return handle_error(ercd);
00204 }
00205
00207 template <class Diagnostics2, class Stub2>
00208 ER_UINT accept(RDVPTN acpptn, rendezvous<Diagnostics2, Stub2>& rdvobj, void* msg, forever_tag = forever) const
00209 {
00210 RDVNO rdvno;
00211 ER_UINT ercd = Stub::stub_acp_por(objid_.id(), acpptn, &rdvno, msg);
00212 rdvobj.attach(rdvno);
00213 return handle_error(ercd);
00214 }
00216 template <class Diagnostics2, class Stub2>
00217 ER_UINT accept(RDVPTN acpptn, rendezvous<Diagnostics2, Stub2>& rdvobj, void* msg, polling_tag) const
00218 {
00219 RDVNO rdvno;
00220 ER_UINT ercd = Stub::stub_pacp_por(objid_.id(), acpptn, &rdvno, msg);
00221 rdvobj.attach(rdvno);
00222 return handle_error(ercd);
00223 }
00225 template <class Diagnostics2, class Stub2>
00226 ER_UINT accept(RDVPTN acpptn, rendezvous<Diagnostics2, Stub2>& rdvobj, void* msg, TMO tmout) const
00227 {
00228 RDVNO rdvno;
00229 ER_UINT ercd = Stub::stub_tacp_por(objid_.id(), acpptn, &rdvno, msg, tmout);
00230 rdvobj.attach(rdvno);
00231 return handle_error(ercd);
00232 }
00233
00235 template <class Diagnostics2, class Stub2>
00236 ER forward(RDVPTN calptn, const rendezvous<Diagnostics2, Stub2>& rdvobj, const void* msg, UINT cmsgsz) const
00237 {
00238 ER ercd = Stub::stub_fwd_por(objid_.id(), calptn, rdvobj.no(), msg, cmsgsz);
00239 return handle_error(ercd);
00240 }
00241
00243
00245 friend ID get_unsafe_id(const rendezvousport<Id, Diagnostics, Stub>& obj)
00246 {
00247 return obj.objid_.id();
00248 }
00249 private:
00250
00251 ER_UINT call(RDVPTN calptn, void* msg, UINT cmsgsz, polling_tag) const;
00252 };
00253
00254 }
00255
00256 #endif // ! TOPPERS_RENDEZVOUS_HPP_