소스 검색

#IQRV #comment 桥接适配器编写

80374374 1 년 전
부모
커밋
20bbfd0879

+ 0 - 1
DevAdapter/cmbsz/pinpad.1.1/pinpad_impl.h

@@ -23,7 +23,6 @@ public:
 
     //PinPadClass
     ErrorCodeEnum KeyRead(BYTE &ch);
-    ErrorCodeEnum PinRead(BYTE &ch);
 
     ErrorCodeEnum StartPinInput(BYTE byLen);
     ErrorCodeEnum StartPinInputConfirm(BYTE byLen);

+ 12 - 0
DevAdapter/self/CMakeLists.txt

@@ -1,5 +1,17 @@
 set(RVC_VENDOR_LIB_DIRS)
 
+STRING( REGEX REPLACE ".*/(.*)" "\\1" CURRENT_VENDOR ${CMAKE_CURRENT_SOURCE_DIR} )
+message(STATUS "CURRENT_VENDOR : ${CURRENT_VENDOR}")
+
+# VENDOR_CURRENT_{DEPS|INCLUDE|ASSET|LIB|BIN}_DIR 等定义已集成到该宏内
+rvc_define_dependen_dirs()
+
 add_subdirectory(liblog4vendor)
+if(MSVC)
+	add_subdirectory(pinpad)
+endif(MSVC)
+
+#  =-=-=-=-=-=-=-=-=-= {VendorName}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_aggereate_runtime_file()
 
 set(RVC_VENDOR_DEP_LIB_DIRS ${RVC_VENDOR_DEP_LIB_DIRS} ${RVC_VENDOR_LIB_DIRS} PARENT_SCOPE)

+ 43 - 0
DevAdapter/self/include/libPinPadLoader.h

@@ -0,0 +1,43 @@
+#ifdef LIBPINPADLOADER_EXPORTS
+#define LIBPINPADLOADER_API __declspec(dllexport)
+#else
+#define LIBPINPADLOADER_API __declspec(dllimport)
+#pragma comment(lib, "libPinPadLoader.lib")
+#endif
+
+#include "PinPadClass.h"
+
+#define MAX_LIBRARY_PATH_LENGTH 260
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_LoadDevObject(const char *libraryPath);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_ReleaseDevObject();
+//////////////////////////////////////////////////////////////////////////
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_GetDevCategory(DevCategoryInfo* pDevCategory);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_Reset();
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_DevClose();
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_GetLastErr(DevErrorInfo* pDevErrInfo);
+//////////////////////////////////////////////////////////////////////////
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_DevOpen(DWORD dwPort, DWORD dwBaudRate);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_KeyRead(BYTE* pKeyChar);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_SetAccNo(AccountInfo accInfo);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_LoadMasterKey(MasterKeyParam masterKey);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_LoadWorkingKey(WorkKeyParam wkKey);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_StartPinInput(BYTE byLen);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_StartPinInputConfirm(BYTE byLen);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_StartPlainInput();
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_StopInput();
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_GetPinBlock(PinBlock* pPinBlock);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo* pDestInfo);
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo* pDestInfo);
+LIBPINPADLOADER_API int Bridge_GetEncryptFunc();
+LIBPINPADLOADER_API ErrorCodeEnum Bridge_LoadMasterKeyEx(MasterKeyParamEx enMasterKey);
+
+#ifdef __cplusplus
+} // extern "C" {
+#endif

+ 19 - 0
DevAdapter/self/pinpad/CMakeLists.txt

@@ -0,0 +1,19 @@
+# 声明模块名称的前缀和名称
+rvc_dev_define_module("PinPad")
+
+# rvc_dev_config_library 内需要使用这三个参数,用于拼接输出的适配器文件名称
+set(${MODULE_PREFIX}_VENDOR ${CURRENT_VENDOR})
+set(${MODULE_PREFIX}_VERSION "1")
+set(${MODULE_PREFIX}_BATCH "1")
+
+# 包含要编译的实现文件,rvc_dev_config_library 内使用
+set(${MODULE_PREFIX}_SRCS SHARED
+        VirtualPinPadClass.cpp 
+        )
+
+# 适配器工程需要通过此宏替代 add_library
+rvc_dev_config_library(${MODULE_NAME} ${MODULE_PREFIX})
+
+
+#  =-=-=-=-=-=-=-=-=-= {适配器工程}/CMakeLists.txt 文件最后必须声明如下内容=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=
+rvc_dev_target_install(${MODULE_FULL_NAME})

