Просмотр исходного кода

#IQRV #comment 合并最新预上线版本内容

gifur 4 лет назад
Родитель
Сommit
ffa7267582

+ 78 - 36
CMakeLists.txt

@@ -52,6 +52,11 @@ else()
 endif()
 
 set(DEVOPS_ON FALSE)
+set(FORMAT_UPDATE_PKG FALSE)
+if(WITH_UPDATE_FORMAT AND NOT PACK_AS_DEB_PKG)
+	set(FORMAT_UPDATE_PKG TRUE)
+endif(WITH_UPDATE_FORMAT AND NOT PACK_AS_DEB_PKG)
+
 if(MSVC)
 	set(TARGET_PLATFORM Windows)
 else()
@@ -72,7 +77,7 @@ if($ENV{PIPELINE_BUILD_ID})
 endif()
 
 #Set the project version
-set(RAW_VERSION_STRING "0.1.1-dev1")
+set(RAW_VERSION_STRING "0.1.2-dev1")
 string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
 
 set(VERSION_REGEX "^.?([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)")
@@ -101,6 +106,16 @@ if(DEVOPS_ON)
 		message(STATUS "UAT devops environment, reset build number.")
 		unset(RVC_VERSION_SUFFIX)
 	endif(IS_DEVOPS_UAT)
+
+	if(DEFINED ENV{BUILD_UPDATE_FORMAT} AND NOT PACK_AS_DEB_PKG)
+		if($ENV{BUILD_UPDATE_FORMAT})
+			set(FORMAT_UPDATE_PKG TRUE)
+			message(STATUS "test: $ENV{BUILD_UPDATE_FORMAT}")
+		else()
+			set(FORMAT_UPDATE_PKG FALSE)
+		endif($ENV{BUILD_UPDATE_FORMAT})
+	endif()
+
 elseif(BUILD_NUMBER EQUAL 0)
 	set(BUILD_NUMBER ${RVC_DEV_NUM})
 endif(DEVOPS_ON)
@@ -332,6 +347,12 @@ set(PACK_INSTALL_RUN_DIR "Run")
 set(PACK_INSTALL_RVC_DIR "rvc")
 set(PACK_INSTALL_PREFIX_VERSION "${PACK_INSTALL_RUN_DIR}/version")
 set(PACK_INSTALL_PREFIX_CUR_VER "${PACK_INSTALL_PREFIX_VERSION}/${RVC_VERSION}")
+set(PACK_INSTALL_DATA_DIR "${PACK_INSTALL_RVC_DIR}/adData")
+
+if(FORMAT_UPDATE_PKG)
+	set(PACK_INSTALL_PREFIX_CUR_VER "${PACK_INSTALL_RUN_DIR}")
+	set(PACK_INSTALL_DATA_DIR "Data")
+endif(FORMAT_UPDATE_PKG)
 
 set(RVC_INCLUDE_PATH  "${PACK_INSTALL_PREFIX_CUR_VER}/include")
 set(RVC_LIBRARY_PATH   "${PACK_INSTALL_PREFIX_CUR_VER}/lib")
@@ -353,8 +374,14 @@ else()
 	set(CMAKE_INSTALL_LIBDIR ${RVC_RUNTIME_PATH})
 endif(MSVC)
 
+if(FORMAT_UPDATE_PKG)
+set(CPACK_SYSTEM_NAME "${TARGET_PLATFORM}-${BUILD_YEAR}${BUILD_MONTH}${BUILD_DAY}")
+set(CPACK_TOPLEVEL_TAG "${TARGET_PLATFORM}-${BUILD_YEAR}${BUILD_MONTH}${BUILD_DAY}")
+else(FORMAT_UPDATE_PKG)
 set(CPACK_SYSTEM_NAME "${TARGET_PLATFORM}-${BUILD_TYPE_NAME}")
 set(CPACK_TOPLEVEL_TAG "${TARGET_PLATFORM}-${BUILD_TYPE_NAME}")
+endif(FORMAT_UPDATE_PKG)
+
 
 if(MSVC)
 	string(REPLACE "\\" "/" OUTPUT_VERSION_DIR_PATH ${OUTPUT_VERSION_DIR_PATH})
@@ -437,7 +464,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
 
 # Configure files
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/addin/cfg/shell.ini.in" ${CMAKE_BINARY_DIR}/shell.ini @ONLY)
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/addin/Run.ini.in" "${CMAKE_BINARY_DIR}/Run.ini" @ONLY)
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/addin/Run.ini.in" "${CMAKE_BINARY_DIR}/Run.ini" @ONLY NEWLINE_STYLE CRLF)
 
 if(SIMULATE_ON)
 	if(EXISTS "${RVC_INSTALL_PREFIX}${CMAKE_INSTALL_BINDIR}" AND IS_DIRECTORY "${RVC_INSTALL_PREFIX}${CMAKE_INSTALL_BINDIR}")
@@ -490,8 +517,13 @@ set(CMAKE_INSTALL_LOCAL_ONLY ON)
 # Config package information.
 set(CPACK_SOURCE_IGNORE_FILES "/\\\\.git/;/\\\\.gitignore;/CMakeCache.txt;/\\\\build;/\\\\out")
 string(TOLOWER ${CMAKE_PROJECT_NAME} CMAKE_PROJECT_NAME_lower)
-set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PACK_VERSION_NAME}-${CPACK_SYSTEM_NAME}")
-set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PACK_VERSION_NAME}-${CPACK_SYSTEM_NAME}")
+if(FORMAT_UPDATE_PKG)
+	set(CPACK_PACKAGE_NAME_PREFIX "updateRaw")
+else(FORMAT_UPDATE_PKG)
+	set(CPACK_PACKAGE_NAME_PREFIX "${CMAKE_PROJECT_NAME}")
+endif(FORMAT_UPDATE_PKG)
+set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME_PREFIX}-${PACK_VERSION_NAME}-${CPACK_SYSTEM_NAME}")
+set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME_PREFIX}-${PACK_VERSION_NAME}-${CPACK_SYSTEM_NAME}")
 # 
 set(CPACK_PACKAGE_NAME "RvcTerminalApplication")
 set(CPACK_PACKAGE_VENDOR "RVC-CCDG")
@@ -520,16 +552,18 @@ else(MSVC)
 		include(debian)
 		message(STATUS "set deb package file type")
 	else()
-		if( NOT CPACK_GENERATOR)
-			# set(CPACK_GENERATOR "ZIP")
-			# message(STATUS "set zip package file type")
-			set(CPACK_GENERATOR "TGZ")
-			message(STATUS "set tgz package file type")
+		if(NOT CPACK_GENERATOR)
+			if(FORMAT_UPDATE_PKG)
+				set(CPACK_GENERATOR "ZIP")
+				message(STATUS "set zip package file type")
+			else(FORMAT_UPDATE_PKG)
+				set(CPACK_GENERATOR "TGZ")
+				message(STATUS "set tgz package file type")
+			endif(FORMAT_UPDATE_PKG)
 		endif()
 	endif(PACK_AS_DEB_PKG)
 endif(MSVC)
 
