SpHelper.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  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. #else
  97. SpBuffer& operator &(CSimpleString16Bit&);
  98. SpBuffer& operator &(CAutoArray<CSimpleString16Bit>&);
  99. SpBuffer& operator &(const CSimpleString16Bit&);
  100. SpBuffer& operator &(const CAutoArray<CSimpleString16Bit>&);
  101. #endif //_WIN32
  102. // use for write
  103. CAutoBuffer ToBuffer();
  104. CBlob ToBlob();
  105. private:
  106. int m_iMode;
  107. iobuffer_t *m_pInternalBuf;
  108. };
  109. // helper for convert CAutoBuffer to T object, T must has Serialize method
  110. template<class T>
  111. static inline ErrorCodeEnum SpBuffer2Object(CAutoBuffer Buf, T &t)
  112. {
  113. ErrorCodeEnum Error;
  114. SpBuffer spbuf;
  115. if (spbuf.OpenRead((const char*)&Buf[0], Buf.GetCount())) {
  116. t.Serialize(spbuf);
  117. Error = Error_Succeed;
  118. } else {
  119. Error = Error_Bug;
  120. }
  121. return Error;
  122. }
  123. // helper for convert T object to CAutoBuffer, T must has Serialize method
  124. template<class T>
  125. static inline CAutoBuffer SpObject2Buffer(T &t)
  126. {
  127. SpBuffer spbuf;
  128. spbuf.OpenWrite();
  129. t.Serialize(spbuf);
  130. return spbuf.ToBuffer();
  131. }
  132. // helper for wait answer object
  133. template<class T>
  134. //static inline ErrorCodeEnum SpWaitAnswerObject(IAsynWaitSp *pAsyncWait, T &t, bool &bEnd, DWORD dwTimeout = INFINITE)
  135. static inline ErrorCodeEnum SpWaitAnswerObject(const CSmartPointer<IAsynWaitSp> &pAsyncWait, T &t, bool &bEnd, DWORD dwTimeout = INFINITE)
  136. {
  137. //LOG_ASSERT(pAsyncWait);
  138. ErrorCodeEnum Error = pAsyncWait->WaitAnswer(dwTimeout);
  139. if (Error == Error_Succeed) {
  140. CAutoBuffer Buf;
  141. Error = pAsyncWait->AsyncGetAnswer(Buf, bEnd);
  142. if (Error == Error_Succeed) {
  143. Error = SpBuffer2Object(Buf, t);
  144. }
  145. }
  146. else
  147. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SpWaitAnswerObject wait timeout");
  148. return Error;
  149. }
  150. template<class T>
  151. static inline ErrorCodeEnum SpWaitAnswerObject(const CSmartPointer<IAsynWaitSp> &pAsyncWait, T &t, bool &bEnd, DWORD &dwUserError, CSimpleString &str, DWORD dwTimeout)
  152. {
  153. //LOG_ASSERT(pAsyncWait);
  154. ErrorCodeEnum Error = pAsyncWait->WaitAnswer(dwUserError, str, dwTimeout);
  155. if (Error == Error_Succeed) {
  156. CAutoBuffer Buf;
  157. Error = pAsyncWait->AsyncGetAnswer(Buf, bEnd, dwUserError, str);
  158. if (Error == Error_Succeed) {
  159. Error = SpBuffer2Object(Buf, t);
  160. }
  161. }
  162. return Error;
  163. }
  164. template<class TInfo>
  165. struct SpOnewayCallContext
  166. {
  167. typedef CSmartPointer<SpOnewayCallContext<TInfo> > Pointer;
  168. TInfo Info;
  169. linkContext link;
  170. };
  171. template<class TReq, class TAns>
  172. struct SpReqAnsContext
  173. {
  174. typedef CSmartPointer<SpReqAnsContext<TReq, TAns> > Pointer;
  175. SpReqAnsContext(const CSmartPointer<ITransactionContext> &pTransactionContext)
  176. : m_spTransactionContext(pTransactionContext) {}
  177. virtual ~SpReqAnsContext() {}
  178. TReq Req;
  179. TAns Ans;
  180. linkContext link;
  181. virtual ErrorCodeEnum Answer(ErrorCodeEnum Error = Error_Succeed)
  182. {
  183. EntityResource::clearLink();
  184. //static_assert(Error == Error_Succeed, "Input parameter must be Error_Succeed!");
  185. if (Error == Error_Succeed) {
  186. CAutoBuffer Buf = SpObject2Buffer<TAns>(Ans);
  187. return m_spTransactionContext->SendAnswer(Buf, true);
  188. } else {
  189. return m_spTransactionContext->SendAnswer(Error);
  190. }
  191. }
  192. virtual ErrorCodeEnum Answer(ErrorCodeEnum eSysError, DWORD dwUserError)
  193. {
  194. EntityResource::clearLink();
  195. if (eSysError == Error_Succeed) {
  196. CAutoBuffer Buf = SpObject2Buffer<TAns>(Ans);
  197. return m_spTransactionContext->SendAnswer(Buf, true);
  198. }
  199. CSimpleString str = "";
  200. return m_spTransactionContext->SendAnswer(eSysError, dwUserError, str);
  201. }
  202. virtual ErrorCodeEnum Answer(ErrorCodeEnum eSysError, DWORD dwUserError, CSimpleString str)
  203. {
  204. EntityResource::clearLink();
  205. if (eSysError == Error_Succeed) {
  206. CAutoBuffer Buf = SpObject2Buffer<TAns>(Ans);
  207. return m_spTransactionContext->SendAnswer(Buf, true);
  208. }
  209. return m_spTransactionContext->SendAnswer(eSysError, dwUserError, str);
  210. }
  211. DWORD GetRequestId()
  212. {
  213. return m_spTransactionContext->GetRequestID();
  214. }
  215. virtual DWORD GetExpireLeftTime()
  216. {
  217. // this method content is invalid, TODO: get the real ExpireLeftTime. [3/20/2020 17:27 Gifur]
  218. DWORD dwWholeTime = 0;
  219. DWORD dwLeftTime = 0;
  220. m_spTransactionContext->GetExpireTime(dwWholeTime, dwLeftTime);
  221. return dwLeftTime;
  222. }
  223. ErrorCodeEnum GetLinkContext(linkContext& curLink)
  224. {
  225. return m_spTransactionContext->GetLinkContext(curLink);
  226. }
  227. private:
  228. CSmartPointer<ITransactionContext> m_spTransactionContext;
  229. };
  230. template<class TSubReq, class TMsg>
  231. struct SpSubscribeContext
  232. {
  233. typedef CSmartPointer<SpSubscribeContext<TSubReq, TMsg> > Pointer;
  234. SpSubscribeContext(CSmartPointer<ITransactionContext> &spTransactionContext) : m_spTransactionContext(spTransactionContext) {}
  235. TSubReq Req;
  236. ErrorCodeEnum SendMessage(TMsg &msg)
  237. {
  238. CAutoBuffer Buf = SpObject2Buffer<TMsg>(msg);
  239. return m_spTransactionContext->SendAnswer(Buf, false);
  240. }
  241. ErrorCodeEnum EndMessage()
  242. {
  243. return m_spTransactionContext->SendAnswer(Error_Closed);
  244. }
  245. private:
  246. CSmartPointer<ITransactionContext> m_spTransactionContext;
  247. };
  248. // helper for IBroadcastListener
  249. #define SP_BEGIN_MSG_DISPATCH_MAP(cls) \
  250. virtual void OnBroadcastEvent(CUUID SubID, const char *pszEntityName,DWORD dwMessageId, DWORD dwMessageSignature,CAutoBuffer Buffer) \
  251. { \
  252. if (!pszEntityName) \
  253. { \
  254. LOG_TRACE("pszEntityName cannot empty!"); \
  255. }
  256. #define SP_BEGIN_ENTITY_MSG(entity_name) \
  257. else if (_stricmp(entity_name, pszEntityName) == 0) \
  258. { \
  259. switch (dwMessageId) {
  260. #define SP_MSG_HANDLE_NS(ns, msg, OnMsg) \
  261. case eMsg_##msg: \
  262. if (eMsgSig_##msg == dwMessageSignature) { \
  263. ns##::msg t; \
  264. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t); \
  265. if (Error == Error_Succeed) \
  266. OnMsg(pszEntityName, dwMessageId, dwMessageSignature, t); \
  267. } else { \
  268. LOG_TRACE("%s signature mismatched!", #msg); \
  269. } \
  270. break;
  271. // void OnMsg(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, );
  272. #define SP_MSG_HANDLER(msg, OnMsg) \
  273. case eMsg_##msg: \
  274. if (eMsgSig_##msg == dwMessageSignature) { \
  275. msg t; \
  276. ErrorCodeEnum Error = SpBuffer2Object(Buffer, t); \
  277. if (Error == Error_Succeed) \
  278. OnMsg(pszEntityName, dwMessageId, dwMessageSignature, t); \
  279. } else { \
  280. LOG_TRACE("%s signature mismatched!", #msg); \
  281. } \
  282. break;
  283. #define SP_END_ENTITY_MSG() \
  284. default: \
  285. LOG_TRACE("msg id %d ignored!", dwMessageId); \
  286. break; \
  287. } \
  288. }
  289. #define SP_END_MSG_DISPATCH_MAP() \
  290. else \
  291. { \
  292. LOG_TRACE("ignore pszEntityName"); \
  293. } \
  294. }
  295. template<class T>
  296. static ErrorCodeEnum SpSendBroadcast(CSmartPointer<IEntityFunction> pFunc, DWORD dwMessageId, DWORD dwMessageSignature, T &t)
  297. {
  298. CAutoBuffer Buffer = SpObject2Buffer<T>(t);
  299. return pFunc->SendBroadcast(dwMessageId, dwMessageSignature, Buffer);
  300. }
  301. #define SP_MSG_OF(cs) eMsg_##cs
  302. #define SP_MSG_SIG_OF(cs) eMsgSig_##cs
  303. // <class_name>::<function_name>
  304. // ::<function_name>
  305. // <class_name>
  306. SPBASE_API ErrorCodeEnum SpExtractClassFunctionName(const char *pszParam, CSimpleStringA &strClassName, CSimpleStringA &strFunctionName);
  307. //SpBase Enum Stringtify
  308. SPBASE_API LPCTSTR SpStrEntityState(const EntityStateEnum state);
  309. SPBASE_API LPCTSTR SpStrCloseCause(const EntityCloseCauseEnum cause);
  310. SPBASE_API LPCTSTR SpStrRebootTrigger(const RebootTriggerEnum trigger);
  311. SPBASE_API LPCTSTR SpStrRebootWay(const RebootWayEnum way);
  312. SPBASE_API LPCTSTR SpStrAppBootState(const AppBootStateEnum state);
  313. SPBASE_API MachineTypeEnum SpStr2MachineType(const CSimpleStringA& strMachineType);
  314. #define IS_SUCCEED(hr) ((hr) == Error_Succeed)
  315. #define IS_FAILURED(hr) (!(IS_SUCCEED(hr)))
  316. template <class T> inline void SP_UNUSED(T const&)
  317. {
  318. // deprecated: warning C4100
  319. }
  320. #endif // __SP_HELPER_H