Browse Source

Z991239-527 #comment reconsitution: 重构 mod_pinpad 和 mod_CardSwiper 的 实体基类 和 状态机基类

gifur 5 năm trước cách đây
mục cha
commit
159e5f463e

+ 0 - 247
DevAdapter/include/DeviceBaseHelper.h

@@ -1,247 +0,0 @@
-#ifndef __DEVICEBASE_HELPER_H
-#define __DEVICEBASE_HELPER_H
-#pragma once
-
-#include "DeviceBaseClass.h"
-
-/*
-
-assert(DeviceBaseHelper::GetCurVendorType("") == Vendor_Invalide);
-assert(DeviceBaseHelper::GetCurVendorType("buzhidao") == Vendor_Invalide);
-assert(DeviceBaseHelper::GetCurVendorType("hyosung") == Vendor_Hyosung);
-assert(DeviceBaseHelper::GetCurVendorType("KXD") == Vendor_Kxd);
-assert(DeviceBaseHelper::GetCurVendorType("KEBa") == Vendor_Keba);
-assert(DeviceBaseHelper::GetCurVendorType("nanTiAn") == Vendor_Nantian);
-assert(DeviceBaseHelper::GetCurVendorType("YOTAP") == Vendor_yotap);
-assert(DeviceBaseHelper::GetCurVendorType("zSs") == Vendor_ZSS);
-assert(DeviceBaseHelper::GetCurVendorType("GWI") == Vendor_GreateWall);
-assert(DeviceBaseHelper::GetCurVendorType("yihua") == Vendor_YiHua);
-assert(DeviceBaseHelper::GetCurVendorType("yh") == Vendor_YiHua);
-assert(DeviceBaseHelper::GetCurVendorType("GRG") == Vendor_GRG);
-assert(DeviceBaseHelper::GetCurVendorType("cw") == Vendor_CW);
-assert(DeviceBaseHelper::GetCurVendorType("eastCOM") == Vendor_EastCom);
-assert(DeviceBaseHelper::GetCurVendorType("hx") == Vendor_HuaXin);
-assert(DeviceBaseHelper::GetCurVendorType("sankyo") == Vendor_Sankyo);
-assert(DeviceBaseHelper::GetCurVendorType("chinavision") == Vendor_ChinaVision);
-
-
-*/
-
-enum VendorNameType {
-	Vendor_Invalide,
-	Vendor_Sankyo,
-	Vendor_ChinaVision,
-	Vendor_Hyosung,
-	Vendor_Kxd,
-	Vendor_Keba,
-	Vendor_Nantian,
-	Vendor_yotap,
-	Vendor_ZSS,
-	Vendor_GreateWall,
-	Vendor_YiHua,
-	Vendor_GRG,
-	Vendor_CW,
-	Vendor_EastCom,
-	Vendor_HuaXin,
-	Vendor_MAX
-};
-
-static const char* VendorNameStr[] = {
-	"Unknown",
-	"Sankyo",
-	"ChinaVision",
-	"hyosung",
-	"kxd",
-	"keba",
-	"nantian",
-	"yotap",
-	"zss",
-	"gwi",
-	"yh", // "yihua"
-	"grg",
-	"CW",
-	"EastCom",
-	"hx"
-};
-
-class DeviceBaseHelper
-{
-public:
-
-	static ErrorCodeEnum GetAndSplitDevErrInfo(
-		DeviceBaseClass* inst, 
-		CSimpleStringA& csErrMsg, 
-		WORD& wdDevErrCode,
-		LPCTSTR lpszFuncNameForDisplay = ""
-	)
-	{
-		csErrMsg = "";
-		wdDevErrCode = 0;
-
-		BOOL bDisplayFunName = TRUE;
-		if( lpszFuncNameForDisplay == NULL || strlen(lpszFuncNameForDisplay) == 0 )
-			bDisplayFunName = FALSE;
-
-		if(inst == NULL)
-		{
-			Dbg("inst occurs nullptr !!!");
-			return Error_Param;
-		}
-
-		DevErrorInfo devErrInfo;
-		ZeroMemory(&devErrInfo, sizeof(DevErrorInfo));
-		ErrorCodeEnum erroCode = inst->GetLastErr(devErrInfo);
-		if(erroCode == Error_Succeed)
-		{
-			if(strlen(devErrInfo.szErrMsg) > 0)
-			{
-				csErrMsg = devErrInfo.szErrMsg;
-			}
-
-			if(devErrInfo.dwErrMsgLen > MAX_DEV_ERROR_MSG_LEN)
-			{
-				//oiltmp@20200520 comment the following line
-				//wdDevErrCode = (WORD)((devErrInfo.dwErrMsgLen >> 16) & 0x0000FFFF);
-			}
-			if(bDisplayFunName)
-			{
-				Dbg("Invoke <%s> failed, Dev_GLE: DevErrCode[%d], ErrMsg[%s]", 
-					lpszFuncNameForDisplay, wdDevErrCode, (LPCTSTR)csErrMsg);
-			}
-			else
-			{
-				Dbg("Dev_GLE: DevErrCode[%d], ErrMsg[%s]", wdDevErrCode, (LPCTSTR)csErrMsg);
-			}
-		}
-		else
-		{
-			if(bDisplayFunName)
-			{
-				Dbg("Invoke <%s> failed, and unfortunately Dev_GLE failed returned EC: %d(0x%X)", 
-					lpszFuncNameForDisplay, erroCode, erroCode);
-				csErrMsg = CSimpleStringA::Format("Invoke <%s> failed", lpszFuncNameForDisplay);
-			}
-			else
-			{
-				Dbg("Dev_GLE failed returned EC: %d(0x%X)", 
-					erroCode, erroCode);
-			}
-		}
-		return erroCode;
-	}
-
-	static ErrorCodeEnum LogDevErrInfo(DeviceBaseClass* inst, LPCTSTR lpszFuncName = "")
-	{
-		CSimpleStringA csMsg;
-		WORD wdErrorCode = 0;
-		return GetAndSplitDevErrInfo(inst, csMsg, wdErrorCode, lpszFuncName);
-	}
-
-	static BOOL GetDevErrorCode(DeviceBaseClass* inst, WORD& wdErrorCode)
-	{
-		CSimpleStringA csMsg;
-		ErrorCodeEnum eRet = GetAndSplitDevErrInfo(inst, csMsg, wdErrorCode);
-		return ((eRet == Error_Succeed) ? (TRUE) : (FALSE));
-	}
-
-	static VendorNameType GetCurVendorType(LPCTSTR vendorName) 
-	{
-		if(vendorName == NULL || strlen(vendorName) == 0) {
-			return Vendor_Invalide;
-		}
-		int idx = -1;
-		for(int i=0; i<sizeof(VendorNameStr)/sizeof(VendorNameStr[0]); ++i)
-		{
-			if(strnicmp(vendorName, VendorNameStr[i], strlen(VendorNameStr[i])) == 0) {
-				idx = i;
-				break;
-			}
-		}
-		if(idx == -1) {
-			/*历史遗留原因,怡化厂商有两个适配器名字*/
-			if(strnicmp(vendorName, "yihua", strlen("yihua")) == 0) {
-				idx = Vendor_YiHua;
-			} else {
-				idx	 = Vendor_Invalide;
-			}
-		}
-		return (VendorNameType)idx;
-	}
-};
-
-struct HardwareEntityCode {
-
-	DWORD dwEntityId;
-	DWORD dwVendorId;
-	DWORD dwVendorErroCode;
-	DWORD dwReserved;
-};
-
-#define HARDWARE_ENTITY_RESET_ENTITYID(ent, entityID)	\
-do{\
-	memset(&ent, 0, sizeof(ent));	\
-	ent.dwEntityId = entityID;	\
-} while (false)
-
-#define HARDWARE_ENTITY_SET_DEVCODE(ent, ec, reserved)	\
-do {\
-	ent.dwVendorErroCode = ec;	\
-	ent.dwReserved = reserved;	\
-} while (false)
-
-// 先不上厂商标识 [5/14/2020 7:34 @Gifur]
-#define HARDWARE_ENTITY_SET_VENDOR_NAME(ent, str)	\
-	ent.dwVendorId = 0/*(DWORD)DeviceBaseHelper::GetCurVendorType(str)*/ 
-
-#define HARDWARE_ENTITY_MAKE_ERRORCODE(ec)	\
-	MAKE_SLV_ERRORCODE(ec.dwEntityId, (ec.dwVendorId), ec.dwVendorErroCode)
-
-#define HARDWARE_ENTITY_MAKE_ERRORCODE_TO_BUSINESS(ec)	\
-	MAKE_SLV_ERRORCODE_TO_BUSINESS(ec.dwEntityId, ec.dwVendorErroCode, ec.dwReserved)
-
-/*class object must have 'LogErrMsg' function.*/
-#define LOG_ERROR_MSG_MACRO(errCode, MethodSig, DeviceType)\
-	do {\
-		if(errCode != Error_Succeed) {\
-			LogErrMsg(CSimpleStringA::Format("%s::%s at line:%d", __FUNCTION__, #MethodSig, __LINE__), \
-			errCode, MEC_DEVAPI_##DeviceType##_(MethodSig), TRUE);\
-	}\
-	} while (false)
-
-#define LOG_CARDISSUER_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, CARDISSUER)
-
-#define LOG_CARDSWIPER_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, CARDSWIPER)
-
-#define LOG_THERMALPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, THERMALPRINT)
-
-#define LOG_DEVCONTROL_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, DEVCONTROL)
-
-#define LOG_PRINTSEAL_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, PRINTSEAL)
-
-#define LOG_FINGERPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, FINGERPRINT)
-
-#define LOG_HSPSCANNER_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, HSPSCANNER)
-
-#define LOG_UPS_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, UPS)
-
-#define LOG_GPIO_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, GPIO)
-
-#define LOG_IDCER_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, IDCER)
-
-#define LOG_RF_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, RF)
-
-#define LOG_PINPAD_ERROR_MSG_MACRO(errCode, MethodSig)\
-	LOG_ERROR_MSG_MACRO(errCode, MethodSig, EPP)
-
-#endif // __DEVICEBASE_HELPER_H

+ 3 - 129
module/include/mod_DevAdptEntityBase.hpp → Module/include/DevEntityCommBase.hpp

@@ -11,132 +11,6 @@
 #include "toolkit.h"
 #include <regex>
 
-#define SAFE_FREE_LIBRARY(hModule)	\
-	do {							\
-	if(hModule){					\
-	FreeLibrary(hModule);		\
-	hModule = NULL;				\
-	}							\
-	}while(0)
-
-#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
-	using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pOutDevAptObj);
-	using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pInDevAptObj);
-#else
-	using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pOutDevAptObj);
-	using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pInDevAptObj);
-#endif
-
-
-template <typename TSubAdpt>
-struct DevAdptLibHelper
-{
-
-	ErrorCodeEnum LoadLibAddress(const CSimpleStringA& strFullLibPath)
-	{
-		ErrorCodeEnum erroCode = Error_Succeed;
-
-		do 
-		{
-			int res = toolkit_dlopen(strFullLibPath, &m_lib);
-			if (res != 0) {
-				Dbg("toolkit_dlopen[%s] failed with error %s.", strFullLibPath.GetData(), toolkit_dlerror(&m_lib));
-				erroCode = Error_DevLoadFileFailed;
-				break;
-			}
-
-			if ((res = toolkit_dlsym(&m_lib, "CreateDevComponent", (void**)&pFuncCreateAdapt)) != 0) {
-				Dbg("Get 'CreateDevComponent' Func address failed with error: %s", toolkit_dlerror(&m_lib));
-				erroCode = Error_DevLoadFileFailed;
-				break;
-			}
-			if ((res = toolkit_dlsym(&m_lib, "ReleaseDevComponent", (void**)&pFuncReleaseAdapt)) != 0) {
-				Dbg("Get 'ReleaseDevComponent' Func address failed with error: %s", toolkit_dlerror(&m_lib));
-				erroCode = Error_DevLoadFileFailed;
-				break;
-			}
-
-		} while (false);
-
-		if (IS_FAILURED(erroCode)) {
-			TearDown();
-		}
-
-		return erroCode;
-	}
-
-	ErrorCodeEnum CreateDevAdptObject()
-	{
-		if (m_AdptObjPtr != nullptr) {
-			return Error_AlreadyExist;
-		}
-		if (pFuncCreateAdapt == nullptr || pFuncReleaseAdapt == nullptr) {
-			return Error_NotInit;
-		}
-
-		ErrorCodeEnum erroCode = Error_Succeed;
-		erroCode = pFuncCreateAdapt((DeviceBaseClass*&)m_AdptObjPtr);
-		if (IS_FAILURED(erroCode)) {
-			Dbg("Create device adapter object failed! EC=%s", SpStrError(erroCode));
-			return erroCode;
-		}
-
-		LOG_ASSERT(m_AdptObjPtr != nullptr);
-
-		return Error_Succeed;
-	}
-
-	/** Integrate function LoadLibAddress and CreateDevAdptObject*/
-	ErrorCodeEnum LoadUp(const CSimpleStringA& strFullLibPath)
-	{
-		ErrorCodeEnum erroCode = LoadLibAddress(strFullLibPath);
-		if (IS_SUCCEED(erroCode)) {
-			erroCode = CreateDevAdptObject();
-		}
-		return erroCode;
-	}
-
-	void TearDown()
-	{
-		if (m_AdptObjPtr != nullptr) {
-			m_AdptObjPtr->DevClose();
-			if (nullptr != pFuncReleaseAdapt) {
-				DeviceBaseClass* devBasePtr = static_cast<DeviceBaseClass*>(m_AdptObjPtr);
-#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
-				pFuncReleaseAdapt(0, devBasePtr);
-#else
-				pFuncReleaseAdapt(devBasePtr);
-#endif
-				m_AdptObjPtr = nullptr;
-			}
-		}
-		toolkit_dlclose(&m_lib);
-		pFuncReleaseAdapt = pFuncCreateAdapt = nullptr;
-	}
-
-	TSubAdpt* GetDevPointer() { return m_AdptObjPtr; }
-
-	TSubAdpt* operator->() { return m_AdptObjPtr; }
-
-	DevAdptLibHelper()
-		: pFuncCreateAdapt(nullptr), pFuncReleaseAdapt(nullptr)
-		, m_AdptObjPtr(nullptr)
-	{
-
-	}
-	~DevAdptLibHelper()
-	{
-		TearDown();
-	}
-
-private:
-
-	toolkit_lib_t m_lib;
-	DevAdaptObjCreateFunc pFuncCreateAdapt;
-	DevAdaptObjReleaseFunc pFuncReleaseAdapt;
-
-	TSubAdpt* m_AdptObjPtr;
-};
 
 struct VendorLibInfo
 {
@@ -154,7 +28,7 @@ struct VendorLibInfo
 			&& !strBatch.IsNullOrEmpty());
 	}
 
