#include "CardSwiper_server_g.h" #include "CardSwiper_def_g.h" #include "CardSwiperClass.h" #include "CardSwiperFSM.h" #include "DevEntityCommBase.hpp" using namespace CardSwiper; class CCardSwiperEntity; class CardSwiperServerSession : public CardSwiperService_ServerSessionBase { public: CardSwiperServerSession(CCardSwiperEntity* pEntity):m_pEntity(pEntity){} virtual ~CardSwiperServerSession(){} virtual void Handle_Read(SpReqAnsContext::Pointer ctx); virtual void Handle_PreOnline(SpReqAnsContext::Pointer ctx); virtual void Handle_PostOnline(SpReqAnsContext::Pointer ctx); virtual void Handle_Exit(SpOnewayCallContext::Pointer ctx); virtual void Handle_GetDevInfo(SpReqAnsContext::Pointer ctx); virtual void Handle_CancelInsert(SpOnewayCallContext::Pointer ctx); virtual void Handle_Eject(SpReqAnsContext::Pointer ctx); virtual void Handle_QueryCardInfo(SpReqAnsContext::Pointer ctx); virtual void Handle_QueryConnInfo(SpReqAnsContext::Pointer ctx); virtual void Handle_InsertWaitMore(SpOnewayCallContext::Pointer ctx); virtual void Handle_QueryFWBList(SpReqAnsContext::Pointer ctx); virtual void Handle_BindFWB(SpReqAnsContext::Pointer ctx); private: CCardSwiperEntity* m_pEntity; }; class CCardSwiperEntity : public CDevAdptEntityBase,public ILogListener, public ISysVarListener { public: CCardSwiperEntity() { bInitialized = false; } virtual ~CCardSwiperEntity(){} virtual const char *GetEntityName() const { return "CardSwiper"; } virtual void OnPreStart(CAutoArray strArgs,CSmartPointer pTransactionContext) { LOG_FUNCTION(); //MessageBoxA(0,0,0,0); ErrorCodeEnum eStart = m_fsm.Init(this); GetFunction()->SubscribeLog(m_uuidAccessAuth, this, Log_Error, Severity_Middle, Error_IgnoreAll, -1, "AccessAuthorization"); GetFunction()->SubscribeLog(m_uuidAccessAuth, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "AccessAuthorization"); GetFunction()->RegistSysVarEvent("UIState", this); pTransactionContext->SendAnswer(eStart); } virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnStart(Error_Succeed); pTransactionContext->SendAnswer(Error); } virtual void OnPrePause(CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnPause(Error_Succeed); pTransactionContext->SendAnswer(Error); } virtual ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError) { return Error_Succeed; } virtual ErrorCodeEnum __OnPause(ErrorCodeEnum preOperationError) { m_fsm.QueryFWBList(NULL, 2);//oiltest return Error_Succeed; } virtual ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError) { return Error_Succeed; } virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer pTransactionContext) { m_fsm.SelfTest(eTestType,pTransactionContext); } virtual CServerSessionBase* OnNewSession(const char*,const char*) { return new CardSwiperServerSession(this); } void Init() { LOG_FUNCTION(); if (CreateDevComponent((DeviceBaseClass *&)m_pCardIss) != Error_Succeed) { DbgWarn("创建cardiss设备模块失败"); return; } bInitialized = true; } void Read(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) { ctx->Answer(Error_DevNotAvailable, CardSwiper_UserErrorCode_Read_OpenFailed); LogWarn(Severity_Middle, Error_DevNotAvailable, CardSwiper_UserErrorCode_Read_OpenFailed, "ReadCard but DevOpen failed."); } else if (m_fsm.GetCurrState()->id == 7) { ctx->Answer(Error_DevNotAvailable, CardSwiper_UserErrorCode_Read_DeviceOff); LogWarn(Severity_Middle, Error_DevNotAvailable, CardSwiper_UserErrorCode_Read_DeviceOff, "ReadCard but device is offline."); } else{ m_fsm.SetAcceptWaitMore(false); CardReadEvent* e = new CardReadEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } } void PreOnline(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); if (!m_fsm.GetDevInitFlag()) { ctx->Answer(Error_DevNotAvailable, CardSwiper_UserErrorCode_PreOnline_OpenFailed); LogWarn(Severity_Middle, Error_DevNotAvailable, CardSwiper_UserErrorCode_PreOnline_OpenFailed, "PreOnline but DevOpen failed."); } else if (m_fsm.GetCurrState()->id == 7) { ctx->Answer(Error_DevNotAvailable, CardSwiper_UserErrorCode_PreOnline_DeviceOff); LogWarn(Severity_Middle, Error_DevNotAvailable, CardSwiper_UserErrorCode_PreOnline_DeviceOff, "PreOnline but device is offline."); } else{ PreOnlineEvent* e = new PreOnlineEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } } void PostOnline(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); PostOnlineEvent* e = new PostOnlineEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } void Exit(SpOnewayCallContext::Pointer ctx) { //LOG_FUNCTION(); FSMEvent *evt = new FSMEvent(USER_EVT_EXIT); m_fsm.PostEventFIFO(evt); } void CancelInsert(SpOnewayCallContext::Pointer ctx) { m_fsm.SetAcceptWaitMore(false); FSMEvent *evt = new FSMEvent(USER_EVT_CANCELINSERT); m_fsm.PostEventFIFO(evt); } void Eject(SpReqAnsContext::Pointer ctx) { ctx->Answer(Error_Succeed); FSMEvent *pEvt = new FSMEvent(USER_EVT_EJECT); m_fsm.PostEventFIFO(pEvt); } void QueryCardInfo(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); QueryCardInfoEvent* e = new QueryCardInfoEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } void QueryConnInfo(SpReqAnsContext::Pointer ctx) { ctx->Ans.connect = m_fsm.QueryConnStatus(); ctx->Answer(Error_Succeed); } void InsertWaitMore(SpOnewayCallContext::Pointer ctx) { m_fsm.SetAcceptWaitMore(true); } void QueryFWBList(SpReqAnsContext::Pointer ctx) { QueryFWBListEvent* pEvt = new QueryFWBListEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } void BindFWB(SpReqAnsContext::Pointer ctx) { BindFWBEvent* pEvt = new BindFWBEvent(); pEvt->ctx = ctx; m_fsm.PostEventFIFO(pEvt); } void GetDevInfo(SpReqAnsContext::Pointer ctx) { ctx->Ans.state = m_fsm.GetDevState(); ctx->Answer(Error_Succeed); } virtual bool IsService()const{return true;} virtual bool IsMultiThread()const{return true;} virtual void OnLog(const CAutoArray &SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo); virtual void OnSysVarEvent(const char* pszKey,const char* pszValue, const char* pszOldValue, const char* pszEntityName); protected: private: CardSwiperClass* m_pCardIss; CCardSwiperFSM m_fsm; BOOL bInitialized; LONG m_lenAPDU; BYTE m_APDUsendBuf[512]; CUUID m_uuidAccessAuth; private: void ConstructAPDU(BYTE cls,BYTE ins,BYTE p1,BYTE p2,BYTE lc,LPBYTE data,LPBYTE le) { LOG_FUNCTION(); m_lenAPDU = 0; m_APDUsendBuf[0] = cls; m_APDUsendBuf[1] = ins; m_APDUsendBuf[2] = p1; m_APDUsendBuf[3] = p2; m_lenAPDU = 4; if (lc != NULL && data != NULL) { m_APDUsendBuf[4] = lc; m_lenAPDU++; if (lc != 0) { memcpy(m_APDUsendBuf+m_lenAPDU,data,lc); m_lenAPDU += lc; } } if (le != NULL) m_APDUsendBuf[m_lenAPDU++] = (*le); if (!data) { delete[] data; data = NULL; } DbgInfo(CSimpleStringA::Format("ConstructAPDU, lenAPDU:%d",m_lenAPDU)); } };