+ 206 - 0
DevAdapter/self/pinpad/VirtualPinPadClass.cpp

@@ -0,0 +1,206 @@
+//
+// Created by LocalUser on 2019/1/7.
+//
+
+#include "VirtualPinPadClass.h"
+#include "libPinPadLoader.h"
+
+static VirtualPinPadClassImpl* object = NULL;
+
+VirtualPinPadClassImpl::VirtualPinPadClassImpl()
+{
+
+}
+
+VirtualPinPadClassImpl::~VirtualPinPadClassImpl()
+{
+
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::GetDevCategory(DevCategoryInfo& devCategory)
+{
+	ErrorCodeEnum result;
+	DevCategoryInfo inner;
+	result = Bridge_GetDevCategory(&inner);
+	if (result == Error_Succeed) {
+		strcpy_s(devCategory.szType, inner.szType);
+		strcpy_s(devCategory.szModel, inner.szModel);
+		strcpy_s(devCategory.szVendor, inner.szVendor);
+		devCategory.eState = inner.eState;
+		devCategory.version.wMajor = inner.version.wMajor;
+		devCategory.version.wMinor = inner.version.wMinor;
+		devCategory.version.wRevision = inner.version.wRevision;
+		devCategory.version.wBuild = inner.version.wBuild;
+	}
+	return result;
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::Reset()
+{
+	return Bridge_Reset();
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_DevOpen(dwPort, dwBaudRate));
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::DevClose()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_DevClose());
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::KeyRead(BYTE& ch)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	BYTE inner;
+	err = Bridge_KeyRead(&inner);
+	if (err == Error_Succeed) {
+		ch = inner;
+	}
+	return  (err);
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::StartPinInput(BYTE byLen)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_StartPinInput(byLen));
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::StartPinInputConfirm(BYTE byLen)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_StartPinInputConfirm(byLen));
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::StartPlainInput()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_StartPlainInput());
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::StopInput()
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_StopInput());
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::LoadMasterKey(MasterKeyParam masterKey)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_LoadMasterKey(masterKey));
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::LoadWorkingKey(WorkKeyParam wkKey)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_LoadWorkingKey(wkKey));
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_ActiveWorkingKey(dwMkSN, dwWkSN));
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	return (err = Bridge_SetParam(eType, eValue));
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo& destInfo)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	EnDecryptInfo inner;
+	err = Bridge_EncryptData(srcInfo, &inner);
+	if (err == Error_Succeed) {
+		destInfo.dwSize = inner.dwSize;
+		memcpy(destInfo.data, inner.data, MAX_EN_DECRYPT_DATA_SIZE);
+	}
+	return (err);
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo& destInfo)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	EnDecryptInfo inner;
+	err = Bridge_MacEncrypt(srcInfo, &inner);
+	if (err == Error_Succeed) {
+		destInfo.dwSize = inner.dwSize;
+		memcpy(destInfo.data, inner.data, MAX_EN_DECRYPT_DATA_SIZE);
+	}
+	return (err);
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::GetPinBlock(PinBlock& block)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	PinBlock inner;
+	err = Bridge_GetPinBlock(&inner);
+	if (err == Error_Succeed) {
+		block.dwSize = inner.dwSize;
+		memcpy(block.data, inner.data, MAX_PIN_BLOCK_SIZE);
+	}
+	return (err);
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::SetAccNo(AccountInfo accInfo)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	err = Bridge_SetAccNo(accInfo);
+	return (err);
+}
+
+int VirtualPinPadClassImpl::GetEncryptFunc()
+{
+	return Bridge_GetEncryptFunc();
+}
+
+ErrorCodeEnum VirtualPinPadClassImpl::GetLastErr(DevErrorInfo& devErrInfo)
+{
+	ErrorCodeEnum err = Error_Succeed;
+	DevErrorInfo inner;
+	err = Bridge_GetLastErr(&inner);
+	if (err == Error_Succeed) {
+		devErrInfo.dwErrMsgLen = inner.dwErrMsgLen;
+		strcpy_s(devErrInfo.szErrMsg, inner.szErrMsg);
+	}
+	return (err);
+}
+
+
+DEVICEBASE_API ErrorCodeEnum  CreateDevComponent(DeviceBaseClass*& pOutDevAptObj)
+{
+	ErrorCodeEnum result(Error_Unexpect);
+	if (object == NULL) {
+		char* buf;
+		DWORD size;
+		const char* var = "INVOKE_VENDOR_ADAPTER_NAME";
+		size = GetEnvironmentVariableA(var, NULL, 0);
+		//ERROR_ENVVAR_NOT_FOUND
+		if (size <= 0) {
+			return Error_InvalidState;
+		}
+		buf = new char[size + 3];
+		if (buf == NULL) {
+			return Error_Resource;
+		}
+		memset(buf, 0, sizeof(char) * (size + 3));
+		size = GetEnvironmentVariableA(var, buf, size);
+		result = Bridge_LoadDevObject(buf);
+		if (result == Error_Succeed) {
+			object = new VirtualPinPadClassImpl();
+		}
+		delete[] buf;
+	}
+	pOutDevAptObj = object;
+	return result;
+}
+
+DEVICEBASE_API ErrorCodeEnum  ReleaseDevComponent(DeviceBaseClass*& pInDevAptObj)
+{
+	return Error_Param;
+}