-	int GetVersion()
+	int GetVersionInt() const 
 	{
 		int result = 0;
 		if (!strVersion.IsNullOrEmpty()) {
@@ -163,7 +37,7 @@ struct VendorLibInfo
 		return result;
 	}
 
-	int GetBatch()
+	int GetBatchInt() const 
 	{
 		int result = 0;
 		if (!strBatch.IsNullOrEmpty()) {
@@ -172,7 +46,7 @@ struct VendorLibInfo
 		return result;
 	}
 
-	CSimpleStringA toLibNameString()
+	CSimpleStringA toLibNameString() const
 	{
 		CSimpleStringA strFullLibName(true);
 		if (!strDevice.IsNullOrEmpty()) {

+ 468 - 0
Module/include/DevFSMCommBase.hpp

@@ -0,0 +1,468 @@
+#ifndef _COMM_DEVICE_FSM_BASE_HPP_
+#define _COMM_DEVICE_FSM_BASE_HPP_
+
+#include "DevEntityCommBase.hpp"
+#include "SpFSM.h"
+#include "DevErrorCode.h"
+#include "DeviceBaseClass.h"
+
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pOutDevAptObj);
+using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pInDevAptObj);
+#else
+using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pOutDevAptObj);
+using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pInDevAptObj);
+#endif
+
+/*
+
+assert(DeviceBaseHelper::GetCurVendorType("") == Vendor_Invalide);
+assert(DeviceBaseHelper::GetCurVendorType("buzhidao") == Vendor_Invalide);
+assert(DeviceBaseHelper::GetCurVendorType("hyosung") == Vendor_Hyosung);
+assert(DeviceBaseHelper::GetCurVendorType("KXD") == Vendor_Kxd);
+assert(DeviceBaseHelper::GetCurVendorType("KEBa") == Vendor_Keba);
+assert(DeviceBaseHelper::GetCurVendorType("nanTiAn") == Vendor_Nantian);
+assert(DeviceBaseHelper::GetCurVendorType("YOTAP") == Vendor_yotap);
+assert(DeviceBaseHelper::GetCurVendorType("zSs") == Vendor_ZSS);
+assert(DeviceBaseHelper::GetCurVendorType("GWI") == Vendor_GreateWall);
+assert(DeviceBaseHelper::GetCurVendorType("yihua") == Vendor_YiHua);
+assert(DeviceBaseHelper::GetCurVendorType("yh") == Vendor_YiHua);
+assert(DeviceBaseHelper::GetCurVendorType("GRG") == Vendor_GRG);
+assert(DeviceBaseHelper::GetCurVendorType("cw") == Vendor_CW);
+assert(DeviceBaseHelper::GetCurVendorType("eastCOM") == Vendor_EastCom);
+assert(DeviceBaseHelper::GetCurVendorType("hx") == Vendor_HuaXin);
+assert(DeviceBaseHelper::GetCurVendorType("sankyo") == Vendor_Sankyo);
+assert(DeviceBaseHelper::GetCurVendorType("chinavision") == Vendor_ChinaVision);
+
+
+*/
+
+enum VendorNameType {
+	Vendor_Invalide,
+	Vendor_Sankyo,
+	Vendor_ChinaVision,
+	Vendor_Hyosung,
+	Vendor_Kxd,
+	Vendor_Keba,
+	Vendor_Nantian,
+	Vendor_yotap,
+	Vendor_ZSS,
+	Vendor_GreateWall,
+	Vendor_YiHua,
+	Vendor_GRG,
+	Vendor_CW,
+	Vendor_EastCom,
+	Vendor_HuaXin,
+	Vendor_MAX
+};
+
+static const char* VendorNameStr[] = {
+	"Unknown",
+	"Sankyo",
+	"ChinaVision",
+	"hyosung",
+	"kxd",
+	"keba",
+	"nantian",
+	"yotap",
+	"zss",
+	"gwi",
+	"yh", // "yihua"
+	"grg",
+	"CW",
+	"EastCom",
+	"hx"
+};
+
+inline static VendorNameType GetCurVendorType(LPCTSTR vendorName)
+{
+	if (vendorName == NULL || strlen(vendorName) == 0) {
+		return Vendor_Invalide;
+	}
+	int idx = -1;
+	for (int i = 0; i < sizeof(VendorNameStr) / sizeof(VendorNameStr[0]); ++i) {
+		if (strnicmp(vendorName, VendorNameStr[i], strlen(VendorNameStr[i])) == 0) {
+			idx = i;
+			break;
+		}
+	}
+	if (idx == -1) {
+		/*历史遗留原因,怡化厂商有两个适配器名字*/
+		if (strnicmp(vendorName, "yihua", strlen("yihua")) == 0) {
+			idx = Vendor_YiHua;
+		}
+		else {
+			idx = Vendor_Invalide;
+		}
+	}
+	return (VendorNameType)idx;
+}
+
+template <typename TSubAdpt>
+struct DevAdptLibHelper
+{
+
+	ErrorCodeEnum LoadLibAddress(const CSimpleStringA& strFullLibPath)
+	{
+		ErrorCodeEnum erroCode = Error_Succeed;
+
+		do {
+			int res = toolkit_dlopen(strFullLibPath, &m_lib);
+			if (res != 0) {
+				Dbg("toolkit_dlopen[%s] failed with error %s.", strFullLibPath.GetData(), toolkit_dlerror(&m_lib));
+				erroCode = Error_DevLoadFileFailed;
+				break;
+			}
+
+			if ((res = toolkit_dlsym(&m_lib, "CreateDevComponent", (void**)&pFuncCreateAdapt)) != 0) {
+				Dbg("Get 'CreateDevComponent' Func address failed with error: %s", toolkit_dlerror(&m_lib));
+				erroCode = Error_DevLoadFileFailed;
+				break;
+			}
+			if ((res = toolkit_dlsym(&m_lib, "ReleaseDevComponent", (void**)&pFuncReleaseAdapt)) != 0) {
+				Dbg("Get 'ReleaseDevComponent' Func address failed with error: %s", toolkit_dlerror(&m_lib));
+				erroCode = Error_DevLoadFileFailed;
+				break;
+			}
+
+		} while (false);
+
+		if (IS_FAILURED(erroCode)) {
+			TearDown();
+		}
+
+		return erroCode;
+	}
+
+	ErrorCodeEnum CreateDevAdptObject()
+	{
+		if (m_AdptObjPtr != nullptr) {
+			return Error_AlreadyExist;
+		}
+		if (pFuncCreateAdapt == nullptr || pFuncReleaseAdapt == nullptr) {
+			return Error_NotInit;
+		}
+
+		ErrorCodeEnum erroCode = Error_Succeed;
+		erroCode = pFuncCreateAdapt((DeviceBaseClass*&)m_AdptObjPtr);
+		if (IS_FAILURED(erroCode)) {
+			Dbg("Create device adapter object failed! EC=%s", SpStrError(erroCode));
+			return erroCode;
+		}
+
+		LOG_ASSERT(m_AdptObjPtr != nullptr);
+
+		return Error_Succeed;
+	}
+
+	/** Integrate function LoadLibAddress and CreateDevAdptObject*/
+	ErrorCodeEnum LoadUp(const CSimpleStringA& strFullLibPath)
+	{
+		ErrorCodeEnum erroCode = LoadLibAddress(strFullLibPath);
+		if (IS_SUCCEED(erroCode)) {
+			erroCode = CreateDevAdptObject();
+		}
+		return erroCode;
+	}
+
+	void TearDown()
+	{
+		if (m_AdptObjPtr != nullptr) {
+			m_AdptObjPtr->DevClose();
+			if (nullptr != pFuncReleaseAdapt) {
+				DeviceBaseClass* devBasePtr = static_cast<DeviceBaseClass*>(m_AdptObjPtr);
+#if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
+				pFuncReleaseAdapt(0, devBasePtr);
+#else
+				pFuncReleaseAdapt(devBasePtr);
+#endif
+				m_AdptObjPtr = nullptr;
+			}
+		}
+		toolkit_dlclose(&m_lib);
+		pFuncReleaseAdapt = pFuncCreateAdapt = nullptr;
+	}
+
+	explicit operator bool() const { return (m_AdptObjPtr != nullptr); }
+	operator DeviceBaseClass* () { return m_AdptObjPtr; }
+
+	TSubAdpt* GetDevPointer() { return m_AdptObjPtr; }
+
+	TSubAdpt* operator->() { return m_AdptObjPtr; }
+
+	DevAdptLibHelper()
+		: pFuncCreateAdapt(nullptr), pFuncReleaseAdapt(nullptr)
+		, m_AdptObjPtr(nullptr)
+	{
+
+	}
+	~DevAdptLibHelper()
+	{
+		TearDown();
+	}
+
+private:
+
+	toolkit_lib_t m_lib;
+	DevAdaptObjCreateFunc pFuncCreateAdapt;
+	DevAdaptObjReleaseFunc pFuncReleaseAdapt;
+
+	TSubAdpt* m_AdptObjPtr;
+};
+
+struct DevEntityErrorCode {
+
+	DWORD dwEntityId;
+	DWORD dwVendorId;
+	DWORD dwVendorErroCode;
+	DWORD dwReserved;
+
+	DevEntityErrorCode() :dwEntityId(0), dwVendorId(0), dwVendorErroCode(0), dwReserved(0) {}
+
+	void ResetWithEntityID(WORD wEntityID)
+	{
+		dwEntityId = dwVendorId = dwVendorErroCode = dwReserved = 0;
+		dwEntityId = wEntityID;
+	}
+
+	void SetDevCode(DWORD devErrorCode, DWORD dwReservedCode)
+	{
+		dwVendorErroCode = devErrorCode;
+		dwReserved = dwReservedCode;
+	}
+
+	void SetVendorID(DWORD dwVendorID)
+	{
+		dwVendorId = dwVendorID;
+	}
+
+	DWORD GetCompleteErrorCode() const {
+		return MAKE_SLV_ERRORCODE(dwEntityId, dwVendorId, dwVendorErroCode);
+	}
+
+	DWORD GetCompleteErrorCode2Business() const {
+		return MAKE_SLV_ERRORCODE_TO_BUSINESS(dwEntityId, dwVendorErroCode, dwReserved);
+	}
+
+};
+
+template<class TFSM, class TDevClass>
+class CCommDevFSM : public FSMImpl<TFSM>
+{
+public:
+	ErrorCodeEnum GetAndSplitDevErrInfo(CSimpleStringA& csErrMsg, 
+		WORD& wdDevErrCode, LPCTSTR lpszFuncNameForDisplay = "");
+	ErrorCodeEnum LogDevErrInfo(LPCTSTR lpszFuncName = "")
+	{
+		CSimpleStringA csMsg;
+		WORD wdErrorCode = 0;
+		return GetAndSplitDevErrInfo(csMsg, wdErrorCode, lpszFuncName);
+	}
+	bool GetDevErrorCode(WORD& wdErrorCode)
+	{
+		CSimpleStringA csMsg;
+		ErrorCodeEnum eRet = GetAndSplitDevErrInfo(csMsg, wdErrorCode);
+		return (eRet == Error_Succeed);
+	}
+protected:
+	DevAdptLibHelper<TDevClass> m_hDevHelper;
+
+	DevEntityErrorCode m_entCode;
+	CSimpleStringA m_csAlarmMsg = "No more information";
+
+	void UpdateEntityID()
+	{
+		CEntityStaticInfo esi = { 0 };
+		ErrorCodeEnum ec = this->GetEntityBase()->GetFunction()->GetEntityStaticInfo(
+			this->GetEntityBase()->GetEntityName(), esi);
+		if (ec == Error_Succeed) {
+			Dbg("wEntityDevelopID: 0x%X", esi.wEntityDevelopID);
+			m_entCode.ResetWithEntityID(esi.wEntityDevelopID);
+		}
+	}
+
+	DWORD UpdateDEC(DWORD dwVal = 0)
+	{
+		if (m_entCode.dwEntityId == 0) {
+			UpdateEntityID();
+		}
+		int reserved = 0;
+		reserved = (dwVal & 0xFC000) >> 14;
+		m_entCode.SetDevCode(dwVal, reserved);
+		return GetDEC();
+	}
+	DWORD GetDEC() const
+	{
+		return m_entCode.GetCompleteErrorCode();
+	}
+	//DWORD AlarmDEC() const {
+	//	return GetDEC();
+	//}
+	DWORD AlarmDECToBusiness(DWORD dwVal = 0) {
+		if (dwVal > 0)
+			UpdateDEC(dwVal);
+		//oilyang@20200528 according the meeting result,throw a LogError while answering ctx
+		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
+		DWORD dwCode = 0;
+		if ((m_entCode.dwVendorErroCode >> 20) == m_entCode.dwEntityId)
+			dwCode = m_entCode.dwVendorErroCode;
+		else
+			dwCode = m_entCode.GetCompleteErrorCode2Business();
+		LogError(Severity_Middle, Error_Unexpect, dwCode, "TODO:");
+		return dwCode;
+	}
+	void ClearRelatedDEC()
+	{
+		UpdateDEC();
+		m_csAlarmMsg = "No more information";
+	}
+	void LogErrMsg(const char* pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode = 0, BOOL bAlarm = FALSE);
+};
+
+
+template<class TFSM, class TDevClass>
+inline ErrorCodeEnum CCommDevFSM<TFSM, TDevClass>::GetAndSplitDevErrInfo(
+	CSimpleStringA& csErrMsg, WORD& wdDevErrCode, LPCTSTR lpszFuncNameForDisplay)
+{
+	csErrMsg = "";
+	wdDevErrCode = 0;
+
+	BOOL bDisplayFunName = TRUE;
+	if (lpszFuncNameForDisplay == NULL || strlen(lpszFuncNameForDisplay) == 0)
+		bDisplayFunName = FALSE;
+
+	if (!m_hDevHelper) {
+		Dbg("inst occurs nullptr !!!");
+		return Error_Param;
+	}
+
+	DevErrorInfo devErrInfo;
+	ZeroMemory(&devErrInfo, sizeof(DevErrorInfo));
+	ErrorCodeEnum erroCode = m_hDevHelper->GetLastErr(devErrInfo);
+	if (erroCode == Error_Succeed) {
+		if (strlen(devErrInfo.szErrMsg) > 0) {
+			csErrMsg = devErrInfo.szErrMsg;
+		}
+
+		if (devErrInfo.dwErrMsgLen > MAX_DEV_ERROR_MSG_LEN) {
+			//oiltmp@20200520 comment the following line
+			//wdDevErrCode = (WORD)((devErrInfo.dwErrMsgLen >> 16) & 0x0000FFFF);
+		}
+		if (bDisplayFunName) {
+			Dbg("Invoke <%s> failed, Dev_GLE: DevErrCode[%d], ErrMsg[%s]",
+				lpszFuncNameForDisplay, wdDevErrCode, (LPCTSTR)csErrMsg);
+		}
+		else {
+			Dbg("Dev_GLE: DevErrCode[%d], ErrMsg[%s]", wdDevErrCode, (LPCTSTR)csErrMsg);
+		}
+	}
+	else {
+		if (bDisplayFunName) {
+			Dbg("Invoke <%s> failed, and unfortunately Dev_GLE failed returned EC: %d(0x%X)",
+				lpszFuncNameForDisplay, erroCode, erroCode);
+			csErrMsg = CSimpleStringA::Format("Invoke <%s> failed", lpszFuncNameForDisplay);
+		}
+		else {
+			Dbg("Dev_GLE failed returned EC: %d(0x%X)",
+				erroCode, erroCode);
+		}
+	}
+	return erroCode;
+}
+
+template<class TFSM, class TDevClass>
+inline void CCommDevFSM<TFSM, TDevClass>::LogErrMsg(
+	const char* pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode, BOOL bAlarm)
+{
+	Dbg("%s failed, EC = %s(0x%x)", pMsgHead, SpStrError(eErrCode), eErrCode);
+	WORD wdErrCode = 0;
+	CSimpleStringA csErrMsg(true);
+	ErrorCodeEnum ec = GetAndSplitDevErrInfo(csErrMsg, wdErrCode);
+	if (ec == Error_Succeed && wdErrCode != 0) {
+		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
+		if ((defaultDevCode >> 20) == m_entCode.dwEntityId)
+			UpdateDEC(defaultDevCode);
+		else
+			UpdateDEC(wdErrCode);
+	}
+	else if (defaultDevCode != 0) {
+		UpdateDEC(defaultDevCode);
+	}
+	m_csAlarmMsg = CSimpleStringA::Format("%s failed EC= %s : %s",
+		pMsgHead, SpStrError(eErrCode), (LPCTSTR)csErrMsg);
+	if (bAlarm) {
+		LogWarn(Severity_High, eErrCode, AlarmDECToBusiness(), (LPCTSTR)m_csAlarmMsg);
+	}
+	return;
+}
+
+
+#define HARDWARE_ENTITY_RESET_ENTITYID(ent, entityID)	\
+do{\
+	memset(&ent, 0, sizeof(ent));	\
+	ent.dwEntityId = entityID;	\
+} while (false)
+
+#define HARDWARE_ENTITY_SET_DEVCODE(ent, ec, reserved)	\
+do {\
+	ent.dwVendorErroCode = ec;	\
+	ent.dwReserved = reserved;	\
+} while (false)
+
+// 先不上厂商标识 [5/14/2020 7:34 @Gifur]
+#define HARDWARE_ENTITY_SET_VENDOR_NAME(ent, str)	\
+	ent.dwVendorId = 0/*(DWORD)DeviceBaseHelper::GetCurVendorType(str)*/ 
+
+#define HARDWARE_ENTITY_MAKE_ERRORCODE(ec)	\
+	MAKE_SLV_ERRORCODE(ec.dwEntityId, (ec.dwVendorId), ec.dwVendorErroCode)
+
+#define HARDWARE_ENTITY_MAKE_ERRORCODE_TO_BUSINESS(ec)	\
+	MAKE_SLV_ERRORCODE_TO_BUSINESS(ec.dwEntityId, ec.dwVendorErroCode, ec.dwReserved)
+
+/*class object must have 'LogErrMsg' function.*/
+#define LOG_ERROR_MSG_MACRO(errCode, MethodSig, DeviceType)\
+	do {\
+		if(errCode != Error_Succeed) {\
+			LogErrMsg(CSimpleStringA::Format("%s::%s at line:%d", __FUNCTION__, #MethodSig, __LINE__), \
+			errCode, MEC_DEVAPI_##DeviceType##_(MethodSig), TRUE);\
+	}\
+	} while (false)
+
+#define LOG_CARDISSUER_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, CARDISSUER)
+
+#define LOG_CARDSWIPER_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, CARDSWIPER)
+
+#define LOG_THERMALPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, THERMALPRINT)
+
+#define LOG_DEVCONTROL_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, DEVCONTROL)
+
+#define LOG_PRINTSEAL_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, PRINTSEAL)
+
+#define LOG_FINGERPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, FINGERPRINT)
+
+#define LOG_HSPSCANNER_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, HSPSCANNER)
+
+#define LOG_UPS_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, UPS)
+
+#define LOG_GPIO_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, GPIO)
+
+#define LOG_IDCER_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, IDCER)
+
+#define LOG_RF_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, RF)
+
+#define LOG_PINPAD_ERROR_MSG_MACRO(errCode, MethodSig)\
+	LOG_ERROR_MSG_MACRO(errCode, MethodSig, EPP)
+
+
+#endif /*_COMM_DEVICE_FSM_BASE_HPP_*/

+ 1 - 2
Module/mod_cardswiper/CMakeLists.txt

@@ -34,8 +34,7 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${MODULE_BASE_DIR}/mod_accessauth
 )
 
-set_target_properties(${MODULE_NAME} PROPERTIES 
-	COMPILE_DEFINITIONS "MOD_CARDSWIPER_EXPORTS;_CRT_RAND_S")
+set_target_properties(${MODULE_NAME} PROPERTIES COMPILE_DEFINITIONS "_CRT_RAND_S")
 
 # 添加实体需要依赖的其他共享库(包括系统库)
 set(${MODULE_PREFIX}_LIBS spbase ssl)

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 156 - 331
Module/mod_cardswiper/CardSwiperFSM.cpp


+ 8 - 50
Module/mod_cardswiper/CardSwiperFSM.h

@@ -17,6 +17,8 @@ using namespace HealthManager;
 #include "PinPad_client_g.h"
 using namespace PinPad;
 
+#include "DevFSMCommBase.hpp"
+
 class HealthMngClient : public HealthManagerService_ClientBase
 {
 public:
@@ -87,7 +89,6 @@ using namespace CardSwiper;
 #include "AccessAuthorization_client_g.h"
 using namespace AccessAuthorization;
 #include "DevErrorCode.h"
-#include "DeviceBaseHelper.h"
 
 typedef int(*lpCMBdecodeMag2)(char* Mag2Data, char * data);
 typedef int(*lpCMBdecodeEx)( char* MagData, char * type, char * data);
@@ -269,7 +270,7 @@ public:
 		}
 	}
 };
