SpHelper.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #ifndef __SP_HELPER_H
  2. #define __SP_HELPER_H
  3. #pragma once
  4. #include "ErrorCode.h"
  5. #include "SpBase.h"
  6. #include "Blob.h"
  7. /** provide some helper functions */
  8. class SPBASE_API SpBuffer
  9. {
  10. private:
  11. typedef struct iobuffer_t iobuffer_t;
  12. public:
  13. enum { SUGGEST_BUF_SIZE = 256 };
  14. enum OP_MODE { OP_READ, OP_WRITE };
  15. SpBuffer();
  16. ~SpBuffer();
  17. bool OpenRead(const char *buf, int size);
  18. bool OpenRead(iobuffer_t **iobuf);
  19. bool OpenWrite(int cap = SUGGEST_BUF_SIZE);
  20. void Close();
  21. bool IsRead() { return m_iMode == OP_READ; }
  22. bool IsWrite() { return m_iMode == OP_WRITE; }
  23. void SetCapacity(int cap);
  24. void SetLength(int len);
  25. int GetCapacity();
  26. int GetLength();
  27. SpBuffer & operator &(bool&);
  28. SpBuffer & operator &(ULONGLONG&);
  29. SpBuffer& operator &(LONGLONG&);
  30. SpBuffer & operator &(INT&);
  31. SpBuffer & operator &(SHORT&);
  32. SpBuffer & operator &(CHAR&);
  33. SpBuffer & operator &(DWORD&);
  34. SpBuffer & operator &(WORD&);
  35. SpBuffer & operator &(BYTE&);
  36. SpBuffer & operator &(FLOAT&);
  37. SpBuffer & operator &(DOUBLE&);
  38. SpBuffer & operator &(CSimpleStringA &);
  39. SpBuffer & operator &(CSimpleStringW &);
  40. SpBuffer & operator &(CBlob&);
  41. SpBuffer & operator &(CAutoArray<bool>&);
  42. SpBuffer & operator &(CAutoArray<ULONGLONG>&);
  43. SpBuffer & operator &(CAutoArray<LONGLONG>&);
  44. SpBuffer & operator &(CAutoArray<INT>&);
  45. SpBuffer & operator &(CAutoArray<SHORT>&);
  46. SpBuffer & operator &(CAutoArray<CHAR>&);
  47. SpBuffer & operator &(CAutoArray<DWORD>&);
  48. SpBuffer & operator &(CAutoArray<WORD>&);
  49. SpBuffer & operator &(CAutoArray<BYTE>&);
  50. SpBuffer & operator &(CAutoArray<FLOAT>&);
  51. SpBuffer & operator &(CAutoArray<DOUBLE>&);
  52. SpBuffer & operator &(CAutoArray<CSimpleStringA> &);
  53. SpBuffer & operator &(CAutoArray<CSimpleStringW> &);
  54. SpBuffer & operator &(CAutoArray<CBlob>&);
  55. SpBuffer & operator &(const bool&);
  56. SpBuffer & operator &(const ULONGLONG&);
  57. SpBuffer & operator &(const LONGLONG&);
  58. SpBuffer & operator &(const INT&);
  59. SpBuffer & operator &(const SHORT&);
  60. SpBuffer & operator &(const CHAR&);
  61. SpBuffer & operator &(const DWORD&);
  62. SpBuffer & operator &(const WORD&);
  63. SpBuffer & operator &(const BYTE&);
  64. SpBuffer & operator &(const FLOAT&);
  65. SpBuffer & operator &(const DOUBLE&);
  66. SpBuffer & operator &(const CSimpleStringA &);
  67. SpBuffer & operator &(const CSimpleStringW &);
  68. SpBuffer & operator &(const CBlob&);
  69. SpBuffer & operator &(const CAutoArray<bool>&);
  70. SpBuffer & operator &(const CAutoArray<ULONGLONG>&);
  71. SpBuffer & operator &(const CAutoArray<LONGLONG>&);
  72. SpBuffer & operator &(const CAutoArray<INT>&);
  73. SpBuffer & operator &(const CAutoArray<SHORT>&);
  74. SpBuffer & operator &(const CAutoArray<CHAR>&);
  75. SpBuffer & operator &(const CAutoArray<DWORD>&);
  76. SpBuffer & operator &(const CAutoArray<WORD>&);
  77. SpBuffer & operator &(const CAutoArray<BYTE>&);
  78. SpBuffer & operator &(const CAutoArray<FLOAT>&);
  79. SpBuffer & operator &(const CAutoArray<DOUBLE>&);
  80. SpBuffer & operator &(const CAutoArray<CSimpleStringA> &);
  81. SpBuffer & operator &(const CAutoArray<CSimpleStringW> &);
  82. SpBuffer & operator &(const CAutoArray<CBlob>&);
  83. #ifdef _WIN32
  84. SpBuffer& operator &(LONG&);
  85. SpBuffer& operator &(const LONG&);
  86. SpBuffer& operator &(const CAutoArray<LONG>&);
  87. SpBuffer& operator &(CAutoArray<LONG>&);
  88. SpBuffer& operator &(UINT&);
  89. SpBuffer& operator &(const UINT&);
  90. SpBuffer& operator &(CAutoArray<UINT>&);
  91. SpBuffer& operator &(const CAutoArray<UINT>&);
  92. //SpBuffer& operator &(ULONG&);
  93. //SpBuffer& operator &(CAutoArray<ULONG>&);
  94. //SpBuffer& operator &(const ULONG&);
  95. //SpBuffer& operator &(const CAutoArray<ULONG>&);
  96. #endif //_WIN32
  97. // use for write
  98. CAutoBuffer ToBuffer();
  99. CBlob ToBlob();
  100. private:
  101. int m_iMode;
  102. iobuffer_t *m_pInternalBuf;
  103. };
  104. // helper for convert CAutoBuffer to T object, T must has Serialize method
  105. template<class T>
  106. static inline ErrorCodeEnum SpBuffer2Object(CAutoBuffer Buf, T &t)
  107. {
  108. ErrorCodeEnum Error;
  109. SpBuffer spbuf;
  110. if (spbuf.OpenRead((const char*)&Buf[0], Buf.GetCount())) {
  111. t.Serialize(spbuf);
  112. Error = Error_Succeed;
  113. } else {
  114. Error = Error_Bug;
  115. }
  116. return Error;
  117. }
  118. // helper for convert T object to CAutoBuffer, T must has Serialize method
  119. template<class T>
  120. static inline CAutoBuffer SpObject2Buffer(T &t)
  121. {
  122. SpBuffer spbuf;
  123. spbuf.OpenWrite();
  124. t.Serialize(spbuf);
  125. return spbuf.ToBuffer();
  126. }
  127. // helper for wait answer object
  128. template<class T>
  129. //static inline ErrorCodeEnum SpWaitAnswerObject(IAsynWaitSp *pAsyncWait, T &t, bool &bEnd, DWORD dwTimeout = INFINITE)
  130. static inline ErrorCodeEnum SpWaitAnswerObject(const CSmartPointer<IAsynWaitSp> &pAsyncWait, T &t, bool &bEnd, DWORD dwTimeout = INFINITE)
  131. {
  132. //LOG_ASSERT(pAsyncWait);
  133. ErrorCodeEnum Error = pAsyncWait->WaitAnswer(dwTimeout);
  134. if (Error == Error_Succeed) {
  135. CAutoBuffer Buf;
  136. Error = pAsyncWait->AsyncGetAnswer(Buf, bEnd);
  137. if (Error == Error_Succeed) {
  138. Error = SpBuffer2Object(Buf, t);
  139. }
  140. }
  141. else
  142. Dbg("SpWaitAnswerObject wait timeout");
  143. return Error;
  144. }
  145. template<class T>
  146. static inline ErrorCodeEnum SpWaitAnswerObject(const CSmartPointer<IAsynWaitSp> &pAsyncWait, T &t, bool &bEnd, DWORD &dwUserError, DWORD dwTimeout)
  147. {
  148. //LOG_ASSERT(pAsyncWait);
  149. ErrorCodeEnum Error = pAsyncWait->WaitAnswer(dwUserError, dwTimeout);
  150. if (Error == Error_Succeed) {
  151. CAutoBuffer Buf;
  152. Error = pAsyncWait->AsyncGetAnswer(Buf, bEnd, dwUserError);
  153. if (Error == Error_Succeed) {
  154. Error = SpBuffer2Object(Buf, t);
  155. }
  156. }
  157. return Error;
  158. }
  159. template<class TInfo>
  160. struct SpOnewayCallContext
  161. {
  162. typedef CSmartPointer<SpOnewayCallContext<TInfo> > Pointer;
  163. TInfo Info;
  164. };
  165. template<class TReq, class TAns>
  166. struct SpReqAnsContext
  167. {
  168. typedef CSmartPointer<SpReqAnsContext<TReq, TAns> > Pointer;
  169. SpReqAnsContext(CSmartPointer<ITransactionContext> &pTransactionContext)
  170. : m_spTransactionContext(pTransactionContext) {}
  171. virtual ~SpReqAnsContext() {}
  172. TReq Req;
  173. TAns Ans;
  174. virtual ErrorCodeEnum Answer(ErrorCodeEnum Error = Error_Succeed)
  175. {
  176. if (Error == Error_Succeed) {
  177. CAutoBuffer Buf = SpObject2Buffer<TAns>(Ans);
  178. return m_spTransactionContext->SendAnswer(Buf, true);
  179. } else {
  180. return m_spTransactionContext->SendAnswer(Error);
  181. }
  182. }
  183. virtual ErrorCodeEnum Answer(ErrorCodeEnum eSysError, DWORD dwUserError)
  184. {
  185. if (eSysError == Error_Succeed) {
  186. CAutoBuffer Buf = SpObject2Buffer<TAns>(Ans);
  187. return m_spTransactionContext->SendAnswer(Buf, true);
  188. }
  189. return m_spTransactionContext->SendAnswer(eSysError, dwUserError);
  190. }
  191. DWORD GetRequestId()
  192. {
  193. return m_spTransactionContext->GetRequestID();
  194. }
  195. virtual DWORD GetExpireLeftTime()
  196. {
  197. // this method content is invalid, TODO: get the real ExpireLeftTime. [3/20/2020 17:27 Gifur]
  198. DWORD dwWholeTime = 0;
  199. DWORD dwLeftTime = 0;
  200. m_spTransactionContext->GetExpireTime(dwWholeTime, dwLeftTime);
  201. return dwLeftTime;
  202. }
  203. private:
  204. CSmartPointer<ITransactionContext> m_spTransactionContext;
  205. };
  206. template<class TSubReq, class TMsg>
  207. struct SpSubscribeContext
  208. {
  209. typedef CSmartPointer<SpSubscribeContext<TSubReq, TMsg> > Pointer;
  210. SpSubscribeContext(CSmartPointer<ITransactionContext> &spTransactionContext) : m_spTransactionContext(spTransactionContext) {}
  211. TSubReq Req;
  212. ErrorCodeEnum SendMessage(TMsg &msg)
  213. {
  214. CAutoBuffer Buf = SpObject2Buffer<TMsg>(msg);
  215. return m_spTransactionContext->SendAnswer(Buf, false);
  216. }
  217. ErrorCodeEnum EndMessage()
  218. {
  219. return m_spTransactionContext->SendAnswer(Error_Closed);
  220. }
  221. private:
  222. CSmartPointer<ITransactionContext> m_spTransactionContext;
  223. };
  224. // helper for IBroadcastListener
  225. #define SP_BEGIN_MSG_DISPATCH_MAP(cls) \
  226. virtual void OnBroadcastEvent(CUUID SubID, const char *pszEntityName,DWORD dwMessageId, DWORD dwMessageSignature,CAutoBuffer Buffer) \
  227. { \
  228. if (!pszEntityName) \
  229. { \
  230. LOG_TRACE("pszEntityName cannot empty!"); \
  231. }
  232. #define SP_BEGIN_ENTITY_MSG(entity_name) \
  233. else if (_stricmp(entity_name, pszEntityName) == 0) \
  234. { \
  235. switch (dwMessageId) {
  236. #define SP_MSG_HANDLE_NS(ns, msg, OnMsg) \
  237. case eMsg_##msg: \
  238. if (eMsgSig_##msg == dwMessageSignature) { \
  239. ns##::msg t; \
  240. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t); \
  241. if (Error == Error_Succeed) \
  242. OnMsg(pszEntityName, dwMessageId, dwMessageSignature, t); \
  243. } else { \
  244. LOG_TRACE("%s signature mismatched!", #msg); \
  245. } \
  246. break;
  247. // void OnMsg(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, );
  248. #define SP_MSG_HANDLER(msg, OnMsg) \
  249. case eMsg_##msg: \
  250. if (eMsgSig_##msg == dwMessageSignature) { \
  251. msg t; \
  252. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t); \
  253. if (Error == Error_Succeed) \
  254. OnMsg(pszEntityName, dwMessageId, dwMessageSignature, t); \
  255. } else { \
  256. LOG_TRACE("%s signature mismatched!", #msg); \
  257. } \
  258. break;
  259. #define SP_END_ENTITY_MSG() \
  260. default: \
  261. LOG_TRACE("msg id %d ignored!", dwMessageId); \
  262. break; \
  263. } \
  264. }
  265. #define SP_END_MSG_DISPATCH_MAP() \
  266. else \
  267. { \
  268. LOG_TRACE("ignore pszEntityName"); \
  269. } \
  270. }
  271. template<class T>
  272. static ErrorCodeEnum SpSendBroadcast(CSmartPointer<IEntityFunction> pFunc, DWORD dwMessageId, DWORD dwMessageSignature, T &t)
  273. {
  274. CAutoBuffer Buffer = SpObject2Buffer<T>(t);
  275. return pFunc->SendBroadcast(dwMessageId, dwMessageSignature, Buffer);
  276. }
  277. #define SP_MSG_OF(cs) eMsg_##cs
  278. #define SP_MSG_SIG_OF(cs) eMsgSig_##cs
  279. // <class_name>::<function_name>
  280. // ::<function_name>
  281. // <class_name>
  282. SPBASE_API ErrorCodeEnum SpExtractClassFunctionName(const char *pszParam, CSimpleStringA &strClassName, CSimpleStringA &strFunctionName);
  283. //SpBase Enum Stringtify
  284. SPBASE_API LPCTSTR SpStrEntityState(const EntityStateEnum state);
  285. SPBASE_API LPCTSTR SpStrCloseCause(const EntityCloseCauseEnum cause);
  286. SPBASE_API LPCTSTR SpStrRebootTrigger(const RebootTriggerEnum trigger);
  287. SPBASE_API LPCTSTR SpStrRebootWay(const RebootWayEnum way);
  288. SPBASE_API LPCTSTR SpStrFrameworkState(const FrameworkStateEnum state);
  289. #define IS_SUCCEED(hr) ((hr) == Error_Succeed)
  290. #define IS_FAILURED(hr) (!(IS_SUCCEED(hr)))
  291. #endif // __SP_HELPER_H