-
 if(MSVC)
 	if(MSVC_RUNTIME STREQUAL "dynamic")
 	# the INSTALL command is not called. The user can use the variable 
@@ -557,32 +591,40 @@ install(DIRECTORY "${CMAKE_SOURCE_DIR}/addin/cfg" DESTINATION "${PACK_INSTALL_PR
 install(DIRECTORY "${CMAKE_SOURCE_DIR}/addin/cfg" DESTINATION "${PACK_INSTALL_PREFIX_CUR_VER}" 
 	COMPONENT scripts FILES_MATCHING PATTERN "*.xml")
 install(FILES ${CMAKE_BINARY_DIR}/shell.ini DESTINATION ${RVC_CONFIG_PATH} COMPONENT scripts)
-set(active_txt_file "${CMAKE_BINARY_DIR}/active.txt")
-file(WRITE ${active_txt_file} "${RVC_VERSION}")
-install(FILES ${active_txt_file} DESTINATION ${PACK_INSTALL_PREFIX_VERSION} COMPONENT scripts)
+
+if(NOT FORMAT_UPDATE_PKG)
+	set(active_txt_file "${CMAKE_BINARY_DIR}/active.txt")
+	file(WRITE ${active_txt_file} "${RVC_VERSION}")
+	install(FILES ${active_txt_file} DESTINATION ${PACK_INSTALL_PREFIX_VERSION} COMPONENT scripts)
+endif(NOT FORMAT_UPDATE_PKG)
 # Install RunInfo Directory
 # install(DIRECTORY "${CMAKE_SOURCE_DIR}/addin/runinfo" DESTINATION "${PACK_INSTALL_RUN_DIR}" 
 #	COMPONENT scripts FILES_MATCHING PATTERN "*.ini")
 
-if(MSVC)
-	file(GLOB BAT_SCRIPTS "${CMAKE_SOURCE_DIR}/addin/startup_scripts/*.vbs")
-	install(FILES "${CMAKE_SOURCE_DIR}/rvc_test.bat" DESTINATION ${OUTPUT_CUR_DISK_PATH}  COMPONENT scripts)
-	install(FILES "${CMAKE_SOURCE_DIR}/addin/hardwarecfg/${ROOT_INI_NAME}" 
-	DESTINATION "${PACK_INSTALL_RUN_DIR}/hardwarecfg" 
-	RENAME "root.ini"
-	COMPONENT scripts)
-else(MSVC)
-	file(GLOB BAT_SCRIPTS "${CMAKE_SOURCE_DIR}/addin/startup_scripts/*.sh")
-	file(GLOB VENDOR_ROOT_CONFIG_FILES "${CMAKE_SOURCE_DIR}/addin/hardwarecfg/uos/root-*.ini")
-	install(FILES ${VENDOR_ROOT_CONFIG_FILES} DESTINATION "${PACK_INSTALL_RUN_DIR}/hardwarecfg" COMPONENT scripts)
-endif(MSVC)
-
-install(PROGRAMS ${BAT_SCRIPTS} DESTINATION "${PACK_INSTALL_PREFIX_VERSION}" COMPONENT scripts)
-
-install(FILES "${CMAKE_BINARY_DIR}/Run.ini" DESTINATION "${PACK_INSTALL_RUN_DIR}/./.." COMPONENT scripts)
-if(NOT MSVC AND NOT PACK_AS_DEB_PKG)
-	install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/install.sh" DESTINATION "${PACK_INSTALL_RUN_DIR}/./.." COMPONENT scripts)
-endif(NOT MSVC AND NOT PACK_AS_DEB_PKG)
+if(NOT FORMAT_UPDATE_PKG)
+	if(MSVC)
+		file(GLOB BAT_SCRIPTS "${CMAKE_SOURCE_DIR}/addin/startup_scripts/*.vbs")
+		install(FILES "${CMAKE_SOURCE_DIR}/rvc_test.bat" DESTINATION ${OUTPUT_CUR_DISK_PATH}  COMPONENT scripts)
+		install(FILES "${CMAKE_SOURCE_DIR}/addin/hardwarecfg/${ROOT_INI_NAME}" 
+		DESTINATION "${PACK_INSTALL_RUN_DIR}/hardwarecfg" 
+		RENAME "root.ini"
+		COMPONENT scripts)
+	else(MSVC)
+		file(GLOB BAT_SCRIPTS "${CMAKE_SOURCE_DIR}/addin/startup_scripts/*.sh")
+		file(GLOB VENDOR_ROOT_CONFIG_FILES "${CMAKE_SOURCE_DIR}/addin/hardwarecfg/uos/root-*.ini")
+		install(FILES ${VENDOR_ROOT_CONFIG_FILES} DESTINATION "${PACK_INSTALL_RUN_DIR}/hardwarecfg" COMPONENT scripts)
+	endif(MSVC)
+	install(PROGRAMS ${BAT_SCRIPTS} DESTINATION "${PACK_INSTALL_PREFIX_VERSION}" COMPONENT scripts)
+endif(NOT FORMAT_UPDATE_PKG)
+
+if(FORMAT_UPDATE_PKG)
+	install(FILES "${CMAKE_BINARY_DIR}/Run.ini" DESTINATION "${PACK_INSTALL_RUN_DIR}/./.." COMPONENT scripts)
+else(FORMAT_UPDATE_PKG)
+	# TODO: rewrite install.sh to match update pacakge.
+	if(NOT MSVC AND NOT PACK_AS_DEB_PKG)
+		install(PROGRAMS "${CMAKE_SOURCE_DIR}/addin/install.sh" DESTINATION "${PACK_INSTALL_RUN_DIR}/./.." COMPONENT scripts)
+	endif(NOT MSVC AND NOT PACK_AS_DEB_PKG)
+endif(FORMAT_UPDATE_PKG)
 
 list(REMOVE_DUPLICATES RVC_CONAN_DEP_LIBS)
 if(CONAN_LIB_DIRS_QT)
@@ -628,17 +670,17 @@ install(FILES ${ENTITY_INTERFACE_XML_FILES} DESTINATION "${PACK_INSTALL_PREFIX_C
 file(GLOB RVC_RESOURCE_FILES LIST_DIRECTORIES FALSE "${CMAKE_SOURCE_DIR}/addin/assets/*")
 install(FILES ${RVC_RESOURCE_FILES} DESTINATION ${RVC_RUNTIME_PATH} COMPONENT resources)
 
-install(DIRECTORY "${CONAN_RES_DIRS_AUDIO}" DESTINATION "${PACK_INSTALL_RVC_DIR}/adData" COMPONENT resources)
-install(DIRECTORY "${CONAN_RES_DIRS_VIDEO}" DESTINATION "${PACK_INSTALL_RVC_DIR}/adData" COMPONENT resources)
+install(DIRECTORY "${CONAN_RES_DIRS_AUDIO}" DESTINATION "${PACK_INSTALL_DATA_DIR}" COMPONENT resources)
+install(DIRECTORY "${CONAN_RES_DIRS_VIDEO}" DESTINATION "${PACK_INSTALL_DATA_DIR}" COMPONENT resources)
 
 if(CONAN_RES_DIRS_SOGOUIME)
 	message(STATUS "include sogou input installation.")
-	install(DIRECTORY "${CONAN_RES_DIRS_SOGOUIME}" DESTINATION "${PACK_INSTALL_RVC_DIR}/adData" COMPONENT resources)
+	install(DIRECTORY "${CONAN_RES_DIRS_SOGOUIME}" DESTINATION "${PACK_INSTALL_DATA_DIR}" COMPONENT resources)
 endif(CONAN_RES_DIRS_SOGOUIME)
 
 if(CONAN_RES_DIRS_HYQIHEITTF)
 	message(STATUS "include font installation.")
-	install(DIRECTORY "${CONAN_RES_DIRS_HYQIHEITTF}" DESTINATION "${PACK_INSTALL_RVC_DIR}/adData" COMPONENT resources)
+	install(DIRECTORY "${CONAN_RES_DIRS_HYQIHEITTF}" DESTINATION "${PACK_INSTALL_DATA_DIR}" COMPONENT resources)
 endif(CONAN_RES_DIRS_HYQIHEITTF)
 
 if(CEF_BIN_DIR)

+ 62 - 52
DevAdapter/include/CardAssist.cpp

@@ -2249,7 +2249,7 @@ int CCardProcess::SplitOnlineReplyData(const char *pData,int size)
 	}
 	return 0;
 }