-class CCardSwiperFSM : public FSMImpl<CCardSwiperFSM>, public IFSMStateHooker
+class CCardSwiperFSM : public CCommDevFSM<CCardSwiperFSM, CardSwiperClass>, public IFSMStateHooker
 {
 public:
 	enum {s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11};
@@ -342,14 +343,14 @@ public:
 		FSM_RULE_ENTRY(s11, s2, USER_EVT_BIND_FWB_FINISHED, 2)
 		END_FSM_RULE()
 
-		CCardSwiperFSM() : m_pCardSwiper(NULL),m_bCancelAccept(false),m_bWaitingAccept(false),
+		CCardSwiperFSM() : m_bCancelAccept(false),m_bWaitingAccept(false),
 		m_bWaitAccepteMore(false),m_bExit(false),m_resetTimes(0),m_testResult(Error_Succeed)
 	//,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
 	,m_bCDA(false),m_pDataToARQC(NULL),m_bCancelRead(false),m_csVendor(""),m_csMachineType(""),m_csSite("")
 	, m_bReading(false), m_bNeedInitCh(true), m_connStatus(0), m_connChecking(false), m_periodResetCount(0)
 	,m_dwPeriodResetTime(0), m_bCancelQueryConn(true), m_nLastSentMsg(-1), m_nReadFailCnt(0), m_nAAStatus(-1)
 	, m_bResetInsertMore(false), m_csDevNo(""), m_bDoingBindFWB(false), m_bDevOpenEx(false),m_bBTScan(false)
-	, m_bInMainPage(false)
+	, m_bInMainPage(false),m_pubKey(nullptr)
 	{
 		HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x202);
 	}
