00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _T_CALLBACK_HH_
00011 #define _T_CALLBACK_HH_
00012
00013 #include <rtworks/types.h>
00014 #include <rtworks/tex.h>
00015
00016
00017
00018 namespace SmartSockets {
00019
00020 class T_IPCX_API TipcConn;
00021 class T_IPCX_API TipcMsg;
00022 class T_IPCX_API TipcSrv;
00023
00024
00031 class T_IPCX_CB_API CallBackException : public Exception
00032 {
00033 public:
00037 CallBackException() {}
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00052 virtual ~CallBackException() throw()
00053 {
00054 }
00055 };
00056
00057
00065 template <class Implementor>
00066 class T_IPCX_CB_API CallBack
00067 {
00068 friend class T_IPCX_API TipcSrv;
00069 friend class T_IPCX_API TipcConn;
00070 friend class T_IPCX_API Option;
00071
00072 public:
00073
00080 void destroy() throw (CallBackException)
00081 {
00082 if (is_created())
00083 {
00084 if (!TutCbDestroy(m_cb))
00085 {
00086 throw CallBackException();
00087 }
00088
00089 m_cb = 0;
00090 }
00091
00092 delete this;
00093 }
00094
00095
00101 bool is_created() throw ()
00102 {
00103 return 0 != m_cb;
00104 }
00105
00106
00112 operator T_CB () throw ()
00113 {
00114 return m_cb;
00115 }
00116
00117
00123 void * getArgument () const throw ()
00124 {
00125 return m_argument;
00126 }
00127
00128
00134 void setArgument (void* data) throw ()
00135 {
00136 m_argument = data;
00137 }
00138
00139
00145 T_CB_PRIORITY getPriority () const throw (CallBackException)
00146 {
00147 T_CB_PRIORITY result;
00148
00149 if (!TutCbGetPriority (m_cb, &result))
00150 {
00151 throw CallBackException ();
00152 }
00153
00154 return result;
00155 }
00156
00157
00163 void setPriority (T_CB_PRIORITY priority) throw (CallBackException)
00164 {
00165 if (!TutCbSetPriority (m_cb, priority))
00166 {
00167 throw CallBackException ();
00168 }
00169 }
00170
00171
00177 virtual bool print (T_OUT_FUNC func = (T_OUT_FUNC)TutOut)
00178 throw (CallBackException)
00179 {
00180 TutCbPrint(m_cb, func);
00181 return T_TRUE;
00182 }
00183
00184 protected:
00185
00186
00187
00188 T_CB m_cb;
00189
00190
00191
00192
00193 Implementor * m_implementor;
00194
00195
00196
00197
00198 typename Implementor::Handler m_handler;
00199
00200
00201
00202
00203 void * m_argument;
00204
00205
00211 void setTCB (T_CB handle)
00212 {
00213 m_cb = handle;
00214 }
00215
00216 private:
00223 CallBack (Implementor * implementor,
00224 typename Implementor::Handler handler)
00225 : m_cb (0)
00226 , m_implementor (implementor)
00227 , m_handler (handler)
00228 , m_argument(0)
00229 {
00230 }
00231
00235 virtual ~CallBack () throw()
00236 {
00237 }
00238
00244 CallBack (const CallBack & callback)
00245 {
00246 }
00247 };
00248
00249
00256 class T_IPCX_CB_API ConnectionCallBack
00257 {
00258 public:
00259 enum ConnStatus
00260 {
00261 none,
00262 warm,
00263 full
00264 };
00265
00266 typedef void (ConnectionCallBack::* Handler) (
00267 CallBack < ConnectionCallBack > * callBack,
00268 TipcSrv & connection,
00269 ConnStatus oldConnStatus,
00270 ConnStatus newConnStatus);
00271
00275 ConnectionCallBack () {}
00276
00280 virtual ~ConnectionCallBack () throw() {}
00281
00282
00292 virtual void onConnection (
00293 CallBack < ConnectionCallBack > * callBack,
00294 TipcSrv & connection,
00295 ConnStatus oldConnStatus,
00296 ConnStatus newConnStatus);
00297
00298 };
00299
00300
00308 class T_IPCX_CB_API MessageCallBack
00309 {
00310 public:
00311 typedef void (MessageCallBack::* Handler) (
00312 CallBack <MessageCallBack> * callBack,
00313 TipcMsg & message,
00314 TipcConn & connection);
00315
00319 MessageCallBack () {}
00320
00321
00325 virtual ~MessageCallBack () throw() {}
00326
00327
00336 virtual void onMessage (CallBack<MessageCallBack>* callback,
00337 TipcMsg & msg,
00338 TipcConn & conn);
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 };
00352
00353
00360 class T_IPCX_CB_API ErrorCallBack
00361 {
00362 public:
00363 typedef void (ErrorCallBack::* Handler) (
00364 CallBack < ErrorCallBack > * callBack,
00365 Exception & error,
00366 TipcConn & conn);
00367
00368
00372 ErrorCallBack() {}
00373
00374
00378 virtual ~ErrorCallBack() throw() {}
00379
00380
00389 virtual void onError (
00390 CallBack <ErrorCallBack> * callBack,
00391 Exception & error,
00392 TipcConn & conn);
00393 };
00394
00395
00402 class T_IPCX_CB_API MessageQueueCallBack
00403 {
00404 public:
00405 typedef void (MessageQueueCallBack::* Handler) (
00406 CallBack <MessageQueueCallBack> * callBack,
00407 TipcMsg & message,
00408 TipcConn & connection,
00409 uint4 queuePos,
00410 bool is_insert);
00411
00415 MessageQueueCallBack() {}
00416
00420 virtual ~MessageQueueCallBack () throw() {}
00421
00433 virtual void onMessage (CallBack <MessageQueueCallBack> * callBack,
00434 TipcMsg & message,
00435 TipcConn & connection,
00436 uint4 queuePos,
00437 bool is_insert);
00438 };
00439
00440
00441
00448 class T_IPCX_CB_API EncodeCallBack
00449 {
00450 public:
00451 typedef void (EncodeCallBack::* Handler) (
00452 CallBack <EncodeCallBack> * callBack,
00453 void * packet,
00454 int4 packetSize,
00455 void * origPacket,
00456 int4 origPacketSize,
00457 TipcMsg & origMessage,
00458 TipcConn & connection);
00459
00463 EncodeCallBack() {};
00464
00468 virtual ~EncodeCallBack () throw() {}
00469
00484 virtual void onMessage (CallBack <EncodeCallBack> * callBack,
00485 void * packet,
00486 int4 packetSize,
00487 void * origPacket,
00488 int4 origPacketSize,
00489 TipcMsg & origMessage,
00490 TipcConn & connection);
00491 };
00492
00493
00494
00501 class T_IPCX_CB_API DecodeCallBack
00502 {
00503 public:
00504 typedef void (DecodeCallBack::* Handler) (
00505 CallBack < DecodeCallBack > * callBack,
00506 void * packet,
00507 int4 packetSize,
00508 void * origPacket,
00509 int4 origPacketSize,
00510 TipcConn & connection);
00511
00515 DecodeCallBack() {};
00516
00520 virtual ~DecodeCallBack () throw() {};
00521
00533 virtual void onMessage (CallBack <DecodeCallBack> * callBack,
00534 void * packet,
00535 int4 packetSize,
00536 void * origPacket,
00537 int4 origPacketSize,
00538 TipcConn & connection);
00539 };
00540
00541 }
00542 #endif