-int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCardX, const char *pAID, int &cardType)
+int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA>pAIDs, int& cardType)
 {
 	LOG_FUNCTION();
 	bool bIC = DetectIfICCard(eType,pCardX,cardType);
@@ -2258,7 +2258,8 @@ int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCard
 		Dbg("not ic card.");
 		return -1;
 	}
-	bool bGetICData = GetICDataFromCard(eType,pCardX,pAID);
+	bool bGetICData = false;
+	bGetICData = GetICDataFromCard(eType, pCardX, pAIDs);
 	if (!bGetICData)
 	{
 		Dbg("GetICDataFromCard failed.");
@@ -2268,64 +2269,73 @@ int CCardProcess::DetectAndReadICData(CardReadType eType, DeviceBaseClass *pCard
 
 	return 0;
 }
-bool CCardProcess::GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX,const char *pAID)
+bool CCardProcess::GetICDataFromCard(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA> pAIDs)
 {
 	LOG_FUNCTION();
-	//暂时只有一个,需要改成通用处理么。。。oiltmp
-	//aidflag ? oiltmp
 	AIDData aidData;
 	aidData.aid = new BYTE[32];//oiltmp
-	memset(aidData.aid,0,32);
-	int aidLen = StrBuf2HexBuf(pAID,&aidData.aid);
-	Dbg("str2hex len[%d]",aidLen);
-	aidData.len = aidLen;
-	char* aidTest = new char[128];
-	//char* aidTest2 = new char[128];
-	//memset(aidTest2,0,128);
-	//memcpy(aidTest2,aidData.aid,10);
-	int aidStrLen = HexBuf2StrBuf(aidData.aid,&aidTest,5);
-	Dbg("hex2str len[%d]",aidStrLen);
-	Dbg("aid[%s][%s]",pAID,aidTest);
-	vector<AIDData> vAIDs;
-	vAIDs.push_back(aidData);
-	//ErrorCodeEnum eErr = BuildSupportedAppList(vAIDs);
-
-	ErrorCodeEnum eErr = Error_Unexpect;
-	if (eType == CARD_MACHINE_ISSUER)
-	{
-		pCardI = dynamic_cast<CardIssuerClass*>(pCardX);
-	}
-	else if (eType == CARD_MACHINE_SWIPER || eType == CARD_MACHINE_SWIPER_RF)
-	{
-		pCardS = dynamic_cast<CardSwiperClass*>(pCardX);
-	}
-	else if (eType == CARD_MACHINE_RFIC)
-	{
-		pCardR = dynamic_cast<RFICClass*>(pCardX);
-	}
-	eErr = BuildSupportedAppList(eType,pCardX,vAIDs);
-	if (eErr != Error_Succeed)
+	memset(aidData.aid, 0, 32);
+	for (int index = 0; index < pAIDs.GetCount(); ++index)
 	{
-		DevErrorInfo devErr;
-		ZeroMemory(devErr.szErrMsg, sizeof(devErr.szErrMsg));
+		int aidLen = StrBuf2HexBuf(pAIDs[index].GetData(), &aidData.aid);
+
+		Dbg("str2hex len[%d]", aidLen);
+		aidData.len = aidLen;
+		char* aidTest = new char[128];
+		int aidStrLen = HexBuf2StrBuf(aidData.aid, &aidTest, 5);
+		Dbg("hex2str len[%d]", aidStrLen);
+		Dbg("aid[%s][%s]", pAIDs[index].GetData(), aidTest);
+		vector<AIDData> vAIDs;
+		vAIDs.push_back(aidData);
+
+		ErrorCodeEnum eErr = Error_Unexpect;
 		if (eType == CARD_MACHINE_ISSUER)
-			pCardI->GetLastErr(devErr);
-		else if (eType == CARD_MACHINE_SWIPER)
-			pCardS->GetLastErr(devErr);
+		{
+			pCardI = dynamic_cast<CardIssuerClass*>(pCardX);
+		}
+		else if (eType == CARD_MACHINE_SWIPER || eType == CARD_MACHINE_SWIPER_RF)
+		{
+			pCardS = dynamic_cast<CardSwiperClass*>(pCardX);
+		}
 		else if (eType == CARD_MACHINE_RFIC)
-			pCardR->GetLastErr(devErr);
-		Dbg("BuildSupportedAppList failed %d, %s.",eErr,devErr.szErrMsg);
-		return false;
-	}
-	//Dbg("[%s]",testIC);
-	eErr = AppSelected(eType,pCardX,vAIDs.at(0).aid,vAIDs.at(0).len);
-	if (eErr == Error_Succeed)
-		return true;
-	else
-	{
-		Dbg("AppSelected failed(%d).",eErr);
-		return false;
+		{
+			pCardR = dynamic_cast<RFICClass*>(pCardX);
+		}
+		eErr = BuildSupportedAppList(eType, pCardX, vAIDs);
+
+		Dbg("size = %d", vAIDs.size());
+		for (size_t i = 0; i < vAIDs.size(); ++i)
+		{
+			char* aidTest1 = new char[128];
+			int aidlen = HexBuf2StrBuf(vAIDs[i].aid, &aidTest1, vAIDs[i].len);
+			Dbg("aidTest = %s", aidTest1);
+			delete[] aidTest1;
+		}
+
+		if (eErr != Error_Succeed)
+		{
+			DevErrorInfo devErr;
+			ZeroMemory(devErr.szErrMsg, sizeof(devErr.szErrMsg));
+			if (eType == CARD_MACHINE_ISSUER)
+				pCardI->GetLastErr(devErr);
+			else if (eType == CARD_MACHINE_SWIPER)
+				pCardS->GetLastErr(devErr);
+			else if (eType == CARD_MACHINE_RFIC)
+				pCardR->GetLastErr(devErr);
+			Dbg("BuildSupportedAppList failed %d, %s.", eErr, devErr.szErrMsg);
+			continue;
+		}
+		//Dbg("[%s]",testIC);
+		eErr = AppSelected(eType, pCardX, vAIDs.at(0).aid, vAIDs.at(0).len);
+		if (eErr == Error_Succeed)
+			return true;
+		else
+		{
+			Dbg("AppSelected failed(%d).", eErr);
+			continue;
+		}
 	}
+	return false;
 }
 int CCardProcess::ConstructARQCData(const char *pATC, char *&pDataToARQC, char *&pSomeICData)
 {

+ 2 - 2
DevAdapter/include/CardAssist.h

@@ -52,7 +52,7 @@ public:
 	~CCardProcess();
 	void DataInit();
 	bool DetectIfICCard(CardReadType eType,DeviceBaseClass *pCardX,int &cardType);//cardType:0x41'A',type A; 0x42'B',type B; 0x4d'M',type M
-	bool GetICDataFromCard(CardReadType eType,DeviceBaseClass *pCardX,const char *pAID);
+	bool GetICDataFromCard(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA> pAIDs);
 	//int  SplitICData(vector<ICData>& vResult,LPBYTE* origData,int start,int dataLen,int level);
 	ErrorCodeEnum BuildSupportedAppList(CardReadType eType,DeviceBaseClass *pCardX,vector<AIDData>& vAIDFromTerm);
 	ErrorCodeEnum BuildAppListByAIDs(CardReadType eType,DeviceBaseClass *pCardX,vector<AIDData>& vAIDFromTerm);
@@ -69,7 +69,7 @@ public:
 	void SplitBusinessData(const char *pData,int size);
 	int SplitOnlineReplyData(const char *pData,int size);
 	void GetBaseInfoNotInRecord(CardReadType eType,DeviceBaseClass *pCardX);
-	int DetectAndReadICData(CardReadType eType,DeviceBaseClass *pCardX,const char *pAID,int &cardType);
+	int DetectAndReadICData(CardReadType eType, DeviceBaseClass* pCardX, CAutoArray<CSimpleStringA>pAIDs, int& cardType);
 	int ConstructARQCData(const char *pATC,char *&pDataToARQC,char *&pSomeICData);
 	int FindTagValue(TagVectorType eType,ICData& data,bool bLevel,int start=0,int end=0);
 	int ToFindTagValue(vector<ICData>& vData,ICData& data,bool bLevel,int start,int end);

+ 1 - 1
Module/CMakeLists.txt

@@ -148,7 +148,7 @@ if(MSVC)
     BASIC_SETUP CMAKE_TARGETS)
     set(MODULE_CONAN_DEP_LIBS ${CONAN_BIN_DIRS_MISC})
 else()