@@ -394,13 +395,10 @@ public:
 	void s11_on_exit();
 	unsigned int s11_on_event(FSMEvent* event);
 
-	//void DataInit();
 	ErrorCodeEnum Load(CSimpleStringA csDevSN="");
 	ErrorCodeEnum DataTransferInit();
 	int Initial(CSimpleStringA csDevSN="",bool bInitChannel = true);
 	bool GetDevStatus();
-	int UnAcceptCard();
-	int WaitFetchingCard();
 	/*
 	-1: !Error_succeed
 	3: CancelRead
@@ -415,7 +413,6 @@ public:
 	int QueryCardInfo(SpReqAnsContext<CardSwiperService_QueryCardInfo_Req,CardSwiperService_QueryCardInfo_Ans>::Pointer ctx);
 	int Reset();
 	int Eject();
-	int InternalAcceptCard();
 	int MagTransInit(SpReqAnsContext<CardSwiperService_MagTransferInit_Req,CardSwiperService_MagTransferInit_Ans>::Pointer ctx);
 	//oiltmp 测试南天新加密通道
 	int TransInitEx(bool bPassvie = false);
@@ -628,12 +625,8 @@ private:
 	int m_resetTimes,m_testThreadCount,m_connStatus,m_periodResetCount;
 	//m_dwPeriodResetTime:一定时间内第一次重启时间
 	DWORD m_dwPeriodResetTime;
-	HMODULE m_hVerdorDll;
-//	GUIConsoleService_ClientBase *m_pGUIConsoleClient;
-	lpCreateDevCom CreateDevComponent;
-	lpReleaseDevCom ReleaseDevComponent;
-	lpCMBdecodeMag2 cmdDecodeMag2;
-	lpCMBdecodeEx cmdDecodeEx;	
+	lpCMBdecodeMag2 cmdDecodeMag2 = nullptr;
+	lpCMBdecodeEx cmdDecodeEx = nullptr;
 	bool m_devInit,m_bCancelAccept,m_bWaitingAccept,m_bWaitAccepteMore,m_bExit,m_bCancelRead
 		, m_bSM, m_bOnlineOnly, m_bCDA, m_bReading,m_bNeedInitCh,m_connChecking,m_bResetInsertMore
 		, m_bDoingBindFWB, m_bDevOpenEx, m_bBTScan, m_bInMainPage;
@@ -649,7 +642,6 @@ private:
 
 	//int m_CardInit,m_CardRemains,m_CardIssued,m_CardCaptured,m_CardMixed,m_CardPercent;
 	CardSwiperStatus devStatus;
-	CardSwiperClass* m_pCardSwiper;
 	DevStateEnum m_eDevState;
 	CCardProcess *m_pCardProcess;
 	CardReadType m_eReadType;
@@ -691,41 +683,7 @@ private:
 	CSimpleStringA TransferAboutVendorShortName(CSimpleStringA name);
 	DevCategoryInfo m_devCat;
 
-	HardwareEntityCode m_entCode;
-	CSimpleStringA m_csAlarmMsg;
-	DWORD UpdateDEC(DWORD dwVal = 0)
-	{
-		int reserved = 0;
-		reserved = (dwVal & 0xFC000) >> 14;
-		HARDWARE_ENTITY_SET_DEVCODE(m_entCode, dwVal, reserved);
-		return GetDEC();
-	}
-	DWORD GetDEC() const
-	{
-		return HARDWARE_ENTITY_MAKE_ERRORCODE(m_entCode);
-	}
-	//DWORD AlarmDEC() const {
-	//	return GetDEC();
-	//}
-	DWORD AlarmDECToBusiness(DWORD dwVal = 0) {
-		if (dwVal > 0)
-			UpdateDEC(dwVal);
-		//oilyang@20200528 according the meeting result,throw a LogError while answering ctx
-		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
-		DWORD dwCode = 0;
-		if ((m_entCode.dwVendorErroCode >> 20) == m_entCode.dwEntityId)
-			dwCode = m_entCode.dwVendorErroCode;
-		else
-			dwCode = HARDWARE_ENTITY_MAKE_ERRORCODE_TO_BUSINESS(m_entCode);
-		LogError(Severity_Middle, Error_Unexpect, dwCode, "");
-		return dwCode;
-	}
-	void ClearRelatedDEC()
-	{
-		UpdateDEC();
-		m_csAlarmMsg = "NO more information";
-	}
-	void LogErrMsg(const char *pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode = 0, BOOL bAlarm = FALSE);
+
 };
 struct InitTask : public ITaskSp
 {

+ 1 - 1
Module/mod_cardswiper/mod_cardswiper.h

@@ -2,7 +2,7 @@
 #include "CardSwiper_def_g.h"
 #include "CardSwiperClass.h"
 #include "CardSwiperFSM.h"
-#include "mod_DevAdptEntityBase.hpp"
+#include "DevEntityCommBase.hpp"
 
 using namespace CardSwiper;
 

+ 1 - 1
Module/mod_cardswiper/public.cpp

@@ -1,4 +1,4 @@
-#include "StdAfx.h"
+#include "stdafx.h"
 
 #include "public.h"
 #include <time.h>

+ 75 - 19
Module/mod_cardswiper/sm2.cpp

@@ -1,4 +1,4 @@
-#include "StdAfx.h"
+#include "stdafx.h"
 
 #include "sm2.h"
 #include "kdf.h"
@@ -588,11 +588,21 @@ int sm2_encrypt_new(char*random_k,char*ecpoint_PBx,char*ecpoint_PBy,const char *
 	
 	P = EC_POINT_new(group);
 	
-	if(!BN_hex2bn(&k,random_k))ABORT;//???k
+	if (!BN_hex2bn(&k, random_k)) {
+		printf("BN_hex2bn failed, abort!\n");
+		ABORT;//???k
+	}
+		
 	
-	if(!EC_POINT_mul(group,C1,k,NULL,NULL,ctx))ABORT;
+	if (!EC_POINT_mul(group, C1, k, NULL, NULL, ctx)) {
+		printf("EC_POINT_mul failed, abort!\n");
+		ABORT;
+	}
 	
-	if(!EC_POINT_get_affine_coordinates_GFp(group,C1,x,y,ctx))ABORT;
+	if (!EC_POINT_get_affine_coordinates_GFp(group, C1, x, y, ctx)) {
+		printf("EC_POINT_get_affine_coordinates_GFp failed, abort!\n");
+		ABORT;
+	}
 	
 
 	encLen = 0;
@@ -606,14 +616,29 @@ int sm2_encrypt_new(char*random_k,char*ecpoint_PBx,char*ecpoint_PBy,const char *
 	encLen += len + inlen;
 	
 
-	if(!BN_hex2bn(&x,ecpoint_PBx))ABORT;//xB
-	if(!BN_hex2bn(&y,ecpoint_PBy))ABORT;//yB
+	if (!BN_hex2bn(&x, ecpoint_PBx)) {
+		printf("BN_hex2bn for x failed, abort!\n");
+		ABORT;
+	}
+	if (!BN_hex2bn(&y, ecpoint_PBy)) {
+		printf("BN_hex2bn for y failed, abort!\n");
+		ABORT;
+	}
 	
-	if(!EC_POINT_set_affine_coordinates_GFp(group,PB,x,y,ctx))ABORT;
+	if (!EC_POINT_set_affine_coordinates_GFp(group, PB, x, y, ctx)) {
+		printf("EC_POINT_set_affine_coordinates_GFp for PB failed, abort!\n");
+		ABORT;
+	}
 	
-	if(!EC_POINT_mul(group,P,NULL,PB,k,ctx))ABORT;
+	if (!EC_POINT_mul(group, P, NULL, PB, k, ctx)) {
+		printf("EC_POINT_mul failed, abort!\n");
+		ABORT;
+	}
 	
-	if(!EC_POINT_get_affine_coordinates_GFp(group,P,x,y,ctx))ABORT;
+	if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) {
+		printf("EC_POINT_get_affine_coordinates_GFp for P failed, abort!\n");
+		ABORT;
+	}
 /*	
 	printf("P=[k]PB:\r\n");
 	BNPrintf(x);
@@ -706,10 +731,19 @@ int sm2_decrypt(const char*decdata,const char*dB,char*M)
 	memcpy(C2,decdata+130,mLen);
 	memcpy(C3,decdata+len-64,64);
 */
