#ifndef __PINPAD_COMMON_H #define __PINPAD_COMMON_H #include "SpHelper.h" namespace PinPad { // // const goes here // #define PinPadService_Method_GetInput 0 #define PinPadService_Method_SetAccount 1 #define PinPadService_Method_GetDevInfo 65535 #define PinPadService_MethodSignature_GetInput -635247245 #define PinPadService_MethodSignature_SetAccount -2048164506 #define PinPadService_MethodSignature_GetDevInfo 296205965 struct PinPadService_GetInput_Req { int timeout; int length; bool encrypt; bool confirm; void Serialize(SpBuffer &Buf) { Buf & timeout & length & encrypt & confirm; } }; struct PinPadService_GetInput_Ans { CBlob data; bool enter; void Serialize(SpBuffer &Buf) { Buf & data & enter; } }; struct PinPadService_SetAccount_Req { CSimpleStringA account; void Serialize(SpBuffer &Buf) { Buf & account; } }; struct PinPadService_SetAccount_Ans { void Serialize(SpBuffer &Buf) { } }; struct PinPadService_GetDevInfo_Req { void Serialize(SpBuffer &Buf) { } }; struct PinPadService_GetDevInfo_Ans { CSimpleStringA type; CSimpleStringA model; CSimpleStringA version; int state; void Serialize(SpBuffer &Buf) { Buf & type & model & version & state; } }; #define eMsg_InputContent 0 #define eMsgSig_InputContent 384023927 struct InputContent { CBlob data; void Serialize(SpBuffer &Buf) { Buf & data; } }; class PinPadService_ServerSessionBase : public CServerSessionBase { public: PinPadService_ServerSessionBase() { } virtual ~PinPadService_ServerSessionBase() { } virtual bool IsExclusive() { return false; } virtual bool IsSessionOverlap() { return true; } virtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool &bOverlap) { ErrorCodeEnum Error = Error_Succeed; switch (dwMessageID) { case PinPadService_Method_GetInput: if (dwSignature == PinPadService_MethodSignature_GetInput) { bOverlap = true; } else { Error = Error_MethodSignatureFailed; } break; case PinPadService_Method_SetAccount: if (dwSignature == PinPadService_MethodSignature_SetAccount) { bOverlap = true; } else { Error = Error_MethodSignatureFailed; } break; case PinPadService_Method_GetDevInfo: if (dwSignature == PinPadService_MethodSignature_GetDevInfo) { bOverlap = true; } else { Error = Error_MethodSignatureFailed; } break; default: Error = Error_MethodNotFound; break; } return Error; } int CheckMessageSignature(DWORD dwMessageID, DWORD dwSignature) { ErrorCodeEnum Error = Error_Succeed; switch (dwMessageID) { case PinPadService_Method_GetInput: if (dwSignature != PinPadService_MethodSignature_GetInput) { Error = Error_MethodSignatureFailed; } break; case PinPadService_Method_SetAccount: if (dwSignature != PinPadService_MethodSignature_SetAccount) { Error = Error_MethodSignatureFailed; } break; case PinPadService_Method_GetDevInfo: if (dwSignature != PinPadService_MethodSignature_GetDevInfo) { Error = Error_MethodSignatureFailed; } break; default: Error = Error_MethodNotFound; break; } return Error; } virtual void Handle_GetInput(SpReqAnsContext::Pointer ctx) { /// override by user } virtual void Handle_SetAccount(SpReqAnsContext::Pointer ctx) { /// override by user } virtual void Handle_GetDevInfo(SpReqAnsContext::Pointer ctx) { /// override by user } virtual void OnRequest(CSmartPointer pTransactionContext) { CAutoBuffer Buf; DWORD dwMessageID; DWORD dwMessageSignature; ErrorCodeEnum Error = pTransactionContext->GetReceiveBuffer(dwMessageID, dwMessageSignature, Buf); if (Error == Error_Succeed) { #ifdef DEBUG assert(CheckMessageSignature(dwMessageID, dwMessageSignature) == Error_Succeed); #else if (CheckMessageSignature(dwMessageID, dwMessageSignature) != Error_Succeed) { pTransactionContext->SendAnswer(Error_MethodSignatureFailed); return; } #endif switch (dwMessageID) { case PinPadService_Method_GetInput: { SpReqAnsContext::Pointer ctx; ctx.Attach(new SpReqAnsContext(pTransactionContext)); SpBuffer2Object(Buf, ctx->Req); Handle_GetInput(ctx); } break; case PinPadService_Method_SetAccount: { SpReqAnsContext::Pointer ctx; ctx.Attach(new SpReqAnsContext(pTransactionContext)); SpBuffer2Object(Buf, ctx->Req); Handle_SetAccount(ctx); } break; case PinPadService_Method_GetDevInfo: { SpReqAnsContext::Pointer ctx; ctx.Attach(new SpReqAnsContext(pTransactionContext)); SpBuffer2Object(Buf, ctx->Req); Handle_GetDevInfo(ctx); } break; default: assert(0); break; } } else { pTransactionContext->SendAnswer(Error); } } }; /////////////////////////// } // namespace PinPad #endif //__PINPAD_COMMON_H