-    conan_cmake_run(REQUIRES Misc/2020.1211.1@LR04.02_ModuleDep/UOS
+    conan_cmake_run(REQUIRES Misc/2021.1105.1@LR04.02_ModuleDep/UOS
     BASIC_SETUP CMAKE_TARGETS)
     set(MODULE_CONAN_DEP_LIBS ${CONAN_BIN_DIRS_MISC} ${CONAN_LIB_DIRS_MISC} )
 endif(MSVC)

+ 19 - 14
Module/mod_ContactlessCard/ContactlessFSM.cpp

@@ -799,14 +799,12 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
             int retDetectAndRead = -1;
             if (!ctx->Req.aid.IsNullOrEmpty()) {
                 Dbg("aid:[%s]", (const char*)ctx->Req.aid);
-                retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, ctx->Req.aid, activeCardType);
+				CAutoArray<CSimpleStringA> aidReq;
+				aidReq.Init(1);
+				aidReq[0] = ctx->Req.aid;
+                retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, aidReq, activeCardType);
             } else {
-                retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A000000333", activeCardType);
-                if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
-                {
-                    Dbg("Can't read pboc record, to try emv...");
-                    retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A0000000108888", activeCardType);
-                }
+				retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, m_aidList, activeCardType);
             }
 
             if (retDetectAndRead < 0) {
@@ -828,6 +826,7 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
                 ZeroMemory(pICTrack2, 128);
                 HexBuf2StrBuf(track2.value, &pICTrack2, track2.lenth);
                 pICTrack2[37] = '\0';
+				Dbg("pICTrack2 = %s", pICTrack2);
 
                 char* ddd = new char[128];
                 memset(ddd, 0, 128);
@@ -836,6 +835,7 @@ int CContactlessCardFSM::AcceptCard(SpReqAnsContext<ContactlessCardService_Inser
                 t2ICTrack2 = pICTrack2;
                 t2ICAccount = (char*)ddd;//oiltest
                 Dbg("contactless card countcount:%s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
+				Dbg("account = %s", t2ICAccount.c_str());
                 ctx->Ans.ICData = ctx->Ans.t2Account = t2ICAccount.c_str();
                 ctx->Ans.ICType = 4;
                 ctx->Ans.status = 0;
@@ -895,6 +895,13 @@ int CContactlessCardFSM::SplitTrack2(CSimpleStringA pTrack2, Track2Data& decodeD
         decodeData.t2Region = pTrack2.SubString(23, 4);
         decodeData.t2ExpireDate = pTrack2.SubString(27, 4);
         break;
+	case 25://AE Card
+		decodeData.t2Account = CSimpleString(pTrack2, 15);
+		decodeData.t2CardSerial = pTrack2.SubString(15, 1);
+		decodeData.t2CVC = pTrack2.SubString(16, 5);
+		decodeData.t2ExpireDate = pTrack2.SubString(21, 4);
+		decodeData.t2Region = "";
+		break;
     case 38:
         break;
     default:
@@ -919,18 +926,16 @@ int CContactlessCardFSM::PreOnline(SpReqAnsContext<ContactlessCardService_PreOnl
     ICData aidFromBus(false, 0x4f, 0x00);
     if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1) {
         Dbg("the front BusinessData han't provide aid data.");
-        retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A000000333", activeCardType);
-        if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
-        {
-            Dbg("Can't read pboc record,to try emv...");
-            retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, "A0000000108888", activeCardType);
-        }
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, m_aidList, activeCardType);
     } else {
         char* pAIDTmp = new char[64];
         memset(pAIDTmp, 0, 64);
         HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
         Dbg("the aid is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
-        retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, pAIDTmp, activeCardType);
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_RFIC, m_hDevHelper, preAIDs, activeCardType);
         if (pAIDTmp != NULL)
             delete[]pAIDTmp;
     }

+ 5 - 0
Module/mod_ContactlessCard/ContactlessFSM.h

@@ -220,6 +220,10 @@ public:
         //,m_pTACReject(NULL),m_pIACOnline(NULL),m_pTACOnline(NULL),m_pIACDefault(NULL),m_pTACDefault(NULL)
         , m_bCDA(false), m_pDataToARQC(NULL), m_bSM(false), m_bOnlineOnly(false)
     {
+		m_aidList.Init(3);
+		m_aidList[0] = "A000000333";
+		m_aidList[1] = "A0000000108888";
+		m_aidList[2] = "A000000790";
     }
     ~CContactlessCardFSM() {}
     virtual ErrorCodeEnum OnInit();
@@ -296,6 +300,7 @@ private:
     CCardProcess* m_pCardProcess;
     char* m_pDataToARQC;
     long xxTest;
+	CAutoArray<CSimpleStringA> m_aidList;
 
     char m_AuthCode[2];
     bool m_bOnlineOnly, m_bCDA;

+ 54 - 22
Module/mod_cardissuer/CardIssuerFSM.cpp

@@ -3060,6 +3060,7 @@ int CCardIssuerFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
 	if (pTrack2.GetLength() == 0)
 		return -1;
 	int dataLen = strlen(pTrack2);
+	Dbg("pTrack2 = %s", pTrack2.GetData());
 	Dbg("pT2.len:%d",dataLen);
 	switch(dataLen)
 	{
@@ -3077,6 +3078,13 @@ int CCardIssuerFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
 		decodeData.t2Region = pTrack2.SubString(23,4);
 		decodeData.t2ExpireDate = pTrack2.SubString(27,4);
 		break;
+	case 25://AE Card
+		decodeData.t2Account = CSimpleString(pTrack2, 15);
+		decodeData.t2CardSerial = pTrack2.SubString(15, 1);
+		decodeData.t2CVC = pTrack2.SubString(16, 5);
+		decodeData.t2ExpireDate = pTrack2.SubString(21, 4);
+		decodeData.t2Region = "";
+		break;
 	case 38:
 		break;
 	default:
@@ -3185,12 +3193,15 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 	int readTries = 0;
 	memset(magTracks.track[0].data, 0, sizeof(magTracks.track[0].data));
 	memset(magTracks.track[1].data, 0, sizeof(magTracks.track[1].data));
-	memset(magTracks.track[2].data, 0, sizeof(magTracks.track[3].data));
+	memset(magTracks.track[2].data, 0, sizeof(magTracks.track[2].data));
 	{
 		magTracks.eRange = CI_TRACK_RANGE_2_3;
 		do {
 			eErr = m_pCardIssuer->MagRead(magTracks);
 			Dbg("MAGread(%d)...",eErr);
+			Dbg("track1 = %s", (const char*)magTracks.track[0].data);
+			Dbg("track2 = %s", (const char*)magTracks.track[1].data);
+			Dbg("track3 = %s", (const char*)magTracks.track[2].data);
 			ctx->Ans.t2Account = ctx->Ans.ICData = "";
 			//DevErrorInfo devErrInfo;
 			//m_pCardIssuer->GetLastErr(devErrInfo);
@@ -3251,8 +3262,11 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 				int pos = 0;
 				for (int i = 0; i < magTracks.track[1].dwSize; ++i,++pos)
 				{
-					if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e)
-						break;
+					// fixpoint (3d是=,3e是 >), 运通卡要考虑分隔符为D的情况
+					if (magTracks.track[1].data[i] == 0x3d 
+						|| magTracks.track[1].data[i] == 0x3e 
+						|| magTracks.track[1].data[i] == 0x44)
+					break;
 				}
 				Dbg("pos:%d,%d",pos,magTracks.track[1].dwSize);
 				if (pos <= 0 || pos == magTracks.track[1].dwSize)
@@ -3307,6 +3321,7 @@ int CCardIssuerFSM::ReadCard(SpReqAnsContext<CardIssuerService_Read_Req,CardIssu
 					tmpMag2 = NULL;
 				}
 				Dbg("%s,%s", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(ctx->Ans.t2Account.GetLength() - 4, 4));
+				Dbg("account = %s", ctx->Ans.t2Account.GetData());
 				break;
 			}
 			else
@@ -3574,19 +3589,17 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 	{
 		Dbg("the front BusinessData han't provide aid data.");
 
-		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333", activeCardType);
-		if (retDetectAndRead < -1)//-1:DetectIfICCard failed; -2:select app failed
-		{
-			Dbg("Can't read pboc record,to try emv...");
-			retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888", activeCardType);
-		}
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, m_aidList, activeCardType);
 	}
 	else {
 		char* pAIDTmp = new char[64];
 		memset(pAIDTmp, 0, 64);
 		HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
 		Dbg("the aid is[%s],len:%d .", pAIDTmp,strlen(pAIDTmp));
-		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, pAIDTmp, activeCardType);
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(CARD_MACHINE_ISSUER, m_pCardIssuer, preAIDs, activeCardType);
 		if (pAIDTmp != NULL)
 			delete[]pAIDTmp;
 	}