+ 40 - 0
DevAdapter/self/pinpad/VirtualPinPadClass.h

@@ -0,0 +1,40 @@
+#ifndef VIRTUAL_PINPAD_CLASS_HEADER_
+#define VIRTUAL_PINPAD_CLASS_HEADER_
+
+
+#include "PinPadClass.h"
+
+class VirtualPinPadClassImpl : public PinPadClass
+{
+public:
+	VirtualPinPadClassImpl();
+	~VirtualPinPadClassImpl();
+
+	ErrorCodeEnum DevOpen(DWORD dwPort, DWORD dwBaudRate);
+
+	//DeviceBaseClass
+	ErrorCodeEnum GetDevCategory(DevCategoryInfo& devCategory);
+	ErrorCodeEnum Reset();
+	ErrorCodeEnum DevClose();
+	ErrorCodeEnum GetLastErr(DevErrorInfo& devErrInfo);
+
+	//PinPadClass
+	ErrorCodeEnum KeyRead(BYTE& ch);
+
+	ErrorCodeEnum StartPinInput(BYTE byLen);
+	ErrorCodeEnum StartPinInputConfirm(BYTE byLen);
+
+	ErrorCodeEnum StartPlainInput();
+	ErrorCodeEnum StopInput();
+	ErrorCodeEnum LoadMasterKey(MasterKeyParam masterKey);
+	ErrorCodeEnum LoadWorkingKey(WorkKeyParam wkKey);
+	ErrorCodeEnum ActiveWorkingKey(DWORD dwMkSN, DWORD dwWkSN);
+	ErrorCodeEnum SetParam(SetParamTypeEnum eType, SetParamValueEnum eValue);
+	ErrorCodeEnum EncryptData(EnDecryptInfo srcInfo, EnDecryptInfo& destInfo);
+	ErrorCodeEnum MacEncrypt(EnDecryptInfo srcInfo, EnDecryptInfo& destInfo);
+	ErrorCodeEnum GetPinBlock(PinBlock& block);
+	ErrorCodeEnum SetAccNo(AccountInfo accInfo);
+	int GetEncryptFunc();
+};
+
+#endif //VIRTUAL_PINPAD_CLASS_HEADER_

+ 44 - 19
Module/include/DevFSMCommBase.hpp

