#ifndef MOD_IDCERTIFICATE_H #define MOD_IDCERTIFICATE_H #ifdef RVC_OS_LINUX #include "SpTest.h" #endif #include "modVer.h" #include "IDCertFSM.h" #include "IDCertificate_server_g.h" #include "IDCertificate_UserErrorCode.h" class CIDCertEntity; class IDCertServerSession : public IDCertificate::IDCertService_ServerSessionBase { public: IDCertServerSession(CIDCertEntity* pEntity) : m_pEntity(pEntity){} virtual ~IDCertServerSession(){} virtual void Handle_CancelRead(SpOnewayCallContext::Pointer ctx); virtual void Handle_GetDevInfo(SpReqAnsContext::Pointer ctx); virtual void Handle_ReadWaitMore(SpOnewayCallContext::Pointer ctx); virtual void Handle_Exit(SpOnewayCallContext::Pointer ctx); virtual void Handle_Eject(SpReqAnsContext::Pointer ctx); virtual void Handle_ReadAndScan(SpReqAnsContext::Pointer ctx); virtual void Handle_ReadAndScanUTF8(SpReqAnsContext::Pointer ctx); //ex1 private: CIDCertEntity* m_pEntity; }; #ifdef RVC_OS_WIN class CIDCertEntity : public CDevAdptEntityBase, public ISysVarListener #else class CIDCertEntity : public CDevAdptEntityBase #endif { public: CIDCertEntity(){} virtual ~CIDCertEntity(){} virtual const char *GetEntityName() const { return "IDCertificate"; } const char* GetEntityVersion() const { return MODULE_VERSION_FULL; } virtual void OnPreStart(CAutoArray strArgs,CSmartPointer pTransactionContext) { LOG_FUNCTION(); ErrorCodeEnum rt = m_fsm.Init(this); #ifdef RVC_OS_WIN GetFunction()->RegistSysVarEvent("FWBReConn", this); #endif pTransactionContext->SendAnswer(rt); } virtual void OnPrePause(CSmartPointer pTransactionContext) { pTransactionContext->SendAnswer(Error_Succeed); } virtual void OnPreContinue(CSmartPointer pTransactionContext) { pTransactionContext->SendAnswer(Error_Succeed); } virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer pTransactionContext) { m_fsm.OnExit(); pTransactionContext->SendAnswer(Error_Succeed); } virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer pTransactionContext) { m_fsm.SelfTest(eTestType,pTransactionContext); } virtual CServerSessionBase* OnNewSession(const char*,const char*) { return new IDCertServerSession(this); } void CancelRead(SpOnewayCallContext::Pointer ctx) { CancelReadEvent* e = new CancelReadEvent(); m_fsm.PostEventFIFO(e); } void ReadWaitMore(SpOnewayCallContext::Pointer ctx) { if (m_fsm.GetReadFlag()) m_fsm.SetReadMore(); } void Exit(SpOnewayCallContext::Pointer ctx) { FSMEvent* evt = new FSMEvent(USER_EVT_EXIT); m_fsm.PostEventFIFO(evt); } void Eject(SpReqAnsContext::Pointer ctx) { EjectEvent* e = new EjectEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); } void ReadAndScan(SpReqAnsContext::Pointer ctx) { #ifdef RVC_OS_LINUX ReadAndScanEvent* e = new ReadAndScanEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); #else //windows if (!m_fsm.GetDevInitFlag()) { if (m_fsm.IsRVCPAD()) { ctx->Answer(Error_DevNotAvailable, IDCertificate_UserErrorCode_FWB_NotConnected); LogWarn(Severity_Middle, Error_DevNotAvailable, IDCertificate_UserErrorCode_FWB_NotConnected, "fwb not connected."); } else { ctx->Answer(Error_DevNotAvailable, IDCertificate_UserErrorCode_DevOpenFailed); LogWarn(Severity_Middle, Error_DevNotAvailable, IDCertificate_UserErrorCode_DevOpenFailed, "Open Dev failed."); } return; } ReadAndScanEvent* e = new ReadAndScanEvent(); e->ctx = ctx; m_fsm.PostEventFIFO(e); #endif // RVC_OS_LINUX } void ReadAndScanUTF8(SpReqAnsContext::Pointer ctx) //ex2 { #ifdef RVC_OS_LINUX ReadAndScanUTF8Event* e = new ReadAndScanUTF8Event(); e->ctx = ctx; m_fsm.PostEventFIFO(e); #else if (!m_fsm.GetDevInitFlag()) { if (m_fsm.IsRVCPAD()) { ctx->Answer(Error_DevNotAvailable, IDCertificate_UserErrorCode_FWB_NotConnected); LogWarn(Severity_Middle, Error_DevNotAvailable, IDCertificate_UserErrorCode_FWB_NotConnected, "fwb not connected."); } else { ctx->Answer(Error_DevNotAvailable, IDCertificate_UserErrorCode_DevOpenFailed); LogWarn(Severity_Middle, Error_DevNotAvailable, IDCertificate_UserErrorCode_DevOpenFailed, "Open Dev failed."); } return; } ReadAndScanUTF8Event* e = new ReadAndScanUTF8Event(); e->ctx = ctx; m_fsm.PostEventFIFO(e); #endif } void GetDevInfo(SpReqAnsContext::Pointer ctx) { #ifdef RVC_OS_WIN if (!m_fsm.GetDevInitFlag()) { if (m_fsm.IsRVCPAD()) ctx->Answer(Error_DevNotAvailable, IDCertificate_UserErrorCode_FWB_NotConnected); else ctx->Answer(Error_DevNotAvailable, IDCertificate_UserErrorCode_DevOpenFailed); return; } #endif DevCategoryInfo devCatInfo; CSimpleStringA devType = ""; m_fsm.GetDevCatInfo(devCatInfo, devType); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetDevInfo") ("devType:%s", (const char*)devType); ctx->Ans.model = devCatInfo.szModel; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetDevInfo") ("szModel:%s", (const char*)devCatInfo.szModel); ctx->Ans.type = devCatInfo.szType; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetDevInfo") ("szType:%s", (const char*)devCatInfo.szType); ctx->Ans.type += ((devType == "4") ? "#IG" : "#");//如果版本号为4,说明是嵌入式多合一(目前也有可能是新大机20190910@zjw),郭丹再判断机型是PAD,说明是PAD+嵌入式多合一,则读完证后不调用吐卡操作 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetDevInfo") ("%s", (const char*)ctx->Ans.type); if (ctx->Ans.model.GetLength() < 256) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetDevInfo") ("%s", (const char*)ctx->Ans.model); if (m_fsm.GetDevInitFlag()) { ctx->Ans.state = DEVICE_STATUS_NORMAL; } else { ctx->Ans.state = DEVICE_STATUS_NOT_READY; } ctx->Answer(Error_Succeed); } virtual bool IsService()const{return true;} virtual bool IsMultiThread()const{return false;} #ifdef RVC_OS_WIN virtual void OnSysVarEvent(const char* pszKey, const char* pszValue, const char* pszOldValue, const char* pszEntityName); #endif private: CIDCertFSM m_fsm; }; #endif // MOD_IDCERTIFICATE_H