@@ -3688,6 +3701,7 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 		ZeroMemory(pICTrack2,128);
 		HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth);
 		pICTrack2[37] = '\0';
+		Dbg("zjw pICTrack2 = %s", pICTrack2);
 		Dbg("ic.track2,pos:%d",pos);
 		Dbg("pos:%d",pos);
 
@@ -3709,9 +3723,11 @@ int CCardIssuerFSM::PreOnline(SpReqAnsContext<CardIssuerService_PreOnline_Req,Ca
 		track2Data.status = 0;
 		track2Data.t2Account = "";
 		cmdDecodeMag2(pICTrack2,icTrack2Data);
+		Dbg("zjw icTrack2Data = %s", icTrack2Data);
 		if (SplitTrack2(icTrack2Data,track2Data) == 0)
 		{
 			t2ICAccount = track2Data.t2Account;
+			Dbg("zjw t2ICAccount = %s", t2ICAccount.c_str());
 			//t2ICCardSerial = track2Data.t2CardSerial;
 			t2ICCVC = track2Data.t2CVC;
 			t2ICTrack2 = pICTrack2;
@@ -4805,11 +4821,7 @@ bool CCardIssuerFSM::JustReadCardNo()
 	{
 		//oilyang@20201014 add emv support
 		bool bGetICData = false;
-		bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
-		if (!bGetICData)
-		{
-			bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
-		}
+		bGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, m_aidList);
 		ICData track2(false, 0x57, 0x00);
 		string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
 		if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)
@@ -4847,7 +4859,10 @@ bool CCardIssuerFSM::JustReadCardNo()
 				int pos = 0;
 				for (int i = 0; i < magTracks.track[1].dwSize; ++i, ++pos)
 				{
-					if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e)
+					//运通卡考虑 = 和 D 
+					if (magTracks.track[1].data[i] == 0x3d ||
+						magTracks.track[1].data[i] == 0x3e ||
+						magTracks.track[1].data[i] == 0x44) 
 						break;
 				}
 				Dbg("pos:%d", pos);