@@ -164,33 +164,57 @@ inline static VendorNameType GetCurVendorType(LPCTSTR vendorName)
 template <typename TSubAdpt>
 struct DevAdptLibHelper
 {
-	ErrorCodeEnum LoadLibAddress(const CSimpleStringA& strFullLibPath)
+private:
+
+	bool PreLoadLib(CSimpleStringA& strFullLibPath)
 	{
-		ErrorCodeEnum erroCode = Error_Succeed;
+		bool result(false);
+		///*TODO: Test (80374374@1/23/2024)*/
+		DWORD d1;
+		DWORD d2;
+		DWORD d3;
+		DWORD d4;
+
+		GetDllVersionInfo(strFullLibPath, d1, d2, d3, d4);
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("dll version: %d.%d.%d.%d", d1, d2, d3, d4);
+		CSimpleStringA strTest = strFullLibPath.GetData();
+		if (strTest.IndexOf("PinPad") != -1) {
+			int index = -1;
+			for (int i = 0; i < strTest.GetLength(); ++i)
+				if (strTest[i] == '\\' || strTest[i] == '/') index = i;
+			if (index != -1) {
+				toolkit_setenv("INVOKE_VENDOR_ADAPTER_NAME", strFullLibPath.GetData());
+				CSimpleStringA strAdapterName = strTest.SubString(index + 1);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("adapter name:%s", strAdapterName);
+				strTest[index + 1] = '\0'; //!!!!
+				strFullLibPath = strTest.SubString(0, index + 1);
+				strFullLibPath += "PinPad.self.1.1.dll";
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("new adapter path:%s", strFullLibPath.GetData());
+				result = true;
+			}
+		}
+		return result;
+	}
 
-		bool isVS2010Compiled = true;
-		///*TODO:  (80374374@1/22/2024)*/
-		do 
-		{
-			DWORD d1;
-			DWORD d2;
-			DWORD d3;
-			DWORD d4;
+public:
 
-			GetDllVersionInfo(strFullLibPath, d1, d2, d3, d4);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("dll version: %d.%d.%d.%d", d1, d2, d3, d4);
-		} while (false);
+	ErrorCodeEnum LoadLibAddress(const CSimpleStringA& strFullLibPath)
+	{
+		ErrorCodeEnum erroCode = Error_Succeed;
+		CSimpleStringA strTemp = strFullLibPath.GetData();
+		m_VS2010BridgeMode = PreLoadLib(strTemp);
 
 		do {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to load lib: %s", strFullLibPath.GetData());
-			if (!ExistsFileA(strFullLibPath)) {
-				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("the lib file %s is not existed!", strFullLibPath.GetData());
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to load lib: %s", strTemp.GetData());
+			if (!ExistsFileA(strTemp)) {
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("the lib file %s is not existed!", strTemp.GetData());
 				erroCode = Error_NotExist;
 				break;
 			}
-			int res = toolkit_dlopen(strFullLibPath, &m_lib);
+
+			int res = toolkit_dlopen(strTemp, &m_lib);
 			if (res != 0) {
-				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("toolkit_dlopen[%s] failed with error %s.", strFullLibPath.GetData(), toolkit_dlerror(&m_lib));
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("toolkit_dlopen[%s] failed with error %s.", strTemp.GetData(), toolkit_dlerror(&m_lib));
 				erroCode = Error_DevLoadFileFailed;
 				break;
 			}
@@ -384,7 +408,7 @@ struct DevAdptLibHelper
 
 	DevAdptLibHelper()
 		: pFuncCreateAdapt(nullptr), pFuncReleaseAdapt(nullptr)
-		, m_AdptObjPtr(nullptr)
+		, m_AdptObjPtr(nullptr), m_VS2010BridgeMode(false)
 	{
 		memset(&m_lib, 0, sizeof(toolkit_lib_t));
 	}
@@ -405,6 +429,7 @@ private:
 	DevAdaptObjReleaseFunc pFuncReleaseAdapt;
 
 	TSubAdpt* m_AdptObjPtr;
+	bool m_VS2010BridgeMode;
 };