PinPad_common.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #ifndef __PINPAD_COMMON_H
  2. #define __PINPAD_COMMON_H
  3. #include "SpHelper.h"
  4. namespace PinPad {
  5. //
  6. // const goes here
  7. //
  8. #define PinPadService_Method_GetInput 0
  9. #define PinPadService_Method_SetAccount 1
  10. #define PinPadService_Method_GetDevInfo 65535
  11. #define PinPadService_MethodSignature_GetInput -635247245
  12. #define PinPadService_MethodSignature_SetAccount -2048164506
  13. #define PinPadService_MethodSignature_GetDevInfo 296205965
  14. struct PinPadService_GetInput_Req
  15. {
  16. int timeout;
  17. int length;
  18. bool encrypt;
  19. bool confirm;
  20. void Serialize(SpBuffer &Buf)
  21. {
  22. Buf & timeout & length & encrypt & confirm;
  23. }
  24. };
  25. struct PinPadService_GetInput_Ans
  26. {
  27. CBlob data;
  28. bool enter;
  29. void Serialize(SpBuffer &Buf)
  30. {
  31. Buf & data & enter;
  32. }
  33. };
  34. struct PinPadService_SetAccount_Req
  35. {
  36. CSimpleStringA account;
  37. void Serialize(SpBuffer &Buf)
  38. {
  39. Buf & account;
  40. }
  41. };
  42. struct PinPadService_SetAccount_Ans
  43. {
  44. void Serialize(SpBuffer &Buf)
  45. {
  46. }
  47. };
  48. struct PinPadService_GetDevInfo_Req
  49. {
  50. void Serialize(SpBuffer &Buf)
  51. {
  52. }
  53. };
  54. struct PinPadService_GetDevInfo_Ans
  55. {
  56. CSimpleStringA type;
  57. CSimpleStringA model;
  58. CSimpleStringA version;
  59. int state;
  60. void Serialize(SpBuffer &Buf)
  61. {
  62. Buf & type & model & version & state;
  63. }
  64. };
  65. #define eMsg_InputContent 0
  66. #define eMsgSig_InputContent 384023927
  67. struct InputContent
  68. {
  69. CBlob data;
  70. void Serialize(SpBuffer &Buf)
  71. {
  72. Buf & data;
  73. }
  74. };
  75. class PinPadService_ServerSessionBase : public CServerSessionBase
  76. {
  77. public:
  78. PinPadService_ServerSessionBase() { }
  79. virtual ~PinPadService_ServerSessionBase() { }
  80. virtual bool IsExclusive() { return false; }
  81. virtual bool IsSessionOverlap() { return true; }
  82. virtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool &bOverlap)
  83. {
  84. ErrorCodeEnum Error = Error_Succeed;
  85. switch (dwMessageID) {
  86. case PinPadService_Method_GetInput:
  87. if (dwSignature == PinPadService_MethodSignature_GetInput) {
  88. bOverlap = true;
  89. } else {
  90. Error = Error_MethodSignatureFailed;
  91. }
  92. break;
  93. case PinPadService_Method_SetAccount:
  94. if (dwSignature == PinPadService_MethodSignature_SetAccount) {
  95. bOverlap = true;
  96. } else {
  97. Error = Error_MethodSignatureFailed;
  98. }
  99. break;
  100. case PinPadService_Method_GetDevInfo:
  101. if (dwSignature == PinPadService_MethodSignature_GetDevInfo) {
  102. bOverlap = true;
  103. } else {
  104. Error = Error_MethodSignatureFailed;
  105. }
  106. break;
  107. default:
  108. Error = Error_MethodNotFound;
  109. break;
  110. }
  111. return Error;
  112. }
  113. int CheckMessageSignature(DWORD dwMessageID, DWORD dwSignature)
  114. {
  115. ErrorCodeEnum Error = Error_Succeed;
  116. switch (dwMessageID) {
  117. case PinPadService_Method_GetInput:
  118. if (dwSignature != PinPadService_MethodSignature_GetInput) {
  119. Error = Error_MethodSignatureFailed;
  120. }
  121. break;
  122. case PinPadService_Method_SetAccount:
  123. if (dwSignature != PinPadService_MethodSignature_SetAccount) {
  124. Error = Error_MethodSignatureFailed;
  125. }
  126. break;
  127. case PinPadService_Method_GetDevInfo:
  128. if (dwSignature != PinPadService_MethodSignature_GetDevInfo) {
  129. Error = Error_MethodSignatureFailed;
  130. }
  131. break;
  132. default:
  133. Error = Error_MethodNotFound;
  134. break;
  135. }
  136. return Error;
  137. }
  138. virtual void Handle_GetInput(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx)
  139. {
  140. /// override by user
  141. }
  142. virtual void Handle_SetAccount(SpReqAnsContext<PinPadService_SetAccount_Req, PinPadService_SetAccount_Ans>::Pointer ctx)
  143. {
  144. /// override by user
  145. }
  146. virtual void Handle_GetDevInfo(SpReqAnsContext<PinPadService_GetDevInfo_Req, PinPadService_GetDevInfo_Ans>::Pointer ctx)
  147. {
  148. /// override by user
  149. }
  150. virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
  151. {
  152. CAutoBuffer Buf;
  153. DWORD dwMessageID;
  154. DWORD dwMessageSignature;
  155. ErrorCodeEnum Error = pTransactionContext->GetReceiveBuffer(dwMessageID, dwMessageSignature, Buf);
  156. if (Error == Error_Succeed) {
  157. #ifdef DEBUG
  158. assert(CheckMessageSignature(dwMessageID, dwMessageSignature) == Error_Succeed);
  159. #else
  160. if (CheckMessageSignature(dwMessageID, dwMessageSignature) != Error_Succeed) {
  161. pTransactionContext->SendAnswer(Error_MethodSignatureFailed);
  162. return;
  163. }
  164. #endif
  165. switch (dwMessageID) {
  166. case PinPadService_Method_GetInput:
  167. {
  168. SpReqAnsContext<PinPadService_GetInput_Req,PinPadService_GetInput_Ans>::Pointer ctx;
  169. ctx.Attach(new SpReqAnsContext<PinPadService_GetInput_Req,PinPadService_GetInput_Ans>(pTransactionContext));
  170. SpBuffer2Object(Buf, ctx->Req);
  171. Handle_GetInput(ctx);
  172. }
  173. break;
  174. case PinPadService_Method_SetAccount:
  175. {
  176. SpReqAnsContext<PinPadService_SetAccount_Req,PinPadService_SetAccount_Ans>::Pointer ctx;
  177. ctx.Attach(new SpReqAnsContext<PinPadService_SetAccount_Req,PinPadService_SetAccount_Ans>(pTransactionContext));
  178. SpBuffer2Object(Buf, ctx->Req);
  179. Handle_SetAccount(ctx);
  180. }
  181. break;
  182. case PinPadService_Method_GetDevInfo:
  183. {
  184. SpReqAnsContext<PinPadService_GetDevInfo_Req,PinPadService_GetDevInfo_Ans>::Pointer ctx;
  185. ctx.Attach(new SpReqAnsContext<PinPadService_GetDevInfo_Req,PinPadService_GetDevInfo_Ans>(pTransactionContext));
  186. SpBuffer2Object(Buf, ctx->Req);
  187. Handle_GetDevInfo(ctx);
  188. }
  189. break;
  190. default:
  191. assert(0);
  192. break;
  193. }
  194. } else {
  195. pTransactionContext->SendAnswer(Error);
  196. }
  197. }
  198. };
  199. ///////////////////////////
  200. } // namespace PinPad
  201. #endif //__PINPAD_COMMON_H