@@ -6256,6 +6271,12 @@ int CCardIssuerFSM::IssueCardFromStore(SpReqAnsContext<CardIssuerService_IssueEx
 		ctx->Ans.reserved1.Init(3);
 		ctx->Ans.reserved2.Init(2);
 		eErr = m_pCardIssuer->ReadAccount(card);
+		Dbg("card.account = %s", card.account);
+		Dbg("card.dwsize = %d", card.dwSize);
+		Dbg("card.dwTrack2Size = %d", card.dwTrack2Size);
+		Dbg("card.track2 = %s", card.track2);
+		Dbg("card.dwTrack3Size = %d", card.dwTrack3Size);
+		Dbg("card.track3 = %s", card.track3);
 		if (eErr == Error_Succeed && ctx->Req.reserved2[0].GetLength() == card.dwSize && strncmp(card.account, ctx->Req.reserved2[0], card.dwSize) == 0)
 		{
 			Dbg("ReadAccount ok.");
@@ -6407,6 +6428,12 @@ int CCardIssuerFSM::AddCardToStoreStepFirst(SpReqAnsContext<CardIssuerService_Is
 		CardNo card;
 		ctx->Ans.reserved2[0] = "";
 		eErr = m_pCardIssuer->ReadAccount(card);
+		Dbg("card.account = %s", card.account);
+		Dbg("card.dwsize = %d", card.dwSize);
+		Dbg("card.dwTrack2Size = %d", card.dwTrack2Size);
+		Dbg("card.track2 = %s", card.track2);
+		Dbg("card.dwTrack3Size = %d", card.dwTrack3Size);
+		Dbg("card.track3 = %s", card.track3);
 		bool bDataOK = true;//oilyang@20171213 是否读卡失败,是否解析出卡序号,否则吞卡 @宋锐
 		if (eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 64)
 		{
@@ -6612,6 +6639,12 @@ bool CCardIssuerFSM::OperateCardStore(CSmartPointer<IConfigInfo> &spConfigRun, i
 		CardNo card;
 		ZeroMemory(card.account, sizeof(card.account));
 		eErr = m_pCardIssuer->ReadAccount(card);
+		Dbg("card.account = %s", card.account);
+		Dbg("card.dwsize = %d", card.dwSize);
+		Dbg("card.dwTrack2Size = %d", card.dwTrack2Size);
+		Dbg("card.track2 = %s", card.track2);
+		Dbg("card.dwTrack3Size = %d", card.dwTrack3Size);
+		Dbg("card.track3 = %s", card.track3);
 		bool bDataOK = true;
 		//读卡成功并解析出卡序号,才算成功,卡序号也要返回
 		if(eErr == Error_Succeed && card.dwSize > 0 && card.dwSize < 64)
@@ -7037,7 +7070,7 @@ void CCardIssuerFSM::DecodeTracksData(const char *track2, DWORD dwT2size, const
 		Dbg("track2 isn't ok.");
 		return;
 	}
-	if (dwT2size <= 0 || strlen(track2) < 16)
+	if (dwT2size <= 0 || strlen(track2) < 15)//运通卡号为15位
 	{
 		Dbg("t2.size %d,strlen(t2):%d",dwT2size,strlen(track2));
 		return;
@@ -7054,6 +7087,9 @@ void CCardIssuerFSM::DecodeTracksData(const char *track2, DWORD dwT2size, const
 		memcpy(tmpMag2_3 + dwT2size + 1, track3, dwT3size);
 		cmdDecodeEx(tmpMag2_3, cardType, magData);
 	}
+	Dbg("tmpMage2_3 = %s", tmpMag2_3);
+	Dbg("magData = %s", magData);
+	Dbg("cardType = %s", cardType);
 	if (!bT3OK || strlen(cardType) < 4)
 	{
 		Dbg("no(%d) or wrong track 3(size:%d,strlen(%d)),%s",bT3OK,dwT3size,strlen(track3),cardType);
@@ -7336,11 +7372,7 @@ void CCardIssuerFSM::oiltestSCI(bool bSCI)
 			m_pCardProcess->DetectIfICCard(CARD_MACHINE_ISSUER, m_pCardIssuer, activeCardType);
 			//oilyang@20201014 add emv support
 			int retGetICData = -1;
-			retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A000000333");
-			if (retGetICData < -1)//-1:DetectIfICCard failed; -2:select app failed
-			{
-				retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, "A0000000108888");
-			}
+			retGetICData = m_pCardProcess->GetICDataFromCard(CARD_MACHINE_ISSUER, m_pCardIssuer, m_aidList);
 			ICData track2(false, 0x57, 0x00);
 			string t2ICAccount(""), t2ICCardSerial(""), t2ICCVC(""), t2ICTrack2(""), cardType;
 			if (m_pCardProcess->FindTagValue(TAG_VECTOR_IC, track2, false, 0) == -1)

+ 5 - 0
Module/mod_cardissuer/CardIssuerFSM.h

@@ -761,6 +761,10 @@ public:
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x203);
 			cmdDecodeMag2 = NULL;
 			cmdDecodeEx = NULL;
+			m_aidList.Init(3);
+			m_aidList[0] = "A000000333";
+			m_aidList[1] = "A0000000108888";
+			m_aidList[2] = "A000000790";
 		}
 
 	~CCardIssuerFSM(){}
@@ -1046,6 +1050,7 @@ private:
 	CardIssuerClass* m_pCardIssuer;
 	DevStateEnum m_eDevState;
 	CCardProcess *m_pCardProcess;
+	CAutoArray<CSimpleStringA> m_aidList;
 	pfEncryptDukptHSM EncypteDukptHSM;
 	pfGetEncrypedData GetEncrypedData;
 	char *m_pDataToARQC;

+ 69 - 6
Module/mod_cardswiper/CardSwiperFSM.cpp

@@ -1694,6 +1694,13 @@ int CCardSwiperFSM::SplitTrack2(CSimpleStringA pTrack2,Track2Data &decodeData)
 		decodeData.t2Region = pTrack2.SubString(23,4);
 		decodeData.t2ExpireDate = pTrack2.SubString(27,4);
 		break;
+	case 25://AE Card
+		decodeData.t2Account = CSimpleString(pTrack2, 15);
+		decodeData.t2CardSerial = pTrack2.SubString(15, 1);
+		decodeData.t2CVC = pTrack2.SubString(16, 5);
+		decodeData.t2ExpireDate = pTrack2.SubString(21, 4);
+		decodeData.t2Region = "";
+		break;
 	case 38:
 		break;
 	default:
@@ -1758,6 +1765,7 @@ int CCardSwiperFSM::ReadCard(SpReqAnsContext<CardSwiperService_Read_Req,CardSwip
 	DWORD dwStart = GetTickCount();
 	//HRESULT hr = -1;
 	MagTracks magTracks;
+	memset(&magTracks, 0, sizeof(MagTracks));
 //	int readTries = 0;
 	bool bReadCardInfo = false;
 	Dbg("mag card");
@@ -1864,8 +1872,10 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 				}
 				for (int i = 0; i < 20; ++i)
 				{
+					//运通卡分隔符还要考虑为D的情况
 					if (magTracks.track[1].data[i] < 0x30
-						|| (magTracks.track[1].data[i] > 0x39 && (magTracks.track[1].data[i] != 0x3d && magTracks.track[1].data[i] != 0x3e)))
+						|| (magTracks.track[1].data[i] > 0x39 && 
+							(magTracks.track[1].data[i] != 0x3d && magTracks.track[1].data[i] != 0x3e && magTracks.track[1].data[i] != 0x44)))
 					{
 						//oilyang 20160523
 						//not '0'-'9' or '=' or '>'
@@ -1917,7 +1927,10 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 					int pos = 0;
 					for (int i = 0; i < magTracks.track[1].dwSize; ++i,++pos)
 					{
-						if (magTracks.track[1].data[i] == 0x3d || magTracks.track[1].data[i] == 0x3e)
+						//运通卡考虑分隔符为D的情况
+						if (magTracks.track[1].data[i] == 0x3d
+							|| magTracks.track[1].data[i] == 0x3e
+							|| magTracks.track[1].data[i] == 0x44)
 							break;
 					}
 					Dbg("pos:%d,%d",pos,magTracks.track[1].dwSize);
@@ -1958,6 +1971,7 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 						
 					}
 					Dbg("%s,%s", (LPCTSTR)ctx->Ans.t2Account.SubString(0, 6), (LPCTSTR)ctx->Ans.t2Account.SubString(pos - 4, 4));
+					Dbg("account = %s", ctx->Ans.t2Account.GetData());
 					break;
 				}
 				else
@@ -1981,7 +1995,19 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 					Dbg("contact ic %d",eErr);
 					eErr = m_pCardSwiper->ActiveICCard();
 					Dbg("active ic %d",eErr);
-					m_pCardProcess->GetICDataFromCard(m_eReadType,m_pCardSwiper,"A000000333");
+					bool bGetICData = false;
+					if (ctx->Req.aid.IsNullOrEmpty())
+					{
+						Dbg("the front han't provide aid data.");
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, m_aidList);
+					}
+					else {
+						Dbg("the aid is[%s],len:%d .", (const char*)ctx->Req.aid, ctx->Req.aid.GetLength());
+						CAutoArray<CSimpleStringA> preAIDs;
+						preAIDs.Init(1);
+						preAIDs[0] = ctx->Req.aid;
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, preAIDs);
+					}
 					ICData track2(false,0x57,0x00);
 					eErr = Error_Unexpect;
 					string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType;
@@ -2044,7 +2070,19 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 					}
 					ctx->Ans.reserved3 = chType;
 					Dbg("active type %d",chType);