-	if(!BN_hex2bn(&x,xstr))ABORT;
-	if(!BN_hex2bn(&y,ystr))ABORT;
+	if (!BN_hex2bn(&x, xstr)) {
+		printf("BN_hex2bn for x failed, abort!\n");
+		ABORT;
+	}
+	if (!BN_hex2bn(&y, ystr)) {
+		printf("BN_hex2bn for y failed, abort!\n");
+		ABORT;
+	}
 
-	if(!EC_POINT_set_affine_coordinates_GFp(group,C1,x,y,ctx))ABORT;
+	if (!EC_POINT_set_affine_coordinates_GFp(group, C1, x, y, ctx)) {
+		printf("EC_POINT_set_affine_coordinates_GFp for C1 for y failed, abort!\n");
+		ABORT;
+	}
 /*
 	printf("C1:\r\n");
 	BNPrintf(x);
@@ -718,18 +752,40 @@ int sm2_decrypt(const char*decdata,const char*dB,char*M)
 	printf("\r\n");
 */
 
-	if(!EC_POINT_is_on_curve(group,C1,ctx))ABORT;
+	if (!EC_POINT_is_on_curve(group, C1, ctx)) {
+		printf("EC_POINT_is_on_curve failed, abort!\n");
+		ABORT;
+	}
 	
-	if(!EC_GROUP_get_cofactor(group,h,ctx))ABORT;
+	if (!EC_GROUP_get_cofactor(group, h, ctx)) {
+		printf("EC_GROUP_get_cofactor failed, abort!\n");
+		ABORT;
+	}
 
-	if(!EC_POINT_mul(group,S,NULL,C1,h,ctx))ABORT;
+	if (!EC_POINT_mul(group, S, NULL, C1, h, ctx)) {
+		printf("EC_POINT_mul failed, abort!\n");
+		ABORT;
+	}
 
-	if(EC_POINT_is_at_infinity(group,S))ABORT;	//SÊÇÎÞÇîÔ¶µã
+	if(EC_POINT_is_at_infinity(group,S))	//SÊÇÎÞÇîÔ¶µã
+	{
+		printf("EC_POINT_is_at_infinity failed, abort!\n");
+		ABORT;
+	}
 
-	if(!BN_hex2bn(&x,dB))ABORT;
-	if(!EC_POINT_mul(group,P,NULL,C1,x,ctx))ABORT;
+	if (!BN_hex2bn(&x, dB)) {
+		printf("BN_hex2bn failed, abort!\n");
+		ABORT;
+	}
+	if (!EC_POINT_mul(group, P, NULL, C1, x, ctx)) {
+		printf("EC_POINT_mul failed, abort!\n");
+		ABORT;
+	}
 