-					m_pCardProcess->GetICDataFromCard(m_eReadType,m_pCardSwiper,"A000000333");
+					bool bGetICData = false;
+					if (ctx->Req.aid.IsNullOrEmpty())
+					{
+						Dbg("the front han't provide aid data.");
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, m_aidList);
+					}
+					else {
+						Dbg("the aid is[%s],len:%d .", (const char*)ctx->Req.aid, ctx->Req.aid.GetLength());
+						CAutoArray<CSimpleStringA> preAIDs;
+						preAIDs.Init(1);
+						preAIDs[0] = ctx->Req.aid;
+						bGetICData = m_pCardProcess->GetICDataFromCard(m_eReadType, m_pCardSwiper, preAIDs);
+					}
 					ICData track2(false,0x57,0x00);
 					eErr = Error_Unexpect;
 					string t2ICAccount(""),t2ICCardSerial(""),t2ICCVC(""),t2ICTrack2(""),cardType;
@@ -2066,6 +2104,7 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 						ZeroMemory(pICTrack2,128);
 						HexBuf2StrBuf(track2.value,&pICTrack2,track2.lenth);
 						pICTrack2[37] = '\0';
+						Dbg("pICTrack2 = %s", pICTrack2);
 
 						{
 							char *ddd = new char[128];
@@ -2075,6 +2114,7 @@ DoRead:		magTracks.eRange = CI_TRACK_RANGE_2_3;
 							t2ICTrack2 = pICTrack2;
 							t2ICAccount = (char*)ddd;//oiltest
 							Dbg("count : %s,%s", t2ICAccount.substr(0, 6).c_str(), t2ICAccount.substr(t2ICAccount.length() - 4, 4).c_str());
+							Dbg("account = %s", t2ICAccount.c_str());
 							ctx->Ans.ICData = ctx->Ans.t2Account = t2ICAccount.c_str();
 							delete []ddd;
 						}
@@ -2253,9 +2293,32 @@ int CCardSwiperFSM::PreOnline(SpReqAnsContext<CardSwiperService_PreOnline_Req,Ca
 		m_pCardProcess->SplitBusinessData("DF690101",strlen("DF690101"));
 	}
 	int activeCardType;
-	if (!m_pCardProcess->DetectAndReadICData(m_eReadType, m_pCardSwiper, "A000000333", activeCardType))//oiltest 20140915
+	int retDetectAndRead = -1;
+	ICData aidFromBus(false, 0x4f, 0x00);
+	if (m_pCardProcess->FindTagValue(TAG_VECTOR_BUS, aidFromBus, false, 0) == -1)
+	{
+		Dbg("the front BusinessData han't provide aid data.");
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(m_eReadType, m_pCardSwiper, m_aidList, activeCardType);
+	}
+	else {
+		char* pAIDTmp = new char[64];
+		memset(pAIDTmp, 0, 64);
+		HexBuf2StrBuf(aidFromBus.value, &pAIDTmp, aidFromBus.lenth);
+		Dbg("the aid is[%s],len:%d .", pAIDTmp, strlen(pAIDTmp));
+		CAutoArray<CSimpleString> preAIDs;
+		preAIDs.Init(1);
+		preAIDs[0] = (CSimpleStringA)pAIDTmp;
+		retDetectAndRead = m_pCardProcess->DetectAndReadICData(m_eReadType, m_pCardSwiper, preAIDs, activeCardType);
+		if (pAIDTmp != NULL)
+			delete[]pAIDTmp;
+	}
+
+	if (retDetectAndRead < 0)
 	{
-		ctx->Answer(Error_Unexpect, AlarmDECToBusiness(MEC_DEVAPI_CARDSWIPER_ICCommand));
+		if (retDetectAndRead == -1)
+			ctx->Answer(Error_Unexpect, AlarmDECToBusiness("PreOnline(-1):", Error_Unexpect, MEC_DEVAPI_CARDSWIPER_ActiveICCard));
+		else if (retDetectAndRead == -2)
+			ctx->Answer(Error_Unexpect, AlarmDECToBusiness("PreOnline(-2):", Error_Unexpect, MEC_DEVAPI_CARDSWIPER_ICCommand));
 		return 0;
 	}
 	//if (m_cardType == CI_CARDTYPE_IC)

+ 5 - 0
Module/mod_cardswiper/CardSwiperFSM.h

@@ -364,6 +364,10 @@ public:
 	, m_bInMainPage(false), m_batteryLeft(999), m_bFWBOpenSucEver(false)
 	{
 		HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x202);
+		m_aidList.Init(3);
+		m_aidList[0] = "A000000333";
+		m_aidList[1] = "A0000000108888";
+		m_aidList[2] = "A000000790";
 	}
 	~CCardSwiperFSM(){}
 	virtual ErrorCodeEnum OnInit();
@@ -651,6 +655,7 @@ private:
 		, m_bDoingBindFWB, m_bDevOpenEx, m_bBTScan, m_bInMainPage,m_bFWBOpenSucEver;
 	
 	ErrorCodeEnum m_testResult;
+	CAutoArray<CSimpleStringA> m_aidList;
 
 	SelfChekerClient*m_pSelfcheckClient;
 	bool m_bCancelQueryConn;

+ 11 - 0
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -2255,6 +2255,17 @@ void CHealthManagerFSM::ToLogWarnTermAboutInfo(BOOL bSuccessFlag)
 
     termInfo["MACs"] = csMac;
     termInfo["IPs"] = csIP;
+
+#if defined(RVC_OS_LINUX)
+    CSystemStaticInfo sysInfo;
+    ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
+    if (eErr == Error_Succeed) {
+		termInfo["Manufacturer"] = (LPCTSTR)sysInfo.strManufacturer;
+        termInfo["MachineMode"] = (LPCTSTR)sysInfo.strMachineModel;
+        termInfo["MachineSN"] = (LPCTSTR)sysInfo.strMachineSN;
+    }
+#endif //RVC_OS_LINUX
+
     std::pair<bool, std::string> strResult;
     strResult = generateJsonStr(termInfo);
     Dbg("[%s]", strResult.second.c_str());

+ 16 - 2
Module/mod_interactivecontrol/mod_interactivecontrol.cpp

@@ -888,7 +888,14 @@ public:
 		{
 			SpBuffer buf;
 			buf.OpenWrite(32 + strContent.GetLength()*2);
-			buf & id & strContent;
+#if defined(RVC_OS_WIN)
+			buf& id& strContent;
+#else
+            buf& id;
+            CSimpleString16Bit convertedData = CSimpleStringW216Bit(strContent);
+            buf& convertedData;
+            Dbg("%s After convert: %s", __FUNCTION__, CSimpleString16Bit2A(convertedData).GetData());
+#endif //RVC_OS_WIN
 			ChannelService_Send_Info Info;
 			Info.sub_type = ACM_IM_FRONTSYNC;
 			Info.type = ACM_TYPE_IM;
@@ -910,7 +917,14 @@ public:
 		{
 			SpBuffer buf;
 			buf.OpenWrite(32 + strContent.GetLength() * 2);
-			buf & strContent;
+#if defined(RVC_OS_WIN)
+			buf& strContent;
+#else
+            CSimpleString16Bit convertedData = CSimpleStringW216Bit(strContent);
+            buf& convertedData;
+            Dbg("%s After convert: %s", __FUNCTION__, CSimpleString16Bit2A(convertedData).GetData());
+#endif //RVC_OS_WIN
+			
 			ChannelService_Send_Info Info;
 			Info.sub_type = 0;
 			Info.type = ACM_TYPE_H5_SYNC;

+ 21 - 5
Module/mod_pinpad/PinPadFSM.cpp

@@ -781,16 +781,14 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 	}
 	else
 	{
-		if (Get12Account(const_cast<char*>(ctxSM->Req.account.GetData())))
-			memcpy(accInfo.account,m_szAccount+4,12);
-		else
-		{
+		if (Get12Account(const_cast<char*>(ctxSM->Req.account.GetData()))) {
+			memcpy(accInfo.account, m_szAccount + 4, 12);
+		} else {
 			Dbg("Get12Account err(%s).",(const char*)ctxSM->Req.account);
 			return Error_DevCommFailed;
 		}
 	}
 
-	//memcpy(accInfo.account,"588571006555",12);
 	accInfo.dwAccLen = 12;
 	Dbg("acc(%s)",accInfo.account);
 	errCode = m_hDevHelper->SetAccNo(accInfo);
@@ -840,6 +838,8 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 	int readed = 0;
 	DWORD elapsed = 0;
 	DWORD dwStart = GetTickCount();
+	DWORD dwTimeStamp = dwStart;
+	ErrorCodeEnum ec4KeyRead(Error_Succeed);
 	bool bCancelInput = false;
 	Dbg("reqqqq(pin) len: %d, timeout:%d, confirm or not: %d",len,timeout,confirm);
 	Dbg("exit flag: %d",m_bExit);
@@ -872,6 +872,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 		BYTE btCh;
 		Sleep(100);
 		errCode = m_hDevHelper->KeyRead(btCh);
+		ec4KeyRead = errCode;
 		if (errCode == Error_Succeed) {
 			LogEvent(Severity_Middle,LOG_EVT_PINPAD_OP,"PinPad op.");
 			if (btCh == 0x0d) {
@@ -919,6 +920,12 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInput_
 			}else{
 				Dbg("else[%d]",btCh);
 			}
+		} else {
+			DWORD dwTmp = GetTickCount();
+			if ((dwTmp - dwTimeStamp) >= 1000) {
+				Dbg("KeyRead returned error: %s", SpStrError(ec4KeyRead));
+				dwTimeStamp = dwTmp;
+			}
 		}
 
 		elapsed = GetTickCount() - dwStart;
@@ -931,6 +938,9 @@ Err:
 	if (m_bExit)
 	{
 		Dbg("exit");
+        if (ec4KeyRead != Error_Succeed) {
+            LOG_PINPAD_ERROR_MSG_MACRO(ec4KeyRead, KeyRead);
+        }
 		return Error_Unexpect;
 	}
 	m_bExit = false;
@@ -939,10 +949,16 @@ Err:
 	if (bCancelInput)
 	{
 		Dbg("input cancel(pin)");
+		if (ec4KeyRead != Error_Succeed) {
+			LOG_PINPAD_ERROR_MSG_MACRO(ec4KeyRead, KeyRead);
+		}
 		return Error_Cancel;
 	}
 	if (readed < len) {
 		if (elapsed >= MAX_PINPAD_INPUT_TIMEOUT) {
+            if (ec4KeyRead != Error_Succeed) {
+                LOG_PINPAD_ERROR_MSG_MACRO(ec4KeyRead, KeyRead);
+            }
 			return Error_TimeOut;
 		}
 	}

+ 3 - 1
addin/cmake/ConfigOptions.cmake

@@ -43,4 +43,6 @@ option(PACK_AS_DEB_PKG "build the project and package as debian type " OFF)
 
 option(CONAN_CACHE_CLEAR "remove local conan dependencies" OFF)
 
-option(WITH_ADDITIONAL_RES "download other resource file or for skipping big file mechanism like sogouime" OFF)
+option(WITH_ADDITIONAL_RES "download other resource file or for skipping big file mechanism like sogouime" OFF)
+
+option(WITH_UPDATE_FORMAT "build the artifictory as update pacakge format" OFF)