-	if(!EC_POINT_get_affine_coordinates_GFp(group,P,x,y,ctx))ABORT;
+	if (!EC_POINT_get_affine_coordinates_GFp(group, P, x, y, ctx)) {
+		printf("EC_POINT_get_affine_coordinates_GFp for P failed, abort!\n");
+		ABORT;
+	}
 /*
 	printf("P=[dB]C1:\r\n");
 	BNPrintf(x);

+ 1 - 1
Module/mod_cardswiper/sm3.cpp

@@ -15,7 +15,7 @@
 // Sample 2 
 // Input:"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"
 // Outpuf:debe9ff9 2275b8a1 38604889 c18e5a4d 6fdb70e5 387e5765 293dcba3 9c0c5732
-#include "StdAfx.h"
+#include "stdafx.h"
 #include "sm3.h"
 #include <string.h>
 #include <stdio.h>

+ 60 - 112
Module/mod_pinpad/PinPadFSM.cpp

@@ -6,7 +6,6 @@
 #include "ModuleMix.h"
 #include "PinPad_UserErrorCode.h"
 #include "CommDevEntityErrorCode.h"
-#include "mod_DevAdptEntityBase.hpp"
 #include <map>
 #include <thread>
 #include <chrono>
@@ -41,29 +40,6 @@ ErrorCodeEnum CPinPadFSM::OnInit()
 		m_bPinPadNeedless = TRUE;
 	if (_strnicmp((const char*)m_csMachineType, "RVC.IL", strlen("RVC.IL")) == 0)
 		m_bRVCIL = true;
-	CEntityStaticInfo esi = {0};
-	ErrorCodeEnum ec = GetEntityBase()->GetFunction()->GetEntityStaticInfo(
-		GetEntityBase()->GetEntityName(), esi);
-	if(ec == Error_Succeed)
-	{
-		Dbg("wEntityDevelopID: 0x%X", esi.wEntityDevelopID);
-		HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, esi.wEntityDevelopID);
-	}
-
-	//CEntityRunInfo eri = {0};
-	//ec = GetEntityBase()->GetFunction()->GetSelfEntityRunInfo(eri);
-	//if(ec == Error_Succeed)
-	//{
-	//	Dbg("dwEntityInstanceID: 0x%X", eri.dwEntityInstanceID);
-	//}
-
-	//m_hInputEvt = CreateEventA(NULL,FALSE,FALSE,NULL);
-	//if (m_hInputEvt == NULL)
-	//{
-	//	Dbg("CreateEvent failed(%d).",GetLastError());
-	//	LogWarn(Severity_Middle, Error_Unexpect, AlarmDECToBusiness(MEC_CREATE_EVENT_FAILED), "OnInit:CreateEventA failed.");
-	//	return Error_Resource;
-	//}
 
 	std::thread tmp_thread(&CPinPadFSM::DoWork, this);
 	tmp_thread.detach();
@@ -77,16 +53,10 @@ ErrorCodeEnum CPinPadFSM::OnExit()
 	//SetEvent(m_hInputEvt);
 	m_hInputConVar.Broadcast();
 	ErrorCodeEnum eErr = Error_Succeed;
-	if (m_pPinPad != NULL)
+	if (m_hDevHelper)
 	{
-		m_pPinPad->StopInput();
-		eErr = ReleaseDevComponent((DeviceBaseClass*&)m_pPinPad);
-		if (eErr != Error_Succeed)
-		{
-			LogWarn(Severity_Middle, Error_Unexpect, AlarmDECToBusiness(MEC_DEV_OBJECT_RELEASE_FAILED), "OnExit:ReleaseDevComponent failed.");
-			Dbg("ReleaseDevComponent failed(%d).",eErr);
-		}
-		m_pPinPad = NULL;
+		m_hDevHelper->StopInput();
+		m_hDevHelper.TearDown();
 	}
 	return eErr;
 }
@@ -475,7 +445,7 @@ int CPinPadFSM::Initial()
 	do
 	{
 		Dbg("dodo");
-		if (m_pPinPad == NULL)
+		if (!m_hDevHelper)
 		{
 			eErrCode = m_hDevHelper.CreateDevAdptObject();
 			if(eErrCode != Error_Succeed)
@@ -485,22 +455,21 @@ int CPinPadFSM::Initial()
 				initTries++;
 				continue;
 			}
-			m_pPinPad = m_hDevHelper.GetDevPointer();
 		}
 		//PinPadInitParam initParam;
 
 
 		Dbg("%d,%d",port,baudRate);
-		hr = m_pPinPad->DevOpen(port,baudRate);
+		hr = m_hDevHelper->DevOpen(port,baudRate);
 
 		if (hr == Error_Succeed)
 		{
 			initTries = 0;
 			ErrorCodeEnum errCode1,errCode2,errCode3,errCode4;
-			errCode1 = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
-			errCode2 = m_pPinPad->SetParam(EPP_PT_SET_MAC_ALGORITH,EPP_MAC_ALGO_ASNIX99);
-			errCode3 = m_pPinPad->SetParam(EPP_PT_SET_PIN_ALGORITH,EPP_PIN_ALGO_ISO9564_1_ANSI);
-			errCode4 = m_pPinPad->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
+			errCode1 = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
+			errCode2 = m_hDevHelper->SetParam(EPP_PT_SET_MAC_ALGORITH,EPP_MAC_ALGO_ASNIX99);
+			errCode3 = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH,EPP_PIN_ALGO_ISO9564_1_ANSI);
+			errCode4 = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
 			if(errCode1 != Error_Succeed || errCode2 != Error_Succeed 
 				|| errCode3 != Error_Succeed || errCode4 != Error_Succeed)
 			{
@@ -532,7 +501,7 @@ int CPinPadFSM::Initial()
 	LOG_TRACE("Open pinpad suc.");
 	//oiltmp comment the following 20160406
 	//update with the version 1.7.1
-	m_encryptkey = m_pPinPad->GetEncryptFunc();
+	m_encryptkey = m_hDevHelper->GetEncryptFunc();
 	//m_encryptkey = 1;
 	eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
 	if (eErrDev != Error_Succeed)
@@ -557,7 +526,7 @@ int CPinPadFSM::Initial()
 	ZeroMemory(devInfo.szModel, MAX_DEV_MODEL_LEN);
 	ZeroMemory(devInfo.szType, MAX_DEV_TYPE_LEN);
 	ZeroMemory(devInfo.szVendor, MAX_DEV_VENDOR_LEN);
-	eErrDev = m_pPinPad->GetDevCategory(devInfo);
+	eErrDev = m_hDevHelper->GetDevCategory(devInfo);
 	if (eErrDev == Error_Succeed)
 	{
 		m_szModel = devInfo.szModel;
@@ -811,7 +780,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 	//memcpy(accInfo.account,"588571006555",12);
 	accInfo.dwAccLen = 12;
 	Dbg("acc(%s)",accInfo.account);
-	errCode = m_pPinPad->SetAccNo(accInfo);
+	errCode = m_hDevHelper->SetAccNo(accInfo);
 	if (errCode != Error_Succeed)
 	{
 		if (!bSM)
@@ -822,9 +791,9 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 		return Error_DevCommFailed;
 	}	
 	if (!bSMFlag)
-		errCode = m_pPinPad->ActiveWorkingKey(0,0);
+		errCode = m_hDevHelper->ActiveWorkingKey(0,0);
 	else
-		errCode = m_pPinPad->ActiveWorkingKey(1,0);
+		errCode = m_hDevHelper->ActiveWorkingKey(1,0);
 	if (errCode != Error_Succeed)
 	{
 		LOG_PINPAD_ERROR_MSG_MACRO(errCode, ActiveWorkingKey);
@@ -833,13 +802,13 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 	}	
 	if (!bSMFlag)
 	{
-		//errCode = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
-		errCode = m_pPinPad->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_ISO9564_1_ANSI);
+		//errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
+		errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_ISO9564_1_ANSI);
 	}
 	else
 	{
-		//errCode = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
-		errCode = m_pPinPad->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
+		//errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
+		errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
 	}
 	if (errCode != Error_Succeed)
 	{
@@ -848,7 +817,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 		return Error_DevCommFailed;
 	}
 	Dbg("to start");
-	errCode = m_pPinPad->StartPinInput(len);
+	errCode = m_hDevHelper->StartPinInput(len);
 	if (errCode != Error_Succeed)
 	{
 		LOG_PINPAD_ERROR_MSG_MACRO(errCode, StartPinInput);
@@ -884,7 +853,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 		//char ch[4] = {0};
 		BYTE btCh;
 		Sleep(100);
-		errCode = m_pPinPad->KeyRead(btCh);
+		errCode = m_hDevHelper->KeyRead(btCh);
 		if (errCode == Error_Succeed) {
 			LogEvent(Severity_Middle,LOG_EVT_PINPAD_OP,"PinPad op.");
 			if (btCh == 0x0d) {
@@ -947,7 +916,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 	//strOutput = buf;
 Err:
 	//oilyang 20131017 commented
-	//errCode = m_pPinPad->StopInput();
+	//errCode = m_hDevHelper->StopInput();
 	//if (errCode != Error_Succeed)
 	//	Dbg("StopInput failed(%d).",errCode);
 	//else
@@ -976,7 +945,7 @@ Err:
 	PinBlock pinBlk;
 	Dbg("to getpinblk");
 	Sleep(500);//nantian
-	errCode = m_pPinPad->GetPinBlock(pinBlk);
+	errCode = m_hDevHelper->GetPinBlock(pinBlk);
 	Dbg("getpinblock(%d),size:%d",errCode,pinBlk.dwSize);
 	if (errCode == Error_Succeed)
 	{
@@ -1011,11 +980,11 @@ Err:
 		memset(dstInfo.data,0,MAX_EN_DECRYPT_DATA_SIZE);
 		//set param
 		if (!bSMFlag)
-			errCode = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
+			errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
 		else
-			errCode = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
+			errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
 		if (errCode == Error_Succeed)
-			errCode = m_pPinPad->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
+			errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
 		
 		if (errCode != Error_Succeed)
 		{
@@ -1023,7 +992,7 @@ Err:
 			LOG_PINPAD_ERROR_MSG_MACRO(errCode, SetParam);
 			return Error_Param;
 		}
-			errCode = m_pPinPad->EncryptData(srcInfo,dstInfo);
+			errCode = m_hDevHelper->EncryptData(srcInfo,dstInfo);
 		//if (tmpCheckData != NULL)
 		//{
 		//	delete []tmpCheckData;
@@ -1103,7 +1072,7 @@ void CPinPadFSM::OpenInputText(void *pUserdata)
 
 	if (!m_bPlainOpen)
 	{
-		err = m_pPinPad->StartPlainInput();
+		err = m_hDevHelper->StartPlainInput();
 		if (err == Error_Succeed)
 		{
 			Dbg("start any input");
@@ -1134,14 +1103,14 @@ void CPinPadFSM::OpenInputText(void *pUserdata)
 	//{
 	//	m_dwPinPadRunCount = 0;
 	//	Dbg("stop input in period");
-	//	m_pPinPad->StopInput();
+	//	m_hDevHelper->StopInput();
 	//	m_bPlainOpen = false;
 	//}
 
 
 	BYTE btCh;
 	INT64 i64Start = get_tick_count();
-	err = m_pPinPad->KeyRead(btCh);
+	err = m_hDevHelper->KeyRead(btCh);
 	INT64 i64End = get_tick_count();
 	if ((i64End - i64Start) > 3000)//more than 3 seconds
 		Dbg("KeyRead cost more than %d seconds.", (i64End - i64Start)/1000);
@@ -1191,7 +1160,7 @@ ErrorCodeEnum CPinPadFSM::GetText(SpReqAnsContext<PinPadService_GetInput_Req, Pi
 	//bool bPlainOpen = false;
 	ErrorCodeEnum err;
 	//the following several lines just for Nantian as they close pinpad while mag encrypted improve. oilyang 20150513
-	err = m_pPinPad->StopInput();
+	err = m_hDevHelper->StopInput();
 	m_bPlainOpen = false;
 	Dbg("plain input for nt.%d",err);
 	Sleep(100);
@@ -1222,7 +1191,7 @@ ErrorCodeEnum CPinPadFSM::GetText(SpReqAnsContext<PinPadService_GetInput_Req, Pi
 		if (!m_bPlainOpen)
 		{
 			Dbg("start plain input");
-			err = m_pPinPad->StartPlainInput();
+			err = m_hDevHelper->StartPlainInput();
 			if (err == Error_Succeed)
 				m_bPlainOpen = true;
 			else
@@ -1234,11 +1203,11 @@ ErrorCodeEnum CPinPadFSM::GetText(SpReqAnsContext<PinPadService_GetInput_Req, Pi
 		BYTE btCh;
 		Sleep(100);//oiltest
 		//Dbg("start plain KeyRead");
-		err = m_pPinPad->KeyRead(btCh);
+		err = m_hDevHelper->KeyRead(btCh);
 		//Dbg("end plain KeyRead");
 		if (err == Error_Succeed) {
 			//DevErrorInfo devErrInfo;
-			//m_pPinPad->GetLastErr(devErrInfo);
+			//m_hDevHelper->GetLastErr(devErrInfo);
 			//Dbg("[%s]",devErrInfo.szErrMsg);
 			LogEvent(Severity_Middle,LOG_EVT_PINPAD_OP,"PinPad op(T).");
 			if (btCh == 0x0d) {
@@ -1356,7 +1325,7 @@ int CPinPadFSM::GetInput(SpReqAnsContext<PinPadService_GetInput_Req, PinPadServi
 	m_bExit = false;
 	LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_ON,"PinPad light on.");
 	//LogEvent(Severity_Middle,LOG_EVT_PINPAD_GREEN_ON,"PinPad green light on.");
-	if (m_pPinPad == NULL)
+	if (!m_hDevHelper)
 	{
 		LOG_TRACE("PinPad is not available£¡");
 		if (!bSM)
@@ -1390,7 +1359,7 @@ int CPinPadFSM::GetInput(SpReqAnsContext<PinPadService_GetInput_Req, PinPadServi
 		//oilyang@20200428 call StopInput
 		//if (m_bPlainOpen)
 		{
-			ErrorCodeEnum errClosePinPad = m_pPinPad->StopInput();
+			ErrorCodeEnum errClosePinPad = m_hDevHelper->StopInput();
 			Dbg("close pinpad(%d).",errClosePinPad);
 			Sleep(100);
 			m_bPlainOpen = false;
@@ -1432,7 +1401,7 @@ int CPinPadFSM::LoadKey(SpReqAnsContext<PinPadService_LoadKeys_Req, PinPadServic
 		spConfig = NULL;
 	}
 	if (m_bPlainOpen)
-		m_pPinPad->StopInput();
+		m_hDevHelper->StopInput();
 	//initialization need load master key
 	if (ctx->Req.initializeflag)
 	{
@@ -1442,7 +1411,7 @@ int CPinPadFSM::LoadKey(SpReqAnsContext<PinPadService_LoadKeys_Req, PinPadServic
 		memset(mkParam.key,0,MAX_MASTER_KEY_SIZE);
 		memcpy(mkParam.key,ctx->Req.masterkey,strlen(ctx->Req.masterkey));
 		//Dbg("%s,%d",mkParam.key,mkParam.dwSN);
-		eErr = m_pPinPad->LoadMasterKey(mkParam);
+		eErr = m_hDevHelper->LoadMasterKey(mkParam);
 		if (eErr != Error_Succeed)
 		{
 			Dbg("Load master key failed(%d).",eErr);
@@ -1467,7 +1436,7 @@ int CPinPadFSM::LoadKey(SpReqAnsContext<PinPadService_LoadKeys_Req, PinPadServic
 	memcpy(wkParam1.key,ctx->Req.workingkey1,strlen(ctx->Req.workingkey1));
 	memcpy(wkParam2.key,ctx->Req.workingkey2,strlen(ctx->Req.workingkey2));
 	wkParam1.smFlag = 0;
-	eErr = m_pPinPad->LoadWorkingKey(wkParam1);
+	eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
 	if (eErr != Error_Succeed)
 	{
 		Dbg("load working key 1 failed(%d).",eErr);
@@ -1480,7 +1449,7 @@ int CPinPadFSM::LoadKey(SpReqAnsContext<PinPadService_LoadKeys_Req, PinPadServic
 	}
 	Dbg("Load working key1 suc.");
 	wkParam2.smFlag = 0;
-	eErr = m_pPinPad->LoadWorkingKey(wkParam2);
+	eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
 	if (eErr != Error_Succeed)
 	{
 		Dbg("load working key 2 failed(%d).",eErr);
@@ -1512,9 +1481,9 @@ int CPinPadFSM::Encrypt(SpReqAnsContext<PinPadService_EncryptData_Req, PinPadSer
 	LOG_FUNCTION();
 	ErrorCodeEnum eErr;
 	//set param
-	eErr = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
+	eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
 	if (eErr == Error_Succeed)
-		eErr = m_pPinPad->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
+		eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_3DEC_CBC);
 
 	if (eErr != Error_Succeed)
 	{
@@ -1526,7 +1495,7 @@ int CPinPadFSM::Encrypt(SpReqAnsContext<PinPadService_EncryptData_Req, PinPadSer
 		return 0;
 	}
 	Dbg("SetParam ok.");
-	eErr = m_pPinPad->ActiveWorkingKey(0, 1);
+	eErr = m_hDevHelper->ActiveWorkingKey(0, 1);
 	if (eErr  != Error_Succeed)
 	{
 		//Dbg("pinpad activate WK error,(%d)",eErr);
@@ -1544,7 +1513,7 @@ int CPinPadFSM::Encrypt(SpReqAnsContext<PinPadService_EncryptData_Req, PinPadSer
 	srcData.dwSize = strlen(ctx->Req.data);
 	memcpy(srcData.data,ctx->Req.data,srcData.dwSize);
 	
-	eErr = m_pPinPad->EncryptData(srcData,dstData);
+	eErr = m_hDevHelper->EncryptData(srcData,dstData);
 	if (eErr != Error_Succeed)
 	{
 		//Dbg("Encrypt data failed(%d).",eErr);
@@ -1577,7 +1546,7 @@ int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadSe
 		spConfig = NULL;
 	}
 	if (m_bPlainOpen)
-		m_pPinPad->StopInput();
+		m_hDevHelper->StopInput();
 	bool bSM = false;
 	if (ctx->Req.smflag == 1)
 		bSM = true;
@@ -1594,7 +1563,7 @@ int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadSe
 		Dbg("mkey len:%d", strlen(ctx->Req.masterkey));
 		memcpy(mkParam.key,ctx->Req.masterkey,strlen(ctx->Req.masterkey));
 		//Dbg("%s,%d",mkParam.key,mkParam.dwSN);
-		eErr = m_pPinPad->LoadMasterKey(mkParam);
+		eErr = m_hDevHelper->LoadMasterKey(mkParam);
 		if (eErr != Error_Succeed)
 		{
 			Dbg("Load master key(%d),mkeysn:%d failed(%d).",bSM,mkParam.dwSN,eErr);
@@ -1628,7 +1597,7 @@ int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadSe
 	wkParam2.smFlag = ctx->Req.smflag;
 	memcpy(wkParam1.key,ctx->Req.workingkey1,strlen(ctx->Req.workingkey1));
 	memcpy(wkParam2.key,ctx->Req.workingkey2,strlen(ctx->Req.workingkey2));
-	eErr = m_pPinPad->LoadWorkingKey(wkParam1);
+	eErr = m_hDevHelper->LoadWorkingKey(wkParam1);
 	if (eErr != Error_Succeed)
 	{
 		Dbg("load working key 1(%d) failed(%d).",bSM,eErr);
@@ -1641,7 +1610,7 @@ int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadSe
 	}
 	Dbg("Load working key1(%d) suc.",bSM);
 
-	eErr = m_pPinPad->LoadWorkingKey(wkParam2);
+	eErr = m_hDevHelper->LoadWorkingKey(wkParam2);
 	if (eErr != Error_Succeed)
 	{
 		Dbg("load working key 2(%d) failed(%d).",bSM,eErr);
@@ -1683,12 +1652,12 @@ int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPa
 		bSM = true;
 	//set param
 	if (!bSM)
-		eErr = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
+		eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_3DES);
 	else
-		eErr = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_SM4);
+		eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD,EPP_ALGO_METHOD_SM4);
 
 	if (eErr == Error_Succeed)
-		eErr = m_pPinPad->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_CBC);
+		eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE,EPP_ALGO_MODE_CBC);
 
 	if (eErr != Error_Succeed)
 	{
@@ -1701,9 +1670,9 @@ int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPa
 	}
 	Dbg("SetParam ok.");
 	if (!bSM)
-		eErr = m_pPinPad->ActiveWorkingKey(0, 1);
+		eErr = m_hDevHelper->ActiveWorkingKey(0, 1);
 	else
-		eErr = m_pPinPad->ActiveWorkingKey(1, 1);
+		eErr = m_hDevHelper->ActiveWorkingKey(1, 1);
 	if (eErr  != Error_Succeed)
 	{
 		Dbg("pinpad activate WK error,(%d)",eErr);
@@ -1720,7 +1689,7 @@ int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPa
 	srcData.dwSize = strlen(ctx->Req.data);
 	memcpy(srcData.data,ctx->Req.data,srcData.dwSize);
 
-	eErr = m_pPinPad->EncryptData(srcData,dstData);
+	eErr = m_hDevHelper->EncryptData(srcData,dstData);
 	if (eErr != Error_Succeed)
 	{
 		Dbg("Encrypt data failed(%d).",eErr);
@@ -1750,16 +1719,16 @@ int CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCode_Req, Pin
 		Dbg("mSN:%d,wSN:%d", ctx->Req.mSN[i], ctx->Req.wSN[i]);
 		//set param
 		if (ctx->Req.mSN[i] == 1)
-			eErr = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
+			eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
 		else
-			eErr = m_pPinPad->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
+			eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
 		if (eErr == Error_Succeed)
-			eErr = m_pPinPad->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
+			eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
 		else
 		{
 			LOG_PINPAD_ERROR_MSG_MACRO(eErr, SetParam);
 		}
-		eErr = m_pPinPad->ActiveWorkingKey(ctx->Req.mSN[i], ctx->Req.wSN[i]);
+		eErr = m_hDevHelper->ActiveWorkingKey(ctx->Req.mSN[i], ctx->Req.wSN[i]);
 		if (eErr != Error_Succeed)
 		{
 			LOG_PINPAD_ERROR_MSG_MACRO(eErr, ActiveWorkingKey);
@@ -1774,7 +1743,7 @@ int CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCode_Req, Pin
 			srcInfo.dwSize = m_devCheckData.GetLength();
 			memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
 
-			eErr = m_pPinPad->EncryptData(srcInfo, dstInfo);
+			eErr = m_hDevHelper->EncryptData(srcInfo, dstInfo);
 
 			if (eErr != Error_Succeed)
 			{
@@ -1794,7 +1763,7 @@ bool CPinPadFSM::GetDevInfo(DevCategoryInfo &devInfo)
 	ZeroMemory(info.szModel, MAX_DEV_MODEL_LEN);
 	ZeroMemory(info.szType, MAX_DEV_TYPE_LEN);
 	ZeroMemory(info.szVendor, MAX_DEV_VENDOR_LEN);
-	ErrorCodeEnum eErrDev = m_pPinPad->GetDevCategory(info);
+	ErrorCodeEnum eErrDev = m_hDevHelper->GetDevCategory(info);
 	if (eErrDev == Error_Succeed)
 	{
 		m_szModel = info.szModel;
@@ -1852,28 +1821,7 @@ void CPinPadFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionCon
 	else
 		pTransactionContext->SendAnswer(m_testResult);
 	//DevCategoryInfo devCatInfo;
-	//ErrorCodeEnum eErr = m_pPinPad->GetDevCategory(devCatInfo);
-}
-void CPinPadFSM::LogErrMsg(const char *pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode, BOOL bAlarm) 
-{
-	WORD wdErrCode = 0;
-	CSimpleStringA csErrMsg(true);
-	ErrorCodeEnum ec = DeviceBaseHelper::GetAndSplitDevErrInfo(m_pPinPad, csErrMsg, wdErrCode,
-		bAlarm ? NULL : pMsgHead);
-	if(ec == Error_Succeed && wdErrCode != 0) {
-		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
-		if ((defaultDevCode >> 20) == m_entCode.dwEntityId)
-			UpdateDEC(defaultDevCode);
-		else
-			UpdateDEC(wdErrCode);
-	} else if(defaultDevCode != 0) {
-		UpdateDEC(defaultDevCode);
-	}
-	m_csAlarmMsg = CSimpleStringA::Format("%s failed EC= 0x%x : %s", pMsgHead, eErrCode, (LPCTSTR)csErrMsg);
-	if(bAlarm) {
-		LogWarn(Severity_High, eErrCode, AlarmDECToBusiness(), (LPCTSTR)m_csAlarmMsg);
-	}
-	return;
+	//ErrorCodeEnum eErr = m_hDevHelper->GetDevCategory(devCatInfo);
 }
 
 void CPinPadFSM::CrossTermCall(SpReqAnsContext<PinPadService_CrossTermCall_Req, PinPadService_CrossTermCall_Ans>::Pointer cctx)

+ 5 - 56
Module/mod_pinpad/PinPadFSM.h

@@ -6,7 +6,7 @@
 #include "SpFSM.h"
 #include "toolkit.h"
 #include "SpUtility.hpp"
-#include "mod_DevAdptEntityBase.hpp"
+#include "DevFSMCommBase.hpp"
 
 enum EvtType
 {
@@ -39,9 +39,7 @@ enum EvtType
 #include "PinPad_msg_g.h"
 
 #include "PinPadClass.h"
-#include "DevErrorCode.h"
 #include "DeviceCrossHelper.h"
-#include "DeviceBaseHelper.h"
 //using namespace PinPad;
 using PinPad::PinPadService_GetInput_Req;
 using PinPad::PinPadService_GetInput_Ans;
@@ -73,22 +71,15 @@ using namespace HeartBeat;
 #include <map>
 using namespace std;
 
-#include "DeviceBaseHelper.h"
-
 struct CtxInfo
 {
 	int dataSize;
 	LPVOID pCtx;
 };
-//typedef int (WINAPI *lpAa)();
-typedef ErrorCodeEnum (*lpCreateDevCom)(DeviceBaseClass *&baseObj);
-typedef ErrorCodeEnum ( *lpReleaseDevCom)(DeviceBaseClass *&pBaseObj);
 
 class CPinPadEntity;
 class CPinPadFSM;
 
-unsigned int __stdcall DoWork(void *pData);
-
 class PinPadInitFinishedEvent : public FSMEvent
 {
 public:
@@ -193,7 +184,7 @@ public:
 	}
 };
 
-class CPinPadFSM : public FSMImpl<CPinPadFSM>
+class CPinPadFSM : public CCommDevFSM<CPinPadFSM, PinPadClass>
 {
 public:
 	enum {s0,s1,s2,s3,s4,s5};
@@ -228,13 +219,14 @@ public:
 		FSM_RULE_ENTRY(s5, s0, USER_EVT_LOADKEY, 0)
 		END_FSM_RULE()
 
-		CPinPadFSM() : m_bDevInit(false), m_pPinPad(NULL), m_bFrontCancel(false),
+		CPinPadFSM() : m_bDevInit(false), m_bFrontCancel(false),
 		m_bWaitingMore(false), m_bExit(false), m_bPlainPin(true), m_ctx(NULL),
 		m_bEntityExit(false), m_bPinInput(false), m_bPlainOpen(false), m_bLoadKey(false), m_bEncrypt(false)
 		, m_dwDevCommFailCount(0), m_dwPinPadRunCount(0), m_eDevState(DEVICE_STATUS_NOT_READY), m_encryptkey(1)
 		, m_bSM(false), m_b3DESLoaded(false), m_bSMLoaded(false), m_bInMainPage(true), m_szModel(""), m_szType("")
 		, m_szVendor(""),m_csMachineType(true), m_csSite(true), m_terminalNo(true), m_bPinPadNeedless(FALSE)
-		, m_csAlarmMsg("NO more information"), m_bRVCIL(false){
+		, m_bRVCIL(false)
+	{
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x206);
 	}
 	~CPinPadFSM(){}
@@ -370,21 +362,14 @@ public:
 	SP::Toolkit::CConditionVarPlus m_hInitConVar;
 private:
 
-	//HANDLE m_hInputEvt,m_hInitEvt;
-	DevAdptLibHelper<PinPadClass> m_hDevHelper;
-	//HMODULE m_hVerdorDll;
-
 	SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer m_ctx;
 	SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer m_inputCtx;
 	SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer m_inputSMCtx;
-	lpCreateDevCom CreateDevComponent;
-	lpReleaseDevCom ReleaseDevComponent;
 	char m_szAccount[MAX_ACCOUNT_LEN];
 	bool m_bDevInit,m_bFrontCancel,m_bWaitingMore,m_bExit,m_bPlainPin,m_bEntityExit
 		,m_bPinInput,m_bPlainOpen,m_bLoadKey,m_bEncrypt,m_bSM,m_b3DESLoaded,m_bSMLoaded,m_bInMainPage
 		, m_bRVCIL;
 
-	PinPadClass* m_pPinPad;
 	CSimpleStringA m_deviceNo,m_devCheckData,m_keySN,m_keySNSM,m_szModel,m_szType,m_szVendor;
 	char m_buf[4];
 	ErrorCodeEnum m_testResult;
@@ -394,44 +379,8 @@ private:
 	CSimpleStringA m_csMachineType, m_csSite, m_terminalNo;
 	BOOL m_bPinPadNeedless;
 
-	HardwareEntityCode m_entCode;
-	CSimpleStringA m_csAlarmMsg;
 	map<int, CtxInfo> m_mapCtx;
 
-
-	DWORD UpdateDEC(DWORD dwVal = 0)
-	{
-		int reserved = 0;
-		reserved = (dwVal & 0xFC000) >> 14;
-		HARDWARE_ENTITY_SET_DEVCODE(m_entCode, dwVal, reserved);
-		return GetDEC();
-	}
-	DWORD GetDEC() const
-	{
-		return HARDWARE_ENTITY_MAKE_ERRORCODE(m_entCode);
-	}
-	//DWORD AlarmDEC() const {
-	//	return GetDEC();
-	//}
-	DWORD AlarmDECToBusiness(DWORD dwVal = 0) {
-		if (dwVal > 0)
-			UpdateDEC(dwVal);
-		//oilyang@20200528 according the meeting result,throw a LogError while answering ctx
-		//oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
-		DWORD dwCode = 0;
-		if ((m_entCode.dwVendorErroCode >> 20) == m_entCode.dwEntityId)
-			dwCode = m_entCode.dwVendorErroCode;
-		else
-			dwCode = HARDWARE_ENTITY_MAKE_ERRORCODE_TO_BUSINESS(m_entCode);
-		LogError(Severity_Middle, Error_Unexpect, dwCode, "");
-		return dwCode;
-	}
-	void ClearRelatedDEC()
-	{
-		UpdateDEC();
-		m_csAlarmMsg = "NO more information";
-	}
-	void LogErrMsg(const char *pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode = 0, BOOL bAlarm = FALSE);
 	bool GetAttachedTerminal(CSimpleStringA &csTerm);
 };
 

+ 1 - 1
Module/mod_pinpad/mod_PinPad.h

@@ -3,7 +3,7 @@
 
 #include "SpBase.h"
 #include "PinPadFSM.h"
-#include "mod_DevAdptEntityBase.hpp"
+#include "DevEntityCommBase.hpp"
 
 class PinPadServerSession : public PinPad::PinPadService_ServerSessionBase
 {

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác