Эх сурвалжийг харах

#IQRV #comment 0.3.2-rc1 合并物料维护版本

gifur 3 жил өмнө
parent
commit
c06f23b0dc

+ 2 - 1
Module/mod_chromium/CMakeLists.txt

@@ -42,6 +42,7 @@ set(${MODULE_PREFIX}_SRCS
 	ISocketCallback.h
 	Job.h
 	MessageType.h
+	MessageType.cpp
 	mod_chromium.cpp
 	mod_chromium.h
 	processControl.cpp
@@ -112,7 +113,7 @@ if(LINKINFO_ON)
 	add_compile_definitions(OPEN_LINKINFO)
 endif()
 if(DEBUGMODE_ON)
-	set(CMAKE_CXX_FLAGS "-g3 -rdynamic -lprofiler")
+	set(CMAKE_CXX_FLAGS "${CMAK_CXX_FLAGS} -g3 -rdynamic -lprofiler")
 endif()
 
 set(CMAK_CXX_FLAGS "${CMAK_CXX_FLAGS} -Wno-narrowing")

+ 1 - 41
Module/mod_chromium/CMessage.cpp

@@ -28,47 +28,7 @@ int memcpy_s(void* det, size_t detSize, const void* src, size_t srcSize)
 #endif
 
 namespace Chromium {
-#if (defined _WIN32 || defined _WIN64)
-	std::string UtfToGbk(const char* utf8)
-	{
-		int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
-		wchar_t* wstr = new wchar_t[len + 1];
-		memset(wstr, 0, len + 1);
-		MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
-		len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
-		char* str = new char[len + 1];
-		memset(str, 0, len + 1);
-		WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
-		if (wstr) delete[] wstr;
-		return str;
-	}
-
-	//GBK转化为UTF8格式
-	std::string ConvertGBKToUtf8(std::string& strGBK)
-	{
-		int len = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK.c_str(), -1, NULL, 0);
-		wchar_t* wszUtf8 = new wchar_t[len];
-		memset(wszUtf8, 0, len);
-		MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK.c_str(), -1, wszUtf8, len);
-		len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
-		char* szUtf8 = new char[len + 1];
-		memset(szUtf8, 0, len + 1);
-		WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL);
-		std::string ret = szUtf8;
-		delete[] szUtf8;
-		delete[] wszUtf8;
-		return ret;
-	}
-#else
-	std::string UtfToGbk(const char* utf8)
-	{
-		return utf8;
-	}
-	std::string ConvertGBKToUtf8(std::string& strGBK)
-	{
-		return strGBK;
-	}
-#endif
+
 
 
 	CMessage::CMessage() :

+ 0 - 2
Module/mod_chromium/CMessage.h

@@ -6,8 +6,6 @@
 #define MAX_TRANSFER_LEN	(2*1024*1024)	//系统默认读缓冲区就这么大,/proc/sys/net/core/rmem_default
 
 namespace Chromium {
-	std::string UtfToGbk(const char* utf8);
-	std::string ConvertGBKToUtf8(std::string& strGBK);
 	class CMessage {
 	public:
 		CMessage();

+ 1362 - 1433
Module/mod_chromium/CWSCodec.cpp

@@ -17,1654 +17,1583 @@
 #include <vector>
 #include <string>
 #include <memory>
+#include "baseEx.h"
 
 #define DEFAULT_CAPACITY			20480
 
 
-namespace Chromium {
+namespace Chromium
+{
 
 
-	static inline bool is_base64(CSimpleStringA str)
-	{
-		int num = str.GetLength() % 4;
-		CSimpleStringA endStr = "";
-		if (0 == num)
-			return true;
-		for (int i = 0; i < num; ++i)
-		{
-			endStr.Append("=");
-		}
-		return str.IsEndWith(endStr);
+static inline bool is_base64(CSimpleStringA str)
+{
+	int num = str.GetLength() % 4;
+	CSimpleStringA endStr = "";
+	if (0 == num)
+		return true;
+	for (int i = 0; i < num; ++i) {
+		endStr.Append("=");
 	}
-
-	CWSCodec::CWSCodec() :m_DeserializeCache(MAX_TRANSFER_LEN), m_SerializeCache(MAX_TRANSFER_LEN)
-	{
-		DbgEx("CWSCodec Constuctor");
-		m_AckCallbackList = new std::map<int, entity_def_struct>();
-		m_EventCallbackList = new std::map<int, std::vector<CMedthodInterface>*>();
+	return str.IsEndWith(endStr);
+}
+
+CWSCodec::CWSCodec() :m_DeserializeCache(MAX_TRANSFER_LEN), m_SerializeCache(MAX_TRANSFER_LEN)
+{
+	DbgEx("CWSCodec Constuctor");
+	m_AckCallbackList = new std::map<int, entity_def_struct>();
+	m_EventCallbackList = new std::map<int, std::vector<CMedthodInterface>*>();
+}
+
+CWSCodec::~CWSCodec()
+{
+	if (mInterpreter) {
+		delete this->mInterpreter;
 	}
+}
+
+CWSCodec* CWSCodec::getInstance()
+{
+	//DbgEx("CWSCodec static method getInstance");
+	static CWSCodec obj;
+	return &obj;
+}
+
+bool CWSCodec::checkEntityHasService(std::string entityName)
+{
+	if (!mInterpreter)
+		return true;//默认有service
+
+	return mInterpreter->checkEntityInservice(entityName);
+}
+
+void CWSCodec::setEntityHandler(CSmartPointer<IEntityFunction> p)
+{
+	this->m_pFunc = p;
+}
+
+void CWSCodec::init(const char* xmlPath)
+{
+	DbgEx("CWSCodec method -> init from %s", xmlPath);
+	mInterpreter = new CStructureInterpreter(xmlPath);
+}
+
+void CWSCodec::DeserializeBase(CMessage& msg, CTransStruct& ts, int& rpos, cJSON* ret)
+{
+
+	std::list<CMethodParam>::iterator i = ts.mParamList.begin();
+	auto deleteCjson = [](cJSON* dst) {
+		if (NULL != dst)
+			cJSON_Delete(dst);
+	};
+	std::unique_ptr<cJSON, decltype(deleteCjson)> extendJs(cJSON_CreateObject(), deleteCjson);
+
+	std::string t_arr[] = { "messageType", "sessionID", "transID", "isEnd", "errorCode", "errorMsg" };
+	std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
 
-	CWSCodec::~CWSCodec() {
-		if (mInterpreter) {
-			delete this->mInterpreter;
+#if (defined _WIN32 || defined _WIN64)
+	for each (auto paramInfo in ts.mParamList) {
+		for each (auto repeatName in c_repeatParamList) {
+#else
+	for (auto paramInfo : ts.mParamList) {
+		for (auto repeatName : c_repeatParamList) {
+#endif
+			if (paramInfo.mName == repeatName)
+				DbgEx("requestAck参数名字重复, error, %s", paramInfo.mName.c_str());
 		}
 	}
+	//存在脏数据,不做另外处理
 
-	CWSCodec* CWSCodec::getInstance() {
-		DbgEx("CWSCodec static method getInstance");
-		static CWSCodec obj;
-		return &obj;
-	}
-
-	bool CWSCodec::checkEntityHasService(std::string entityName)
-	{
-		if (!mInterpreter)
-			return true;//默认有service
-
-		return mInterpreter->checkEntityInservice(entityName);
-	}
-
-	void CWSCodec::setEntityHandler(CSmartPointer<IEntityFunction> p) {
-		this->m_pFunc = p;
-	}
-
-	void CWSCodec::init(const char* xmlPath) {
-		DbgEx("CWSCodec method -> init from %s", xmlPath);
-		mInterpreter = new CStructureInterpreter(xmlPath);
-	}
-
-	void CWSCodec::DeserializeBase(CMessage& msg, CTransStruct& ts, int& rpos, cJSON* ret) {
-
-		std::list<CMethodParam>::iterator i = ts.mParamList.begin();
-		auto deleteCjson = [](cJSON* dst) {
-            if (NULL != dst) {
-                cJSON_Delete(dst);
-                //cJSON_free(dst);
-            }
-		};
-		std::unique_ptr<cJSON, decltype(deleteCjson)> extendJs(cJSON_CreateObject(), deleteCjson);
-
-		std::string t_arr[] = { "messageType", "sessionID", "transID", "isEnd", "errorCode", "errorMsg" };
-		std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
-
+	try {
+		while (i != ts.mParamList.end()) {
+			bool t_isRepeat = false;
 #if (defined _WIN32 || defined _WIN64)
-		for each (auto paramInfo in ts.mParamList)
-		{
 			for each (auto repeatName in c_repeatParamList)
-			{
 #else
-		for (auto paramInfo : ts.mParamList)
-		{
 			for (auto repeatName : c_repeatParamList)
-			{
 #endif
-				if (paramInfo.mName == repeatName)
-					DbgEx("requestAck参数名字重复, error, %s", paramInfo.mName.c_str());
-			}
-		}
-		//存在脏数据,不做另外处理
-
-		try
-		{
-			while (i != ts.mParamList.end())
 			{
-				bool t_isRepeat = false;
+				if (i->mName == repeatName) {
+					DbgEx("requestAck参数名字重复, error, %s", i->mName);
+					t_isRepeat = true;
+				}
+
+			}
+			if (i->mType == "int") {
+				int d = 0;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "uint") {
+				unsigned int d = 0;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "short") {
+				short d = 0;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "ushort") {
+				unsigned short d = 0;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "char") {
+				char d = 0;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "uchar") {
+				unsigned char d = 0;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "int64") {
+				__int64 d = 0;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "uint64") {
 #if (defined _WIN32 || defined _WIN64)
-				for each (auto repeatName in c_repeatParamList)
+				unsigned __int64 d = 0;
 #else
-				for (auto repeatName : c_repeatParamList)
+				u_int64_t d = 0;
 #endif
-				{
-					if (i->mName == repeatName)
-					{
-						DbgEx("requestAck参数名字重复, error, %s", i->mName);
-						t_isRepeat = true;
-					}
 
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "bool") {
+				bool d = false;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddBoolToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "double") {
+				double d = false;
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
+				cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "string") {
+				CSimpleStringA d = "";
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), d);
+				cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), d);
+			} else if (i->mType == "wstring") {
+				CSimpleStringW d = "";
+				ReadT(msg.getPayload(), d, &rpos);
+				if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), CSimpleStringW2A(d));
+				cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), CSimpleStringW2A(d));
+			} else if (i->mType == "blob") {
+				int len = 0;
+				void* binData = NULL;
+				char* base64Data = NULL;
+				ReadT(msg.getPayload(), len, &rpos);
+				if (0 != len) {//协商好,H5对blob数据进行base64加密,chromium这里进行base64解密
+					binData = (char*)malloc(sizeof(char) * len);
+					ReadT(msg.getPayload(), binData, len, &rpos);
+					int base64Len = modp_b64_encode_len(len);
+					base64Data = (char*)malloc(sizeof(char) * base64Len);
+					modp_b64_encode(base64Data, (const char*)binData, len);
+					if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), base64Data);
+					cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), base64Data);
+					if (binData != NULL) {
+						free(binData);
+						binData = NULL;
+					}
+					if (base64Data != NULL) {
+						free(base64Data);
+						base64Data = NULL;
+					}
+				} else {
+					if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), "");
+					cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), "");
 				}
-				if (i->mType == "int")
-				{
-					int d = 0;
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
-				}
-				else if (i->mType == "uint")
-				{
-					unsigned int d = 0;
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
-				}
-				else if (i->mType == "short") {
-					short d = 0;
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
-				}
-				else if (i->mType == "ushort") {
-					unsigned short d = 0;
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
-				}
-				else if (i->mType == "char") {
-					char d = 0;
+			} else if (i->mType == "array_int") {
+				int len = 0;
+				int d = 0;
+				ReadT(msg.getPayload(), len, &rpos);
+
+				cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
+				for (int c = 0; c < len; ++c) {
 					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+					cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
+					cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
 				}
-				else if (i->mType == "uchar") {
-					unsigned char d = 0;
+
+				if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
+				cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+			} else if (i->mType == "array_bool") {
+				int len = 0;
+				bool d = 0;
+				ReadT(msg.getPayload(), len, &rpos);
+
+				cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
+				for (int c = 0; c < len; ++c) {
 					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+					cJSON_AddItemToArray(tmpArray, cJSON_CreateBool(d));
+					cJSON_AddItemToArray(tmpArray2, cJSON_CreateBool(d));
 				}
-				else if (i->mType == "int64") {
-					__int64 d = 0;
+
+				if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
+				cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+			} else if (i->mType == "array_uint") {
+				int len = 0;
+				unsigned int d = 0;
+				ReadT(msg.getPayload(), len, &rpos);
+
+				cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
+				for (int c = 0; c < len; ++c) {
 					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+					cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
+					cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
 				}
-				else if (i->mType == "uint64") {
+
+				if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
+				cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+			} else if (i->mType == "array_uint64") {
+				int len = 0;
 #if (defined _WIN32 || defined _WIN64)
-					unsigned __int64 d = 0;
+				unsigned __int64 d = 0;
 #else
-					u_int64_t d = 0;
+				u_int64_t d = 0;
 #endif
+				ReadT(msg.getPayload(), len, &rpos);
 
+				cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
+				for (int c = 0; c < len; c++) {
 					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
+					cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
+					cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
 				}
-				else if (i->mType == "bool")
-				{
-					bool d = false;
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddBoolToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
-				}
-				else if (i->mType == "double")
-				{
-					double d = false;
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
-					cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
-				}
-				else if (i->mType == "string")
-				{
-					CSimpleStringA d = "";
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), d);
-					cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), d);
-				}
-				else if (i->mType == "wstring")
-				{
-					CSimpleStringW d = "";
-					ReadT(msg.getPayload(), d, &rpos);
-					if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), CSimpleStringW2A(d));
-					cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), CSimpleStringW2A(d));
-				}
-				else if (i->mType == "blob")
-				{
-					int len = 0;
-					void* binData = NULL;
-					char* base64Data = NULL;
-					ReadT(msg.getPayload(), len, &rpos);
-					if (0 != len)
-					{//协商好,H5对blob数据进行base64加密,chromium这里进行base64解密
-						binData = (char*)malloc(sizeof(char) * len);
-						ReadT(msg.getPayload(), binData, len, &rpos);
-						int base64Len = modp_b64_encode_len(len);
-						base64Data = (char*)malloc(sizeof(char) * base64Len);
-						modp_b64_encode(base64Data, (const char*)binData, len);
-						if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), base64Data);
-						cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), base64Data);
-						if (binData != NULL) {
-							free(binData);
-							binData = NULL;
-						}
-						if (base64Data != NULL) {
-							free(base64Data);
-							base64Data = NULL;
-						}
-					}
-					else {
-						if (!t_isRepeat)	cJSON_AddStringToObject(ret, i->mName.c_str(), "");
-						cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), "");
-					}
-				}
-				else if (i->mType == "array_int")
-				{
-					int len = 0;
-					int d = 0;
-					ReadT(msg.getPayload(), len, &rpos);
-
-					cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
-					for (int c = 0; c < len; ++c) {
-						ReadT(msg.getPayload(), d, &rpos);
-						cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
-						cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
-					}
 
-					if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
-					cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
-				}
-				else if (i->mType == "array_uint")
-				{
-					int len = 0;
-					unsigned int d = 0;
-					ReadT(msg.getPayload(), len, &rpos);
-
-					cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
-					for (int c = 0; c < len; ++c) {
-						ReadT(msg.getPayload(), d, &rpos);
-						cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
-						cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
-					}
+				if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
+				cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+			} else if (i->mType == "array_string") {
+				int len = 0;
+				CSimpleStringA d = "";
+				ReadT(msg.getPayload(), len, &rpos);
 
-					if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
-					cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+				cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
+				for (int c = 0; c < len; ++c) {
+					ReadT(msg.getPayload(), d, &rpos);
+					cJSON_AddItemToArray(tmpArray, cJSON_CreateString(d));
+					cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(d));
 				}
-				else if (i->mType == "array_uint64")
-				{
-					int len = 0;
-#if (defined _WIN32 || defined _WIN64)
-					unsigned __int64 d = 0;
-#else
-					u_int64_t d = 0;
-#endif
-					ReadT(msg.getPayload(), len, &rpos);
-
-					cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
-					for (int c = 0; c < len; c++) {
-						ReadT(msg.getPayload(), d, &rpos);
-						cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
-						cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
-					}
+				if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
+				cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+			} else if (i->mType == "array_wstring") {
+				int len = 0;
+				CSimpleStringW d = "";
+				ReadT(msg.getPayload(), len, &rpos);
 
-					if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
-					cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
-				}
-				else if (i->mType == "array_string")
-				{
-					int len = 0;
-					CSimpleStringA d = "";
-					ReadT(msg.getPayload(), len, &rpos);
-
-					cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
-					for (int c = 0; c < len; ++c) {
-						ReadT(msg.getPayload(), d, &rpos);
-						cJSON_AddItemToArray(tmpArray, cJSON_CreateString(d));
-						cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(d));
-					}
-					if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
-					cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+				cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
+				for (int c = 0; c < len; ++c) {
+					ReadT(msg.getPayload(), d, &rpos);
+					cJSON_AddItemToArray(tmpArray, cJSON_CreateString(CSimpleStringW2A(d)));
+					cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(CSimpleStringW2A(d)));
 				}
-				else if (i->mType == "array_wstring")
-				{
-					int len = 0;
-					CSimpleStringW d = "";
-					ReadT(msg.getPayload(), len, &rpos);
-
-					cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
-					for (int c = 0; c < len; ++c) {
-						ReadT(msg.getPayload(), d, &rpos);
-						cJSON_AddItemToArray(tmpArray, cJSON_CreateString(CSimpleStringW2A(d)));
-						cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(CSimpleStringW2A(d)));
-					}
 
-					if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
-					cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
-				}
-				else if (i->mType == "array_blob")
-				{
-					int array_size = 0;
-					ReadT(msg.getPayload(), array_size, &rpos);//array size
-					//DbgEx("array_blob 1:%d", msg.getBufferLength());
-					//msg.hexToFile();
-					cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
-					for (int c = 0; c < array_size; ++c) {
-						int tmpSize = 0;
-						ReadT(msg.getPayload(), tmpSize, &rpos);
-						if (0 != tmpSize)
-						{
-							void* binData = (char*)malloc(sizeof(char) * tmpSize);
-							ReadT(msg.getPayload(), binData, tmpSize, &rpos);
-							//DbgEx("array_blob 2:%d", tmpSize);
-							int base64Len = modp_b64_encode_len(tmpSize);
-							char* base64Data = (char*)malloc(sizeof(char) * base64Len);
-							modp_b64_encode(base64Data, (const char*)binData, tmpSize);
-							cJSON_AddItemToArray(tmpArray, cJSON_CreateString(base64Data));
-							cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(base64Data));
-						}
+				if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
+				cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+			} else if (i->mType == "array_blob") {
+				int array_size = 0;
+				ReadT(msg.getPayload(), array_size, &rpos);//array size
+				//DbgEx("array_blob 1:%d", msg.getBufferLength());
+				//msg.hexToFile();
+				cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
+				for (int c = 0; c < array_size; ++c) {
+					int tmpSize = 0;
+					ReadT(msg.getPayload(), tmpSize, &rpos);
+					if (0 != tmpSize) {
+						void* binData = (char*)malloc(sizeof(char) * tmpSize);
+						ReadT(msg.getPayload(), binData, tmpSize, &rpos);
+						//DbgEx("array_blob 2:%d", tmpSize);
+						int base64Len = modp_b64_encode_len(tmpSize);
+						char* base64Data = (char*)malloc(sizeof(char) * base64Len);
+						modp_b64_encode(base64Data, (const char*)binData, tmpSize);
+						cJSON_AddItemToArray(tmpArray, cJSON_CreateString(base64Data));
+						cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(base64Data));
 					}
-					if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
-					cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
 				}
-				else
-					DbgEx("DeserializeBase error name -> type: %s -> %s", i->mName.c_str(), i->mType.c_str());
-				++i;
-			}
-		}
-		catch (...)
-		{
-			if (i != ts.mParamList.end())
-				DbgEx("DeserializeBase error:%s, %s", i->mName.c_str(), i->mType.c_str());
+				if (!t_isRepeat)	cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
+				cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
+			} else
+				DbgEx("DeserializeBase error name -> type: %s -> %s", i->mName.c_str(), i->mType.c_str());
+			++i;
 		}
-
-		char* unformateStr = cJSON_PrintUnformatted(extendJs.get());
-		std::string dstPayLoad = unformateStr;
-		delete[]unformateStr;
-
-		cJSON_AddStringToObject(ret, PARAMLIST_HEAD, dstPayLoad.c_str());
+	} catch (...) {
+		if (i != ts.mParamList.end())
+			DbgEx("DeserializeBase error:%s, %s", i->mName.c_str(), i->mType.c_str());
 	}
 
-	void CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret) {
-		entity_def_struct* p_struct = &it->second;
-		CMedthodInterface* mi = mInterpreter->getFunctionInterface(p_struct->entity_name, p_struct->class_name, p_struct->methodID);
-		CTransStruct ts = mi->mResponseInterpreter;
+	char* unformateStr = cJSON_PrintUnformatted(extendJs.get());
+	std::string dstPayLoad = unformateStr;
+	delete[]unformateStr;
 
-		try
-		{
-			DeserializeBase(msg, ts, rpos, ret);
+	cJSON_AddStringToObject(ret, PARAMLIST_HEAD, dstPayLoad.c_str());
 		}
-		catch (...)
-		{
-			DbgEx("error DeserializeRequestAck: %s, %s, %s", p_struct->entity_name, p_struct->class_name, p_struct->methodID);
-			std::string errorMsg;
+
+void CWSCodec::DeserializeRequestAck(CMessage & msg, std::map<int, entity_def_struct>::iterator & it, int& rpos, cJSON * ret)
+{
+	entity_def_struct* p_struct = &it->second;
+	CMedthodInterface* mi = mInterpreter->getFunctionInterface(p_struct->entity_name, p_struct->class_name, p_struct->methodID);
+	CTransStruct ts = mi->mResponseInterpreter;
+
+	try {
+		DeserializeBase(msg, ts, rpos, ret);
+	} catch (...) {
+		DbgEx("error DeserializeRequestAck: %s, %s, %s", p_struct->entity_name, p_struct->class_name, p_struct->methodID);
+		std::string errorMsg;
 #if (defined _WIN32 || defined _WIN64)
-			for each (auto it in ts.mParamList)
+		for each (auto it in ts.mParamList)
 #else
-			for (auto it : ts.mParamList)
+		for (auto it : ts.mParamList)
 #endif
-				errorMsg += it.mName + "--" + it.mType + "_";
-			DbgEx(errorMsg.c_str());
+			errorMsg += it.mName + "--" + it.mType + "_";
+		DbgEx(errorMsg.c_str());
 #if (defined _WIN32 || defined _WIN64)
-			throw std::exception("error DeserializeRequestAck");
+		throw std::exception("error DeserializeRequestAck");
 #else
-			throw std::exception(std::logic_error("error DeserializeRequestAck"));
+		throw std::exception(std::logic_error("error DeserializeRequestAck"));
 #endif
 
-		}
 	}
-
-	void CWSCodec::DeserializeEvent(CMessage & msg,
-		std::vector<CMedthodInterface>*list,
-		int& rpos, cJSON * ret) {
-		int eventID = msg.getEventID();
-		if (NULL == list || eventID < 0 || eventID >= list->size())
-		{
-			cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
-			CSimpleStringA errmsg = "";
-			errmsg.Format("Cannot find the eventID = %d!", eventID);
-			cJSON_AddStringToObject(ret, "errorMsg", errmsg);
-			return;
-		}
-		CMedthodInterface* mi = &(list->at(eventID));
-		CTransStruct ts = mi->mResponseInterpreter;
-		try
-		{
-			DeserializeBase(msg, ts, rpos, ret);
-		}
-		catch (...)
-		{
-			std::string errorMsg;
+}
+
+void CWSCodec::DeserializeEvent(CMessage & msg,
+								std::vector<CMedthodInterface>*list,
+								int& rpos, cJSON * ret)
+{
+	int eventID = msg.getEventID();
+	if (NULL == list || eventID < 0 || eventID >= list->size()) {
+		cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
+		CSimpleStringA errmsg = "";
+		errmsg.Format("Cannot find the eventID = %d!", eventID);
+		cJSON_AddStringToObject(ret, "errorMsg", errmsg);
+		return;
+	}
+	CMedthodInterface* mi = &(list->at(eventID));
+	CTransStruct ts = mi->mResponseInterpreter;
+	try {
+		DeserializeBase(msg, ts, rpos, ret);
+	} catch (...) {
+		std::string errorMsg;
 #if (defined _WIN32 || defined _WIN64)
-			for each (auto it in ts.mParamList)
+		for each (auto it in ts.mParamList)
 #else
-			for (auto it : ts.mParamList)
+		for (auto it : ts.mParamList)
 #endif
-				errorMsg += it.mName + "--" + it.mType + "_";
+			errorMsg += it.mName + "--" + it.mType + "_";
 
-			DbgEx(errorMsg.c_str());
+		DbgEx(errorMsg.c_str());
 #if (defined _WIN32 || defined _WIN64)
-			throw std::exception("error DeserializeRequestAck");
+		throw std::exception("error DeserializeRequestAck");
 #else
-			throw std::exception(std::logic_error("error DeserializeRequestAck"));
+		throw std::exception(std::logic_error("error DeserializeRequestAck"));
 #endif
 
-		}
 	}
-
-	void receivehexdump(const char* buf, const int num) {
-		char str[8192 * 2] = { 0 };
-		int i = 0;
-		char c[5] = { 0 };
-		if (num > 1200)
-		{
-			for (i = 0; i < 50; i++)
-			{
-				sprintf(c, "%02X ", (unsigned char)buf[i]);
-				strcat(str, c);
-			}
-			DbgEx("buffer too long to show!show pre 50 hex! receivehexdump hex buf len = %d : %s", num, str);
-			return;
-		}
-
-		for (i = 0; i < num; i++)
-		{
+}
+
+void receivehexdump(const char* buf, const int num)
+{
+	char str[8192 * 2] = { 0 };
+	int i = 0;
+	char c[5] = { 0 };
+	if (num > 1200) {
+		for (i = 0; i < 50; i++) {
 			sprintf(c, "%02X ", (unsigned char)buf[i]);
 			strcat(str, c);
 		}
-		DbgEx("receivehexdump hex buf len = %d : %s", num, str);
+		DbgEx("buffer too long to show!show pre 50 hex! receivehexdump hex buf len = %d : %s", num, str);
 		return;
 	}
 
-	std::string CWSCodec::BufferToJson(CMessage & msg, int replaceTransId) {
-		//LOG_FUNCTION();
-		int rpos = 16;
-		cJSON* ret = cJSON_CreateObject();
-		int errorCode = Error_Succeed;
-		int userCode = 0;
-		CSimpleStringA errorMsg = "";
-
-		receivehexdump(msg.getPayload(), msg.getLength());
-
-		if (msg.getLength() < 12)	//End session len = 12
-			return std::string(); // 丢弃消息
-
-		// 通用反序列化
-		cJSON_AddNumberToObject(ret, "messageType", msg.getMessageType());
-		switch (msg.getMessageType()) {
-		case RequestAck: //PKT_TYPE_REQACK
-			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
-			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
-			cJSON_AddNumberToObject(ret, "isEnd", msg.getIsEnd());
-			rpos += 1;
-#if defined(RVC_OS_LINUX)
-            ReadT(msg.getPayload(), userCode, &rpos);
-            /** 业务端要求返回userCode,需要改动框架,依赖信创版本框架 1.0.7-dev15 [Gifur@2021119]*/
-            cJSON_AddNumberToObject(ret, "userCode", userCode);
-#endif //RVC_OS_LINUX
-			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			cJSON_AddStringToObject(ret, "errorMsg", errorMsg);
-			break;
-		case SessionAck:
-			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
-			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
-			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			cJSON_AddStringToObject(ret, "errorMsg", errorMsg);
-			break;
-		case Event:
-			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
-			cJSON_AddNumberToObject(ret, "eventID", msg.getEventID());
-			cJSON_AddNumberToObject(ret, "signatureID", msg.getSignatureID());
-			rpos += 8;
-			break;
-		case SetVarAck:
-			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
-			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
-			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			cJSON_AddStringToObject(ret, "errorMsg", errorMsg);
-			break;
-		case GetVarAck:
-			cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
-			cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
-			ReadT(msg.getPayload(), errorCode, &rpos);
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			ReadT(msg.getPayload(), errorMsg, &rpos);
-			cJSON_AddStringToObject(ret, "value", errorMsg);
-			break;
-		default:
-			errorCode = Error_Unexpect;
-			cJSON_AddNumberToObject(ret, "errorCode", errorCode);
-			cJSON_AddStringToObject(ret, "errorMsg", "未知消息类型");
-			break;
-		}
-		DbgEx("BufferToJson -> messageType=%d, sessionID=%d, transID=%d, replaceTransID=%d", msg.getMessageType(), msg.getSessionID(), msg.getTransID(), replaceTransId);
-
+	for (i = 0; i < num; i++) {
+		sprintf(c, "%02X ", (unsigned char)buf[i]);
+		strcat(str, c);
+	}
+	DbgEx("receivehexdump hex buf len = %d : %s", num, str);
+	return;
+}
+
+std::string CWSCodec::BufferToJson(CMessage & msg, int replaceTransId)
+{
+	//replaceTransId==0,MessageType为8(Event),其他都应该有值
+	//LOG_FUNCTION();
+	int rpos = 16;
+	cJSON* ret = cJSON_CreateObject();
+	int errorCode = Error_Succeed;
+	int userCode = 0;
+	CSimpleStringA errorMsg = "";
+
+	receivehexdump(msg.getPayload(), msg.getLength());
+
+	if (msg.getLength() < 12)	//End session len = 12
+		return std::string(); // 丢弃消息
+
+
+
+	// 通用反序列化
+	cJSON_AddNumberToObject(ret, "messageType", msg.getMessageType());
+	switch (msg.getMessageType()) {
+	case RequestAck: //PKT_TYPE_REQACK
+		cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
+		cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
+		cJSON_AddNumberToObject(ret, "isEnd", msg.getIsEnd());
+		rpos += 1;
+#if (defined _WIN32 || defined _WIN64)
+#else
+		ReadT(msg.getPayload(), userCode, &rpos);
+		/** 业务端要求返回userCode,需要改动框架,依赖信创版本框架 1.0.7-dev15 [Gifur@2021119]*/
+#endif
 
-		// RequestAck 返回的有问题 要删除对应的回调list项
-		if (Error_Succeed != errorCode && RequestAck == msg.getMessageType())
+		ReadT(msg.getPayload(), errorCode, &rpos);
+		cJSON_AddNumberToObject(ret, "errorCode", errorCode);
+		ReadT(msg.getPayload(), errorMsg, &rpos);
 		{
-			std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
-			if (m_AckCallbackList->end() != it)
-				m_AckCallbackList->erase(it);
+			auto userCodeInfo = splitStrToUserCodeAndErrMsg(errorMsg.GetData());
+			if (userCodeInfo.first != 0)
+				cJSON_AddNumberToObject(ret, "userCode", userCodeInfo.first);
+			cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.c_str());
 		}
-		// 有错误时直接返回 或者 不是RequestAck和Event时也可以返回
-		if (Error_Succeed != errorCode ||
-			(RequestAck != msg.getMessageType() && Event != msg.getMessageType()))
+		break;
+	case SessionAck:
+		cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
+		cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
+		ReadT(msg.getPayload(), errorCode, &rpos);
+		cJSON_AddNumberToObject(ret, "errorCode", errorCode);
+		ReadT(msg.getPayload(), errorMsg, &rpos);
 		{
-			char* str = getJsonStr(ret);
-			cJSON_Delete(ret);
-			//cJSON_free(ret);
-			std::string s(str);
-			free(str);
-			return s;
-		}
-
-		// 数据部分反序列化 RequestAck & Event有数据部分
-		if (RequestAck == msg.getMessageType())
-		{   // Request用户自定义部分反序列化
-			// 回调反序列化列表
-			std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
-
-			if (m_AckCallbackList->end() == it)
-			{
-				// 没有对应的request,无法反序列化
-				cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
-				cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the request for the ack!");
-				char* str = getJsonStr(ret);
-				cJSON_Delete(ret);
-				//cJSON_free(ret);
-				std::string s(str);
-				free(str);
-				return s;
-			}
-			DeserializeRequestAck(msg, it, rpos, ret);
-			m_AckCallbackList->erase(it);
+			auto userCodeInfo = splitStrToUserCodeAndErrMsg(errorMsg.GetData());
+			if (userCodeInfo.first != 0)
+				cJSON_AddNumberToObject(ret, "userCode", userCodeInfo.first);
+			cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.c_str());
 		}
-		else if (Event == msg.getMessageType())
+		break;
+	case Event:
+		cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
+		cJSON_AddNumberToObject(ret, "eventID", msg.getEventID());
+		cJSON_AddNumberToObject(ret, "signatureID", msg.getSignatureID());
+		rpos += 8;
+		break;
+	case SetVarAck:
+		cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
+		cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
+		ReadT(msg.getPayload(), errorCode, &rpos);
+		cJSON_AddNumberToObject(ret, "errorCode", errorCode);
+		ReadT(msg.getPayload(), errorMsg, &rpos);
 		{
-			// Event用户自定义部分反序列化
-			std::map<int, std::vector<CMedthodInterface>*>::iterator iter = m_EventCallbackList->find(msg.getTransID());
-			if (m_EventCallbackList->end() == iter)
-			{
-				// 没有对应的register, 无法反序列化
-				cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
-				cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the register for the ack!");
-				char* str = getJsonStr(ret);
-				cJSON_Delete(ret);
-                //cJSON_free(ret);
-				std::string s(str);
-				free(str);
-				return s;
-			}
-			DeserializeEvent(msg, iter->second, rpos, ret);
+			auto userCodeInfo = splitStrToUserCodeAndErrMsg(errorMsg.GetData());
+			if (userCodeInfo.first != 0)
+				cJSON_AddNumberToObject(ret, "userCode", userCodeInfo.first);
+			cJSON_AddStringToObject(ret, "errorMsg", userCodeInfo.second.c_str());
 		}
+		break;
+	case GetVarAck:
+		cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
+		cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
+		ReadT(msg.getPayload(), errorCode, &rpos);
+		cJSON_AddNumberToObject(ret, "errorCode", errorCode);
+		ReadT(msg.getPayload(), errorMsg, &rpos);
+		cJSON_AddStringToObject(ret, "value", errorMsg);
+		break;
+	default:
+		errorCode = Error_Unexpect;
+		cJSON_AddNumberToObject(ret, "errorCode", errorCode);
+		cJSON_AddStringToObject(ret, "errorMsg", "未知消息类型");
+		break;
+	}
+	DbgEx("BufferToJson -> messageType=%d(%s), sessionID=%d, transID=%d, replaceTransID=%d", msg.getMessageType(), GetMessageTypeString(msg.getMessageType()).c_str(),
+		  msg.getSessionID(), msg.getTransID(), replaceTransId);
+
 
+	// RequestAck 返回的有问题 要删除对应的回调list项
+	if (Error_Succeed != errorCode && RequestAck == msg.getMessageType()) {
+		std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
+		if (m_AckCallbackList->end() != it)
+			m_AckCallbackList->erase(it);
+	}
+	// 有错误时直接返回 或者 不是RequestAck和Event时也可以返回
+	if (Error_Succeed != errorCode ||
+		(RequestAck != msg.getMessageType() && Event != msg.getMessageType())) {
 		char* str = getJsonStr(ret);
 		cJSON_Delete(ret);
-		//cJSON_free(ret);
 		std::string s(str);
 		free(str);
-		//delete []str;
 		return s;
 	}
 
-	std::pair<int, CMessage*> CWSCodec::JsonToBuffer(std::string strJson) {
-		cJSON* pJson = cJSON_Parse(strJson.c_str());
-		char  errmsg[1024] = { 0 };
+	// 数据部分反序列化 RequestAck & Event有数据部分
+	if (RequestAck == msg.getMessageType()) {   // Request用户自定义部分反序列化
+		// 回调反序列化列表
+		std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
 
-		unsigned int messageType = 0;
-		GetCJsonIntergerValue(pJson, "messageType", messageType, errmsg);
-
-		// 查找序列化结构 有用户定义数据部分的只有 Info 和 Request
-		CMedthodInterface* mi = NULL;
-		if (Request == messageType || Info == messageType)
-		{
-			entity_def_struct st = { 0 };
-			GetCJsonObjectValue(pJson, "class", st.class_name, errmsg);
-			GetCJsonObjectValue(pJson, "entity", st.entity_name, errmsg);
-			GetCJsonIntergerValue(pJson, "methodID", st.methodID, errmsg);
-			mi = mInterpreter->getFunctionInterface(st.entity_name, st.class_name, st.methodID);		//get the mothod of the json
-			if (NULL == mi) {
-				DbgEx("JsonToBuffer : Entity or class not found in structure interpreter! entityName:%s, class_name:%s, methodId:%d", st.entity_name, st.class_name, st.methodID);
-				return std::make_pair(messageType, nullptr);
-			}
-			else
-				DbgEx("JsonToBuffer parse method success, entityName:%s, className:%s, methodID:%d, DstMethodName:%s, DstMethodParamNum:%d",
-					st.entity_name, st.class_name, st.methodID, mi->mMethodName.c_str(), mi->mRequestInterpreter.mParamList.size());	//如出错,可对比方法名和变量数量
-			if (Request == messageType) {
-				// 维护回调列表 Request
-				int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
-				m_AckCallbackList->insert(std::pair<int, entity_def_struct>(transid, st));
-			}
-		}
-		else if (Register == messageType)
-		{
-			std::vector<CMedthodInterface>* milist = NULL;
-			entity_def_struct st = { 0 };
-			unsigned int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
-			GetCJsonObjectValue(pJson, "entity", st.entity_name, errmsg);
-			milist = mInterpreter->getAllMessageInterface(st.entity_name);
-			m_EventCallbackList->insert(std::pair<int, std::vector<CMedthodInterface>*>(transid, milist));
+		if (m_AckCallbackList->end() == it) {
+			// 没有对应的request,无法反序列化
+			cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
+			cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the request for the ack!");
+			char* str = getJsonStr(ret);
+			cJSON_Delete(ret);
+			std::string s(str);
+			free(str);
+			return s;
 		}
-		else if (Broadcast == messageType)
-		{
-			ChromiumBroadcast e = {};
-			GetCJsonObjectValue(pJson, "data", e.broadcastJson, errmsg);
-			if (e.broadcastJson.GetLength() < 20000)
-			{
-				auto rc = SpSendBroadcast(m_pFunc, eMsg_ChromiumBroadcast, eMsgSig_ChromiumBroadcast, e);
-				if (Error_Succeed != rc)
-					DbgEx("Broadcast Msg Error:%d", rc);
-			}
-			else
-				DbgEx("json is too long, do not send out sp broadcast!");
-			return std::make_pair(messageType, nullptr);
+		DeserializeRequestAck(msg, it, rpos, ret);
+		m_AckCallbackList->erase(it);
+	} else if (Event == msg.getMessageType()) {
+		// Event用户自定义部分反序列化
+		std::map<int, std::vector<CMedthodInterface>*>::iterator iter = m_EventCallbackList->find(msg.getTransID());
+		if (m_EventCallbackList->end() == iter) {
+			// 没有对应的register, 无法反序列化
+			cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
+			cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the register for the ack!");
+			char* str = getJsonStr(ret);
+			cJSON_Delete(ret);
+			std::string s(str);
+			free(str);
+			return s;
 		}
-		else if (Event == messageType)
-		{// 维护回调列表 Event
-			struct  GeneralEventStruct
-			{
-				CSimpleStringA data;
-				void Serialize(SpBuffer& Buf)
-				{
-					auto& buf = Buf & data;
-				}
-			};
-			struct GeneralEventStruct e = {};
-			unsigned int eventID = 0;
-			unsigned int eventSign = 0;
-			GetCJsonIntergerValue(pJson, "eventID", eventID, errmsg);
-			GetCJsonIntergerValue(pJson, "eventSign", eventSign, errmsg);
-			GetCJsonObjectValue(pJson, "data", e.data, errmsg);
-			SpSendBroadcast(m_pFunc, eventID, eventSign, e);
-			//if (0 < strlen(errmsg))
-			//	DbgEx("JsonToBuffer errmsg : %s", errmsg);
-			cJSON_Delete(pJson);
-			//cJSON_free(pJson);
+		DeserializeEvent(msg, iter->second, rpos, ret);
+	}
+
+	char* str = getJsonStr(ret);
+	cJSON_Delete(ret);
+	std::string s(str);
+	free(str);
+	//delete []str;
+	return s;
+}
+
+std::pair<int, CMessage*> CWSCodec::JsonToBuffer(std::string strJson)
+{
+	cJSON* pJson = cJSON_Parse(strJson.c_str());
+	char  errmsg[1024] = { 0 };
+
+	unsigned int messageType = 0;
+	GetCJsonIntergerValue(pJson, "messageType", messageType, errmsg);
+
+	// 查找序列化结构 有用户定义数据部分的只有 Info 和 Request
+	CMedthodInterface* mi = NULL;
+	if (Request == messageType || Info == messageType) {
+		entity_def_struct st = { 0 };
+		GetCJsonObjectValue(pJson, "class", st.class_name, errmsg);
+		GetCJsonObjectValue(pJson, "entity", st.entity_name, errmsg);
+		GetCJsonIntergerValue(pJson, "methodID", st.methodID, errmsg);
+		mi = mInterpreter->getFunctionInterface(st.entity_name, st.class_name, st.methodID);		//get the mothod of the json
+		if (NULL == mi) {
+			DbgEx("JsonToBuffer : Entity or class not found in structure interpreter! entityName:%s, class_name:%s, methodId:%d", st.entity_name, st.class_name, st.methodID);
 			return std::make_pair(messageType, nullptr);
+		} else
+			DbgEx("JsonToBuffer parse method success, entityName:%s, className:%s, methodID:%d, DstMethodName:%s, DstMethodParamNum:%d",
+				  st.entity_name, st.class_name, st.methodID, mi->mMethodName.c_str(), mi->mRequestInterpreter.mParamList.size());	//如出错,可对比方法名和变量数量
+		if (Request == messageType) {
+			// 维护回调列表 Request
+			int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
+			m_AckCallbackList->insert(std::pair<int, entity_def_struct>(transid, st));
 		}
-
-		// 数据定义
-		char* data = (char*)malloc(MAX_TRANSFER_LEN);
-		assert(data != NULL);
-		int capacity = MAX_TRANSFER_LEN;
-		int wpos = 0;
-		unsigned int len = 0;
-		// 通用序列化
-		// 预先写入长度0
-		WriteT(data, len, &wpos, &capacity);
-
-		//写入messageType,附带链路信息
-#ifdef OPEN_LINKINFO
-		int messageTypeWithControl = messageType | PKT_TYPE_CONTROL_LINKCONTEXT;
-#else
-		int messageTypeWithControl = messageType;
-#endif
-		WriteT(data, messageTypeWithControl, &wpos, &capacity);
-
-		auto linkContexFun = [&]() {
-#ifdef OPEN_LINKINFO
-			//添加链路信息,放到原数据最后
-			auto linkContextRet = GetLinkContex(pJson, data, errmsg);
-			if (linkContextRet.first)
-			{
-				WriteT(data, std::get<0>(linkContextRet.second), &wpos, &capacity);
-				WriteT(data, std::get<1>(linkContextRet.second), &wpos, &capacity);
-				WriteT(data, std::get<2>(linkContextRet.second), &wpos, &capacity);
-				WriteT(data, std::get<3>(linkContextRet.second), &wpos, &capacity);
-			}
-			else// 生成链路信息
+	} else if (Register == messageType) {
+		std::vector<CMedthodInterface>* milist = NULL;
+		entity_def_struct st = { 0 };
+		unsigned int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
+		GetCJsonObjectValue(pJson, "entity", st.entity_name, errmsg);
+		milist = mInterpreter->getAllMessageInterface(st.entity_name);
+		m_EventCallbackList->insert(std::pair<int, std::vector<CMedthodInterface>*>(transid, milist));
+	} else if (Broadcast == messageType) {
+		ChromiumBroadcast e = {};
+		GetCJsonObjectValue(pJson, "data", e.broadcastJson, errmsg);
+		if (e.broadcastJson.GetLength() < 20000) {
+			auto rc = SpSendBroadcast(m_pFunc, eMsg_ChromiumBroadcast, eMsgSig_ChromiumBroadcast, e);
+			if (Error_Succeed != rc)
+				DbgEx("Broadcast Msg Error:%d", rc);
+		} else
+			DbgEx("json is too long, do not send out sp broadcast!");
+		return std::make_pair(messageType, nullptr);
+	} else if (Event == messageType) {// 维护回调列表 Event
+		struct  GeneralEventStruct
+		{
+			CSimpleStringA data;
+			void Serialize(SpBuffer& Buf)
 			{
-				CSimpleStringA bussinessId = "ChromiumAutoGen";
-				CSimpleStringA traceId = uuid4_generate(32).c_str();
-				CSimpleStringA spanId = uuid4_generate(16).c_str();
-				CSimpleStringA parentSpanId = "0";
-				WriteT(data, bussinessId, &wpos, &capacity);//为适配silverlight,默认写入就是unicode
-				WriteT(data, traceId, &wpos, &capacity);
-				WriteT(data, spanId, &wpos, &capacity);
-				WriteT(data, parentSpanId, &wpos, &capacity);
+				auto& buf = Buf & data;
 			}
-#endif
-
 		};
-
-		// 根据不同的request进行序列化
-		switch (messageType) {
-			//info和request由于有其他信息,需要在数据中获得context
-		case Info:
-			SerializeInfo(pJson, data, &wpos, &capacity, mi, errmsg);
-			break;
-		case Request:
-			SerializeRequest(pJson, data, &wpos, &capacity, mi, errmsg);
-			break;
-		case BeginSession:
-			SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		case EndSession:
-			SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		case Register:
-			SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		case Unregister:
-			SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		case LogEventMsgType:
-			SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		case LogWarnMsgType:
-			SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		case SetVarReq:
-			SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		case GetVarReq:
-			SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
-			linkContexFun();
-			break;
-		default:
-			// warn
-			break;
-		};
-
-		// 修改头部的消息长度
-		int i = 0;
-		len = wpos - 8;
-		WriteT(data, len, &i, &capacity);
+		struct GeneralEventStruct e = {};
+		unsigned int eventID = 0;
+		unsigned int eventSign = 0;
+		GetCJsonIntergerValue(pJson, "eventID", eventID, errmsg);
+		GetCJsonIntergerValue(pJson, "eventSign", eventSign, errmsg);
+		GetCJsonObjectValue(pJson, "data", e.data, errmsg);
+		SpSendBroadcast(m_pFunc, eventID, eventSign, e);
 		//if (0 < strlen(errmsg))
-		//	DbgEx("JsonToBuffer errmsg : %s, len = %d", errmsg, len);
-
+		//	DbgEx("JsonToBuffer errmsg : %s", errmsg);
 		cJSON_Delete(pJson);
-		//cJSON_free(pJson);
-
-		if (wpos < m_SerializeCache.getCMessageLength())
-		{
-			m_SerializeCache.clear();
-			if (nullptr == memcpy(m_SerializeCache.getWriteableData(), data, wpos))
-				DbgEx("memcpy err ");
-			free(data);
-		}
-		else
-		{	//数据长度过长
-			free(data);
-			DbgEx("string too long, discard");
-			return std::make_pair(messageType, nullptr);
-		}
-
-		return std::make_pair(messageType, &m_SerializeCache);
+		return std::make_pair(messageType, nullptr);
 	}
 
-	char* CWSCodec::getJsonStr(cJSON * pJson) {
-		char* pStr = cJSON_PrintUnformatted(pJson);
-
-		if (NULL == pStr) {
-			pStr = (char*)malloc(64);
-			if (pStr) {
-				strncpy(pStr, "{\"errorCode\":1540,\"errormsg\":\"Failed to encode json\"}", 64);
-			}
-		}
-		return pStr;
-	}
-
-
-
-	void CWSCodec::SerializeInfo(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
+	// 数据定义
+	char* data = (char*)malloc(MAX_TRANSFER_LEN);
+	assert(data != NULL);
+	int capacity = MAX_TRANSFER_LEN;
+	int wpos = 0;
+	unsigned int len = 0;
+	// 通用序列化
+	// 预先写入长度0
+	WriteT(data, len, &wpos, &capacity);
+
+	//写入messageType,附带链路信息
+#ifdef OPEN_LINKINFO
+	int messageTypeWithControl = messageType | PKT_TYPE_CONTROL_LINKCONTEXT;
+#else
+	int messageTypeWithControl = messageType;
+#endif
+	WriteT(data, messageTypeWithControl, &wpos, &capacity);
 
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		i4 = cJSON_GetObjectItem(js, "methodID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		i4 = cJSON_GetObjectItem(js, "signature")->valueint;
-		WriteT(data, i4, wpos, capacity);
+	auto linkContexFun = [&]() {
 #ifdef OPEN_LINKINFO
-		auto linkContextRet = GetLinkContex(js, data, errmsg);
-		if (linkContextRet.first)
-		{
-			WriteT(data, std::get<0>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<1>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<2>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<3>(linkContextRet.second), wpos, capacity);
-		}
-		else// 生成链路信息
+		//添加链路信息,放到原数据最后
+		auto linkContextRet = GetLinkContex(pJson, data, errmsg);
+		if (linkContextRet.first) {
+			WriteT(data, std::get<0>(linkContextRet.second), &wpos, &capacity);
+			WriteT(data, std::get<1>(linkContextRet.second), &wpos, &capacity);
+			WriteT(data, std::get<2>(linkContextRet.second), &wpos, &capacity);
+			WriteT(data, std::get<3>(linkContextRet.second), &wpos, &capacity);
+		} else// 生成链路信息
 		{
 			CSimpleStringA bussinessId = "ChromiumAutoGen";
 			CSimpleStringA traceId = uuid4_generate(32).c_str();
 			CSimpleStringA spanId = uuid4_generate(16).c_str();
 			CSimpleStringA parentSpanId = "0";
-			WriteT(data, bussinessId, wpos, capacity);//为适配silverlight,默认写入就是unicode
-			WriteT(data, traceId, wpos, capacity);
-			WriteT(data, spanId, wpos, capacity);
-			WriteT(data, parentSpanId, wpos, capacity);
+			WriteT(data, bussinessId, &wpos, &capacity);//为适配silverlight,默认写入就是unicode
+			WriteT(data, traceId, &wpos, &capacity);
+			WriteT(data, spanId, &wpos, &capacity);
+			WriteT(data, parentSpanId, &wpos, &capacity);
 		}
-#endif
-
-		if (NULL == pI)
-		{
-			// 没有对应定义
-			return;
-		}
-
-		auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
-		if (paramJs == NULL)
-		{
-			//detect the same name 
-			std::string t_arr[] = { "transID", "sessionID", "methodID", "signature", "timeout" ,"messageType","class","entity","methodID" };
-			std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
-#if (defined _WIN32 || defined _WIN64)
-			for each (auto paramInfo in pI->mRequestInterpreter.mParamList)
-			{
-				for each (auto repeatName in c_repeatParamList)
-				{
 #else
-			for (auto paramInfo : pI->mRequestInterpreter.mParamList)
-			{
-				for (auto repeatName : c_repeatParamList)
-				{
 #endif
 
-					if (paramInfo.mName == repeatName)
-						DbgEx("request参数名字重复, error, %s", paramInfo.mName.c_str());
-				}
-			}
-			//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
+	};
+
+	// 根据不同的request进行序列化
+	switch (messageType) {
+		//info和request由于有其他信息,需要在数据中获得context
+	case Info:
+		SerializeInfo(pJson, data, &wpos, &capacity, mi, errmsg);
+		break;
+	case Request:
+		SerializeRequest(pJson, data, &wpos, &capacity, mi, errmsg);
+		break;
+	case BeginSession:
+		SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	case EndSession:
+		SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	case Register:
+		SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	case Unregister:
+		SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	case LogEventMsgType:
+		SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	case LogWarnMsgType:
+		SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	case SetVarReq:
+		SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	case GetVarReq:
+		SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
+		linkContexFun();
+		break;
+	default:
+		// warn
+		break;
+	};
+
+	// 修改头部的消息长度
+	int i = 0;
+	len = wpos - 8;
+	WriteT(data, len, &i, &capacity);
+	//if (0 < strlen(errmsg))
+	//	DbgEx("JsonToBuffer errmsg : %s, len = %d", errmsg, len);
+
+	cJSON_Delete(pJson);
+
+
+	if (wpos < m_SerializeCache.getCMessageLength()) {
+		m_SerializeCache.clear();
+		if (nullptr == memcpy(m_SerializeCache.getWriteableData(), data, wpos))
+			DbgEx("memcpy err ");
+		free(data);
+	} else {	//数据长度过长
+		free(data);
+		DbgEx("string too long, discard");
+		return std::make_pair(messageType, nullptr);
+	}
 
-			paramJs = js;
-				}
-		GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
+	return std::make_pair(messageType, &m_SerializeCache);
+}
 
-		return;
-			}
-#ifdef OPEN_LINKINFO
-	std::pair<bool, std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, int>> CWSCodec::GetLinkContex(cJSON * js, char* data, char* errmsg)
-	{
-		/*
-		typedef struct {
-		char businessId[32];	//32
-		char traceId[32];		//32
-		char spanId[16];		//16
-		char parentSpanId[16];	//16
-		char timestamp[16];	//16
-		int reservedControl;
-	}link_context;
-		*/
-
-		CSimpleStringA BussinessId, TraceId, SpanId, ParentSpanId, Timestamp;
-		int ReservedControl;
-		GetCJsonObjectValue(js, "BussinessId", BussinessId, errmsg);
-		GetCJsonObjectValue(js, "TraceId", TraceId, errmsg);
-		GetCJsonObjectValue(js, "SpanId", SpanId, errmsg);
-		GetCJsonObjectValue(js, "ParentSpanId", ParentSpanId, errmsg);
-		GetCJsonObjectValue(js, "Timestamp", Timestamp, errmsg);
-		GetCJsonIntergerValue(js, "ReservedControl", ReservedControl, errmsg);
-
-		if (BussinessId.GetLength() > 0 && BussinessId.GetLength() < 32 && TraceId.GetLength() == 32 && SpanId.GetLength() == 16 && ParentSpanId.GetLength() == 16)
-			return std::make_pair(true, std::make_tuple(BussinessId, TraceId, SpanId, ParentSpanId, Timestamp, ReservedControl));
-		else
-			return std::make_pair(false, std::make_tuple("", "", "", "", "", 0));
+char* CWSCodec::getJsonStr(cJSON * pJson)
+{
+	char* pStr = cJSON_PrintUnformatted(pJson);
 
+	if (NULL == pStr) {
+		pStr = (char*)malloc(64);
+		if (pStr) {
+			strncpy(pStr, "{\"errorCode\":1540,\"errormsg\":\"Failed to encode json\"}", 64);
+		}
 	}
-#endif
+	return pStr;
+}
 
-	void CWSCodec::SerializeBeginSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		GetCJsonIntergerValue(js, "transID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		GetCJsonObjectValue(js, "entity", s, errmsg);
-		WriteT(data, s, wpos, capacity);
-		GetCJsonObjectValue(js, "method", s, errmsg);
-		WriteT(data, s, wpos, capacity);
-		GetCJsonObjectValue(js, "class", s, errmsg);
-		WriteT(data, s, wpos, capacity);
 
-	}
 
-	void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-	}
+void CWSCodec::SerializeInfo(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
 
-	void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		unsigned int i4 = 0;
-		GetCJsonIntergerValue(js, "transID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "sessionID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "methodID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "signature", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		GetCJsonIntergerValue(js, "timeout", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
+	int i4 = 0;
+	i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	i4 = cJSON_GetObjectItem(js, "methodID")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	i4 = cJSON_GetObjectItem(js, "signature")->valueint;
+	WriteT(data, i4, wpos, capacity);
 #ifdef OPEN_LINKINFO
-		auto linkContextRet = GetLinkContex(js, data, errmsg);
-		if (linkContextRet.first)
-		{
-			WriteT(data, std::get<0>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<1>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<2>(linkContextRet.second), wpos, capacity);
-			WriteT(data, std::get<3>(linkContextRet.second), wpos, capacity);
-		}
-		else// 生成链路信息
-		{
-			CSimpleStringA bussinessId = "ChromiumAutoGen";
-			CSimpleStringA traceId = uuid4_generate(32).c_str();
-			CSimpleStringA spanId = uuid4_generate(16).c_str();
-			CSimpleStringA parentSpanId = "0";
-			WriteT(data, bussinessId, wpos, capacity);//为适配silverlight,默认写入就是unicode
-			WriteT(data, traceId, wpos, capacity);
-			WriteT(data, spanId, wpos, capacity);
-			WriteT(data, parentSpanId, wpos, capacity);
-		}
+	auto linkContextRet = GetLinkContex(js, data, errmsg);
+	if (linkContextRet.first) {
+		WriteT(data, std::get<0>(linkContextRet.second), wpos, capacity);
+		WriteT(data, std::get<1>(linkContextRet.second), wpos, capacity);
+		WriteT(data, std::get<2>(linkContextRet.second), wpos, capacity);
+		WriteT(data, std::get<3>(linkContextRet.second), wpos, capacity);
+	} else// 生成链路信息
+	{
+		CSimpleStringA bussinessId = "ChromiumAutoGen";
+		CSimpleStringA traceId = uuid4_generate(32).c_str();
+		CSimpleStringA spanId = uuid4_generate(16).c_str();
+		CSimpleStringA parentSpanId = "0";
+		WriteT(data, bussinessId, wpos, capacity);//为适配silverlight,默认写入就是unicode
+		WriteT(data, traceId, wpos, capacity);
+		WriteT(data, spanId, wpos, capacity);
+		WriteT(data, parentSpanId, wpos, capacity);
+	}
 #endif
 
-		if (NULL == pI)
-		{
-			// 没有对应定义
-			DbgEx("没有对应定义");
-			return;
-		}
+	if (NULL == pI) {
+		// 没有对应定义
+		return;
+	}
 
-		auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
-		if (paramJs == NULL)
-		{
-			//detect the same name 
-			std::string t_arr[] = { "transID", "sessionID", "methodID", "signature", "timeout" ,"messageType","class","entity","methodID" };
-			std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
+	auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
+	if (paramJs == NULL) {
+		//detect the same name 
+		std::string t_arr[] = { "transID", "sessionID", "methodID", "signature", "timeout" ,"messageType","class","entity","methodID" };
+		std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
 #if (defined _WIN32 || defined _WIN64)
-			for each (auto paramInfo in pI->mRequestInterpreter.mParamList)
-			{
-				for each (auto repeatName in c_repeatParamList)
-				{
+		for each (auto paramInfo in pI->mRequestInterpreter.mParamList) {
+			for each (auto repeatName in c_repeatParamList) {
 #else
-			for (auto paramInfo : pI->mRequestInterpreter.mParamList)
-			{
-				for (auto repeatName : c_repeatParamList)
-				{
+		for (auto paramInfo : pI->mRequestInterpreter.mParamList) {
+			for (auto repeatName : c_repeatParamList) {
 #endif
-					if (paramInfo.mName == repeatName)
-						DbgEx("request参数名字重复, error, %s", paramInfo.mName.c_str());
-				}
+
+				if (paramInfo.mName == repeatName)
+					DbgEx("request参数名字重复, error, %s", paramInfo.mName.c_str());
 			}
-			//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
-			paramJs = js;
 		}
-		GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
-	}
+		//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
 
-	void CWSCodec::SerializeRegister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		unsigned int i4 = 0;
-		GetCJsonIntergerValue(js, "transID", i4, errmsg);
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		GetCJsonObjectValue(js, "entity", s, errmsg);
-		WriteT(data, s, wpos, capacity);
-		s = "";
-		WriteT(data, s, wpos, capacity);
-	}
+		paramJs = js;
+			}
+	GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
 
-	void CWSCodec::SerializeUnregister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "transID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-	}
+	return;
+		}
+#ifdef OPEN_LINKINFO
+std::pair<bool, std::tuple<CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, CSimpleStringA, int>> CWSCodec::GetLinkContex(cJSON * js, char* data, char* errmsg)
+{
+	/*
+	typedef struct {
+	char businessId[32];	//32
+	char traceId[32];		//32
+	char spanId[16];		//16
+	char parentSpanId[16];	//16
+	char timestamp[16];	//16
+	int reservedControl;
+}link_context;
+	*/
 
-	void CWSCodec::SerializeLogEvent(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "securityLevel")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		i4 = cJSON_GetObjectItem(js, "eventCode")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "message")->valuestring;
-		WriteT(data, s, wpos, capacity);
-	}
+	CSimpleStringA BussinessId, TraceId, SpanId, ParentSpanId, Timestamp;
+	int ReservedControl;
+	GetCJsonObjectValue(js, "BussinessId", BussinessId, errmsg);
+	GetCJsonObjectValue(js, "TraceId", TraceId, errmsg);
+	GetCJsonObjectValue(js, "SpanId", SpanId, errmsg);
+	GetCJsonObjectValue(js, "ParentSpanId", ParentSpanId, errmsg);
+	GetCJsonObjectValue(js, "Timestamp", Timestamp, errmsg);
+	GetCJsonIntergerValue(js, "ReservedControl", ReservedControl, errmsg);
+
+	if (BussinessId.GetLength() > 0 && BussinessId.GetLength() < 32 && TraceId.GetLength() == 32 && SpanId.GetLength() == 16 && ParentSpanId.GetLength() == 16)
+		return std::make_pair(true, std::make_tuple(BussinessId, TraceId, SpanId, ParentSpanId, Timestamp, ReservedControl));
+	else
+		return std::make_pair(false, std::make_tuple("", "", "", "", "", 0));
+
+}
+#endif
 
-	void CWSCodec::SerializeLogWarn(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "securityLevel")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		i4 = cJSON_GetObjectItem(js, "eventCode")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "message")->valuestring;
-		WriteT(data, s, wpos, capacity);
+void CWSCodec::SerializeBeginSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	int i4 = 0;
+	GetCJsonIntergerValue(js, "transID", i4, errmsg);
+	WriteT(data, i4, wpos, capacity);
+	CSimpleStringA s = "";
+	GetCJsonObjectValue(js, "entity", s, errmsg);
+	WriteT(data, s, wpos, capacity);
+	GetCJsonObjectValue(js, "method", s, errmsg);
+	WriteT(data, s, wpos, capacity);
+	GetCJsonObjectValue(js, "class", s, errmsg);
+	WriteT(data, s, wpos, capacity);
+
+}
+
+void CWSCodec::SerializeEndSession(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	int i4 = 0;
+	i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
+	WriteT(data, i4, wpos, capacity);
+}
+
+void CWSCodec::SerializeRequest(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	unsigned int i4 = 0;
+	GetCJsonIntergerValue(js, "transID", i4, errmsg);
+	WriteT(data, i4, wpos, capacity);
+	GetCJsonIntergerValue(js, "sessionID", i4, errmsg);
+	WriteT(data, i4, wpos, capacity);
+	GetCJsonIntergerValue(js, "methodID", i4, errmsg);
+	WriteT(data, i4, wpos, capacity);
+	GetCJsonIntergerValue(js, "signature", i4, errmsg);
+	WriteT(data, i4, wpos, capacity);
+	GetCJsonIntergerValue(js, "timeout", i4, errmsg);
+	WriteT(data, i4, wpos, capacity);
+#ifdef OPEN_LINKINFO
+	auto linkContextRet = GetLinkContex(js, data, errmsg);
+	if (linkContextRet.first) {
+		WriteT(data, std::get<0>(linkContextRet.second), wpos, capacity);
+		WriteT(data, std::get<1>(linkContextRet.second), wpos, capacity);
+		WriteT(data, std::get<2>(linkContextRet.second), wpos, capacity);
+		WriteT(data, std::get<3>(linkContextRet.second), wpos, capacity);
+	} else// 生成链路信息
+	{
+		CSimpleStringA bussinessId = "ChromiumAutoGen";
+		CSimpleStringA traceId = uuid4_generate(32).c_str();
+		CSimpleStringA spanId = uuid4_generate(16).c_str();
+		CSimpleStringA parentSpanId = "0";
+		WriteT(data, bussinessId, wpos, capacity);//为适配silverlight,默认写入就是unicode
+		WriteT(data, traceId, wpos, capacity);
+		WriteT(data, spanId, wpos, capacity);
+		WriteT(data, parentSpanId, wpos, capacity);
 	}
+#endif
 
-	void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "transID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "name")->valuestring;
-		WriteT(data, s, wpos, capacity);
-		s = cJSON_GetObjectItem(js, "value")->valuestring;
-		WriteT(data, s, wpos, capacity);
+	if (NULL == pI) {
+		// 没有对应定义
+		DbgEx("没有对应定义");
+		return;
 	}
 
-	using namespace std;
-	vector<string> split(const string & s, const string & seperator) {
-		vector<string> result;
-		typedef string::size_type string_size;
-		string_size i = 0;
-
-		while (i != s.size()) {
-			//找到字符串中首个不等于分隔符的字母;
-			int flag = 0;
-			while (i != s.size() && flag == 0) {
-				flag = 1;
-				for (string_size x = 0; x < seperator.size(); ++x)
-					if (s[i] == seperator[x]) {
-						++i;
-						flag = 0;
-						break;
-					}
-			}
-
-			//找到又一个分隔符,将两个分隔符之间的字符串取出;
-			flag = 0;
-			string_size j = i;
-			while (j != s.size() && flag == 0) {
-				for (string_size x = 0; x < seperator.size(); ++x)
-					if (s[j] == seperator[x]) {
-						flag = 1;
-						break;
-					}
-				if (flag == 0)
-					++j;
+	auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
+	if (paramJs == NULL) {
+		//detect the same name 
+		std::string t_arr[] = { "transID", "sessionID", "methodID", "signature", "timeout" ,"messageType","class","entity","methodID" };
+		std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
+#if (defined _WIN32 || defined _WIN64)
+		for each (auto paramInfo in pI->mRequestInterpreter.mParamList) {
+			for each (auto repeatName in c_repeatParamList) {
+#else
+		for (auto paramInfo : pI->mRequestInterpreter.mParamList) {
+			for (auto repeatName : c_repeatParamList) {
+#endif
+				if (paramInfo.mName == repeatName)
+					DbgEx("request参数名字重复, error, %s", paramInfo.mName.c_str());
 			}
-			if (i != j) {
-				result.emplace_back(s.substr(i, j - i));
-				i = j;
+		}
+		//如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
+		paramJs = js;
 			}
+	GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
 		}
-		return result;
-	}
-
-	void CWSCodec::SerializeGetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		int i4 = 0;
-		i4 = cJSON_GetObjectItem(js, "transID")->valueint;
-		WriteT(data, i4, wpos, capacity);
-		CSimpleStringA s = "";
-		s = cJSON_GetObjectItem(js, "name")->valuestring;
-		WriteT(data, s, wpos, capacity);
-	}
-
 
+void CWSCodec::SerializeRegister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	unsigned int i4 = 0;
+	GetCJsonIntergerValue(js, "transID", i4, errmsg);
+	WriteT(data, i4, wpos, capacity);
+	CSimpleStringA s = "";
+	GetCJsonObjectValue(js, "entity", s, errmsg);
+	WriteT(data, s, wpos, capacity);
+	s = "";
+	WriteT(data, s, wpos, capacity);
+}
+
+void CWSCodec::SerializeUnregister(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	int i4 = 0;
+	i4 = cJSON_GetObjectItem(js, "transID")->valueint;
+	WriteT(data, i4, wpos, capacity);
+}
+
+void CWSCodec::SerializeLogEvent(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	int i4 = 0;
+	i4 = cJSON_GetObjectItem(js, "securityLevel")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	i4 = cJSON_GetObjectItem(js, "eventCode")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	CSimpleStringA s = "";
+	s = cJSON_GetObjectItem(js, "message")->valuestring;
+	WriteT(data, s, wpos, capacity);
+}
+
+void CWSCodec::SerializeLogWarn(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	int i4 = 0;
+	i4 = cJSON_GetObjectItem(js, "securityLevel")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	i4 = cJSON_GetObjectItem(js, "eventCode")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	CSimpleStringA s = "";
+	s = cJSON_GetObjectItem(js, "message")->valuestring;
+	WriteT(data, s, wpos, capacity);
+}
+
+void CWSCodec::SerializeSetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	int i4 = 0;
+	i4 = cJSON_GetObjectItem(js, "transID")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	CSimpleStringA s = "";
+	s = cJSON_GetObjectItem(js, "name")->valuestring;
+	WriteT(data, s, wpos, capacity);
+	s = cJSON_GetObjectItem(js, "value")->valuestring;
+	WriteT(data, s, wpos, capacity);
+}
+
+using namespace std;
+vector<string> split(const string & s, const string & seperator)
+{
+	vector<string> result;
+	typedef string::size_type string_size;
+	string_size i = 0;
+
+	while (i != s.size()) {
+		//找到字符串中首个不等于分隔符的字母;
+		int flag = 0;
+		while (i != s.size() && flag == 0) {
+			flag = 1;
+			for (string_size x = 0; x < seperator.size(); ++x)
+				if (s[i] == seperator[x]) {
+					++i;
+					flag = 0;
+					break;
+				}
+		}
 
-	void CWSCodec::GeneralSerialize(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg) {
-		std::list<CMethodParam>::iterator it = pI->mRequestInterpreter.mParamList.begin();
+		//找到又一个分隔符,将两个分隔符之间的字符串取出;
+		flag = 0;
+		string_size j = i;
+		while (j != s.size() && flag == 0) {
+			for (string_size x = 0; x < seperator.size(); ++x)
+				if (s[j] == seperator[x]) {
+					flag = 1;
+					break;
+				}
+			if (flag == 0)
+				++j;
+		}
+		if (i != j) {
+			result.emplace_back(s.substr(i, j - i));
+			i = j;
+		}
+	}
+	return result;
+}
+
+void CWSCodec::SerializeGetVarReq(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	int i4 = 0;
+	i4 = cJSON_GetObjectItem(js, "transID")->valueint;
+	WriteT(data, i4, wpos, capacity);
+	CSimpleStringA s = "";
+	s = cJSON_GetObjectItem(js, "name")->valuestring;
+	WriteT(data, s, wpos, capacity);
+}
+
+
+
+void CWSCodec::GeneralSerialize(cJSON * js, char* data, int* wpos, int* capacity, CMedthodInterface * pI, char* errmsg)
+{
+	std::list<CMethodParam>::iterator it = pI->mRequestInterpreter.mParamList.begin();
+
+	auto dealBlob = [](CSimpleString src, char* bin)->std::pair <int, std::string> {
+		if (!is_base64(src))
+			return std::make_pair(-1, "base64 decode failed!");
+
+		int binlen = modp_b64_decode_len(src.GetLength()) - 1;//二进制流,不需要结束
+
+		if (binlen > 0) {
+			bin = new char[binlen + 1];
+			ZeroMemory(bin, binlen + 1);
+			modp_b64_decode(bin, src.GetData(), src.GetLength());//binlen有可能比bin长
+			short objectNum = *((short*)bin);
+			int extendLen = 2 + objectNum * 2;
+			int dstLen = binlen - (binlen - extendLen) % 4;
+			return std::make_pair(dstLen, "");
+		} else
+			return std::make_pair(-1, "error binlen");
+	};
+
+	while (it != pI->mRequestInterpreter.mParamList.end()) {
+		if (it->mType == "int") {
+			unsigned int d = 0;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "bool") {
+			bool d = true;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "double") {
+			double d = 0;
+			GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "char") {
+			char d = 0;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "short") {
+			short d = 0;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "ushort") {
+			unsigned short d = 0;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "uint") {
+			unsigned int d = 0;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "int64") {
+			__int64 d = 0;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "uint64") {
+#if (defined _WIN32 || defined _WIN64)
+			unsigned __int64 d = 0;
+#else
+			u_int64_t d = 0;
+#endif
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "uchar") {
+			unsigned char d = 0;
+			GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "string") {
+			CSimpleStringA d = "";
+			GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
+			//DbgEx("GeneralSerialize string %s -> %s", it->mName.c_str(), d);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "wstring") {
+			CSimpleStringW d = "";
+			GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
+			WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "blob") {
+			CSimpleStringA d = "";
+			GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
+
+			if (!is_base64(d)) {
+				strcat(errmsg, "base64 decode failed!");
+				++it;
+				continue;
+			}
 
-		auto dealBlob = [](CSimpleString src, char* bin)->std::pair <int, std::string> {
-			if (!is_base64(src))
-				return std::make_pair(-1, "base64 decode failed!");
+			int binlen = modp_b64_decode_len(d.GetLength()) - 1;//二进制流,不需要结束
 
-			int binlen = modp_b64_decode_len(src.GetLength()) - 1;//二进制流,不需要结束
 
-			if (binlen > 0)
-			{
+			char* bin = NULL;
+			if (binlen > 0) {
 				bin = new char[binlen + 1];
 				ZeroMemory(bin, binlen + 1);
-				modp_b64_decode(bin, src.GetData(), src.GetLength());//binlen有可能比bin长
+				modp_b64_decode(bin, d.GetData(), d.GetLength());//binlen有可能比bin长
 				short objectNum = *((short*)bin);
 				int extendLen = 2 + objectNum * 2;
 				int dstLen = binlen - (binlen - extendLen) % 4;
-				return std::make_pair(dstLen, "");
-			}
-			else
-				return std::make_pair(-1, "error binlen");
-		};
-
-		while (it != pI->mRequestInterpreter.mParamList.end()) {
-			if (it->mType == "int")
-			{
-				unsigned int d = 0;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "bool")
-			{
-				bool d = true;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "double")
-			{
-				double d = 0;
-				GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "char")
-			{
-				char d = 0;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "short")
-			{
-				short d = 0;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "ushort")
-			{
-				unsigned short d = 0;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "uint")
-			{
-				unsigned int d = 0;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "int64")
-			{
-				__int64 d = 0;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "uint64")
-			{
-#if (defined _WIN32 || defined _WIN64)
-				unsigned __int64 d = 0;
-#else
-				u_int64_t d = 0;
-#endif
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "uchar")
-			{
-				unsigned char d = 0;
-				GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "string")
-			{
-				CSimpleStringA d = "";
-				GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
-				//DbgEx("GeneralSerialize string %s -> %s", it->mName.c_str(), d);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "wstring")
-			{
-				CSimpleStringW d = "";
-				GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
-				WriteT(data, d, wpos, capacity);
-			}
-			else if (it->mType == "blob")
-			{
-				CSimpleStringA d = "";
-				GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
 
-				if (!is_base64(d)) {
-					strcat(errmsg, "base64 decode failed!");
-					++it;
-					continue;
-				}
-
-				int binlen = modp_b64_decode_len(d.GetLength()) - 1;//二进制流,不需要结束
-
-
-				char* bin = NULL;
-				if (binlen > 0)
-				{
-					bin = new char[binlen + 1];
-					ZeroMemory(bin, binlen + 1);
-					modp_b64_decode(bin, d.GetData(), d.GetLength());//binlen有可能比bin长
-					short objectNum = *((short*)bin);
-					int extendLen = 2 + objectNum * 2;
-					int dstLen = binlen - (binlen - extendLen) % 4;
+				std::string tempBlob = "blob len , " + std::to_string((ULONGLONG)dstLen) + ":";
+				for (size_t i = 0; i < dstLen; i++)
+					tempBlob += std::to_string((ULONGLONG)(unsigned char)bin[i]) + ",";
 
-					std::string tempBlob = "blob len , " + std::to_string((ULONGLONG)dstLen) + ":";
-					for (size_t i = 0; i < dstLen; i++)
-						tempBlob += std::to_string((ULONGLONG)(unsigned char)bin[i]) + ",";
+				DbgEx(tempBlob.c_str());
+				WriteT(data, dstLen, wpos, capacity);
+				WriteT(data, bin, wpos, capacity, dstLen);
 
-					DbgEx(tempBlob.c_str());
-					WriteT(data, dstLen, wpos, capacity);
-					WriteT(data, bin, wpos, capacity, dstLen);
+				delete[]bin;
+				bin = NULL;
+			}
 
-					delete[]bin;
-					bin = NULL;
+		} else if (it->mType == "array_int") {
+			//DbgEx("array int -> ");
+			int len = 0;
+			if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
+				//DbgEx("array int -> true len = %d", len);
+				WriteT(data, len, wpos, capacity);
+				unsigned int d = 0;
+				for (int i = 0; i < len; ++i) {
+					if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg))
+						break;
+					WriteT(data, d, wpos, capacity);
 				}
-
+			} else {
+				DbgEx("array int -> false len = %d", len);
+				WriteT(data, len, wpos, capacity);
 			}
-			else if (it->mType == "array_int")
-			{
-				//DbgEx("array int -> ");
-				int len = 0;
-				if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
-					//DbgEx("array int -> true len = %d", len);
-					WriteT(data, len, wpos, capacity);
-					unsigned int d = 0;
-					for (int i = 0; i < len; ++i) {
-                        if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
-                            DbgEx("[%d] failed %s, break", i, errmsg);
-                            break;
-                        }
-						WriteT(data, d, wpos, capacity);
-					}
-				}
-				else {
-					DbgEx("array int -> false len = %d", len);
-					WriteT(data, len, wpos, capacity);
+		} else if (it->mType == "array_bool") {
+			int len = 0;
+			if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
+				WriteT(data, len, wpos, capacity);
+				unsigned int d = 0;
+				bool dst = false;
+				for (int i = 0; i < len; ++i) {
+					if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg))
+						break;
+					dst = d;
+					WriteT(data, dst, wpos, capacity);
 				}
+			} else {
+				DbgEx("array bool -> false len = %d", len);
+				WriteT(data, len, wpos, capacity);
 			}
-			else if (it->mType == "array_uint")
-			{
-				//DbgEx("array uint -> ");
-				int len = 0;
-				if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
-					//DbgEx("array int -> true len = %d", len);
-					WriteT(data, len, wpos, capacity);
-					unsigned int d = 0;
-					for (int i = 0; i < len; ++i) {
-						if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
-							DbgEx("[%d] failed %s, break", i, errmsg);
-							break;
-						}
-							
-						WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "array_uint") {
+			//DbgEx("array uint -> ");
+			int len = 0;
+			if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
+				//DbgEx("array int -> true len = %d", len);
+				WriteT(data, len, wpos, capacity);
+				unsigned int d = 0;
+				for (int i = 0; i < len; ++i) {
+					if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
+						DbgEx("[%d] failed %s, break", i, errmsg);
+						break;
 					}
+
+					WriteT(data, d, wpos, capacity);
 				}
-				else {
-					DbgEx("array int -> false len = %d", len);
-					WriteT(data, len, wpos, capacity);
-				}
+			} else {
+				DbgEx("array int -> false len = %d", len);
+				WriteT(data, len, wpos, capacity);
 			}
-			else if (it->mType == "array_string")
-			{
-				//DbgEx("array string -> ");
-				int len = 0;
-				if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
-					//DbgEx("array string -> true len = %d", len);
-					WriteT(data, len, wpos, capacity);
-					CSimpleStringA d = "";
-					for (int i = 0; i < len; ++i) {
-						if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
-							DbgEx("array string[%d] failed %s, break", i, errmsg);
-							break;
-						}
-						WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "array_string") {
+			//DbgEx("array string -> ");
+			int len = 0;
+			if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
+				//DbgEx("array string -> true len = %d", len);
+				WriteT(data, len, wpos, capacity);
+				CSimpleStringA d = "";
+				for (int i = 0; i < len; ++i) {
+					if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
+						DbgEx("array string[%d] failed %s, break", i, errmsg);
+						break;
 					}
+					WriteT(data, d, wpos, capacity);
 				}
-				else {
-					DbgEx("array string -> false len = %d", len);
-					WriteT(data, len, wpos, capacity);
-				}
+			} else {
+				DbgEx("array string -> false len = %d", len);
+				WriteT(data, len, wpos, capacity);
 			}
-			else if (it->mType == "array_wstring")
-			{
-				int len = 0;
-				if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
-					WriteT(data, len, wpos, capacity);
-					CSimpleStringW d = "";
-					for (int i = 0; i < len; ++i) {
-                        if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
-                            DbgEx("[%d] failed %s, break", i, errmsg);
-                            break;
-                        }
-						WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "array_wstring") {
+			int len = 0;
+			if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
+				WriteT(data, len, wpos, capacity);
+				CSimpleStringW d = "";
+				for (int i = 0; i < len; ++i) {
+					if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
+						DbgEx("[%d] failed %s, break", i, errmsg);
+						break;
 					}
+					WriteT(data, d, wpos, capacity);
 				}
-				else {
-					WriteT(data, len, wpos, capacity);
-				}
+			} else {
+				WriteT(data, len, wpos, capacity);
 			}
-			else if (it->mType == "array_blob") {
-				int len = 0;
-				if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
-					WriteT(data, len, wpos, capacity);
-					CSimpleStringW d = "";
-					for (int i = 0; i < len; ++i) {
-                        if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
-                            DbgEx("[%d] failed %s, break", i, errmsg);
-                            break;
-                        }
-						WriteT(data, d, wpos, capacity);
+		} else if (it->mType == "array_blob") {
+			int len = 0;
+			if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
+				WriteT(data, len, wpos, capacity);
+				CSimpleStringW d = "";
+				for (int i = 0; i < len; ++i) {
+					if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg)) {
+						DbgEx("[%d] failed %s, break", i, errmsg);
+						break;
 					}
+					WriteT(data, d, wpos, capacity);
 				}
-				else {
-					WriteT(data, len, wpos, capacity);
-				}
-			}
-			else {
-				DbgEx("GeneralSerialize error name -> type: %s -> %s", it->mName, it->mType);
+			} else {
+				WriteT(data, len, wpos, capacity);
 			}
-			++it;
+		} else {
+			DbgEx("GeneralSerialize error name -> type: %s -> %s", it->mName.c_str(), it->mType.c_str());
 		}
+		++it;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, char* dstValue, char* errmsg) {
-		cJSON* pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if (NULL != pTmpNode) {
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, char* dstValue, char* errmsg)
+{
+	cJSON* pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if (NULL != pTmpNode) {
 #if (defined _WIN32 || defined _WIN64)
-			strncpy(dstValue, pTmpNode->valuestring, strlen(pTmpNode->valuestring));
+		strncpy(dstValue, pTmpNode->valuestring, strlen(pTmpNode->valuestring));
 #else
-			strncpy(dstValue, pTmpNode->valuestring, strlen(pTmpNode->valuestring) + 1);
+		strncpy(dstValue, pTmpNode->valuestring, strlen(pTmpNode->valuestring) + 1);
 #endif
 
-			ret = true;
-		}
-		else {
-			if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
-			strncpy(dstValue, "", strlen(""));
-			ret = false;
-		}
-		return ret;
+		ret = true;
+	} else {
+		if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
+		strncpy(dstValue, "", strlen(""));
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, CSimpleStringA & dstValue, char* errmsg) {
-		cJSON* pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if (NULL != pTmpNode) {
+	return ret;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, CSimpleStringA & dstValue, char* errmsg)
+{
+	cJSON* pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if (NULL != pTmpNode) {
 #if (defined _WIN32 || defined _WIN64)
-			dstValue = pTmpNode->valuestring;
+		dstValue = pTmpNode->valuestring;
 #else
-			CSimpleStringW wStr = "";
-			UTF8ToUnicode(pTmpNode->valuestring, wStr);
-			dstValue = CSimpleStringW2A(wStr);
+		CSimpleStringW wStr = "";
+		UTF8ToUnicode(pTmpNode->valuestring, wStr);
+		dstValue = CSimpleStringW2A(wStr);
 #endif
-			ret = true;
-		}
-		else {
-			if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
-			dstValue = "";
-			ret = false;
-		}
-		return ret;
+		ret = true;
+	} else {
+		if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
+		dstValue = "";
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, std::string & dstValue, char* errmsg)
-	{
-		cJSON* pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if (NULL != pTmpNode) {
+	return ret;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, std::string & dstValue, char* errmsg)
+{
+	cJSON* pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if (NULL != pTmpNode) {
 #if (defined _WIN32 || defined _WIN64)
-			dstValue = pTmpNode->valuestring;
+		dstValue = pTmpNode->valuestring;
 #else
-			CSimpleStringW wStr = "";
-			UTF8ToUnicode(pTmpNode->valuestring, wStr);
-			dstValue = CSimpleStringW2A(wStr);
+		CSimpleStringW wStr = "";
+		UTF8ToUnicode(pTmpNode->valuestring, wStr);
+		dstValue = CSimpleStringW2A(wStr);
 #endif
-			ret = true;
-		}
-		else {
-			if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
-			dstValue = "";
-			ret = false;
-		}
-		return ret;
+		ret = true;
+	} else {
+		if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
+		dstValue = "";
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, CSimpleStringW & dstValue, char* errmsg) {
-		cJSON* pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if (NULL != pTmpNode) {
+	return ret;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, CSimpleStringW & dstValue, char* errmsg)
+{
+	cJSON* pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if (NULL != pTmpNode) {
 #if (defined _WIN32 || defined _WIN64)
-			dstValue = CSimpleStringA2W(pTmpNode->valuestring);
+		dstValue = CSimpleStringA2W(pTmpNode->valuestring);
 #else
-			UTF8ToUnicode(pTmpNode->valuestring, dstValue);
+		UTF8ToUnicode(pTmpNode->valuestring, dstValue);
 #endif
-			ret = true;
-		}
-		else {
-			if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
-			dstValue = "";
-			ret = false;
-		}
-		return ret;
-	}
-	/*
-	bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, unsigned int& dstValue,    char* errmsg){
-		cJSON *pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if(NULL != pTmpNode){
-			dstValue = *(unsigned int*)&pTmpNode->valueint;
-			ret = true;
-		}else{
-			if(nullptr != errmsg) strcat(errmsg, strKey);
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
-	}
-
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, unsigned short& dstValue,    char* errmsg){
-		cJSON *pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if(NULL != pTmpNode){
-			dstValue = pTmpNode->valueint;
-			ret = true;
-		}else{
-			if(nullptr != errmsg) strcat(errmsg, strKey);
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
+		ret = true;
+	} else {
+		if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
+		dstValue = "";
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, short& dstValue,    char* errmsg){
-		cJSON *pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if(NULL != pTmpNode){
-			dstValue = pTmpNode->valueint;
-			ret = true;
-		}else{
-			if(nullptr != errmsg) strcat(errmsg, strKey);
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
+	return ret;
+}
+/*
+bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, unsigned int& dstValue,    char* errmsg){
+	cJSON *pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if(NULL != pTmpNode){
+		dstValue = *(unsigned int*)&pTmpNode->valueint;
+		ret = true;
+	}else{
+		if(nullptr != errmsg) strcat(errmsg, strKey);
+		dstValue = 0;
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, int& dstValue,    char* errmsg){
-		cJSON *pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if(NULL != pTmpNode){
-			dstValue = pTmpNode->valueint;
-			ret = true;
-		}else{
-			if(nullptr != errmsg) strcat(errmsg, strKey);
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
+	return ret;
+}
+
+
+bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, unsigned short& dstValue,    char* errmsg){
+	cJSON *pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if(NULL != pTmpNode){
+		dstValue = pTmpNode->valueint;
+		ret = true;
+	}else{
+		if(nullptr != errmsg) strcat(errmsg, strKey);
+		dstValue = 0;
+		ret = false;
 	}
-	*/
-	bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, double& dstValue, char* errmsg) {
-		cJSON* pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if (NULL != pTmpNode) {
-			dstValue = pTmpNode->valuedouble;
-			ret = true;
-		}
-		else {
-			if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
+	return ret;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, short& dstValue,    char* errmsg){
+	cJSON *pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if(NULL != pTmpNode){
+		dstValue = pTmpNode->valueint;
+		ret = true;
+	}else{
+		if(nullptr != errmsg) strcat(errmsg, strKey);
+		dstValue = 0;
+		ret = false;
 	}
-
-	template<typename T>
-	bool CWSCodec::GetCJsonIntergerValue(cJSON * root, const char* strKey, T & dstValue, char* errmsg)
-	{
-		cJSON* pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if (NULL != pTmpNode) {
-			dstValue = pTmpNode->valueint;
-			ret = true;
-		}
-		else {
-			if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
+	return ret;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, int& dstValue,    char* errmsg){
+	cJSON *pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if(NULL != pTmpNode){
+		dstValue = pTmpNode->valueint;
+		ret = true;
+	}else{
+		if(nullptr != errmsg) strcat(errmsg, strKey);
+		dstValue = 0;
+		ret = false;
 	}
-
-	/*
-	bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, bool& dstValue,   char* errmsg){
-		cJSON *pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if(NULL != pTmpNode){
-			dstValue = pTmpNode->valueint;
-			ret = true;
-		}else{
-			if(nullptr != errmsg) strcat(errmsg, strKey);
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
+	return ret;
+}
+*/
+bool CWSCodec::GetCJsonObjectValue(cJSON * root, const char* strKey, double& dstValue, char* errmsg)
+{
+	cJSON* pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if (NULL != pTmpNode) {
+		dstValue = pTmpNode->valuedouble;
+		ret = true;
+	} else {
+		if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
+		dstValue = 0;
+		ret = false;
 	}
-	*/
-	bool CWSCodec::GetCJsonArraySize(cJSON * root, const char* strKey, int& dstValue, char* errmsg) {
-		cJSON* pTmpNode = NULL;
-		bool ret = false;
-		pTmpNode = cJSON_GetObjectItem(root, strKey);
-		if (NULL != pTmpNode) {
-			dstValue = cJSON_GetArraySize(pTmpNode);
-			ret = true;
-		}
-		else {
-			if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
-			dstValue = 0;
-			ret = false;
-		}
-		return ret;
+	return ret;
+}
+
+template<typename T>
+bool CWSCodec::GetCJsonIntergerValue(cJSON * root, const char* strKey, T & dstValue, char* errmsg)
+{
+	cJSON* pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if (NULL != pTmpNode) {
+		dstValue = pTmpNode->valueint;
+		ret = true;
+	} else {
+		if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
+		dstValue = 0;
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON * obj, int& dstValue, char* errmsg) {
-		if (cJSON_Number == obj->type)
-		{
-			dstValue = obj->valueint;
-			return true;
-		}
-		strcat(errmsg, "array member ");
+	return ret;
+}
+
+/*
+bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, bool& dstValue,   char* errmsg){
+	cJSON *pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if(NULL != pTmpNode){
+		dstValue = pTmpNode->valueint;
+		ret = true;
+	}else{
+		if(nullptr != errmsg) strcat(errmsg, strKey);
 		dstValue = 0;
-		return false;
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON * obj, unsigned int& dstValue, char* errmsg) {
-		if (cJSON_Number == obj->type)
-		{
-			dstValue = obj->valueint;
-			return true;
-		}
-		strcat(errmsg, "array member ");
+	return ret;
+}
+*/
+bool CWSCodec::GetCJsonArraySize(cJSON * root, const char* strKey, int& dstValue, char* errmsg)
+{
+	cJSON* pTmpNode = NULL;
+	bool ret = false;
+	pTmpNode = cJSON_GetObjectItem(root, strKey);
+	if (NULL != pTmpNode) {
+		dstValue = cJSON_GetArraySize(pTmpNode);
+		ret = true;
+	} else {
+		if (nullptr != errmsg) { strcat(errmsg, "-"); strcat(errmsg, strKey); }
 		dstValue = 0;
-		return false;
+		ret = false;
 	}
-
-	bool CWSCodec::GetCJsonObjectValue(cJSON * obj, CSimpleStringA & dstValue, char* errmsg) {
-		if (cJSON_String == obj->type) {
-			DbgEx("GetCJsonObjectValue CSimpleStringA = %s", obj->valuestring);
-			hexdump(obj->valuestring, strlen(obj->valuestring));
+	return ret;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON * obj, int& dstValue, char* errmsg)
+{
+	if (cJSON_Number == obj->type) {
+		dstValue = obj->valueint;
+		return true;
+	}
+	strcat(errmsg, "array member ");
+	dstValue = 0;
+	return false;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON * obj, unsigned int& dstValue, char* errmsg)
+{
+	if (cJSON_Number == obj->type) {
+		dstValue = obj->valueint;
+		return true;
+	}
+	strcat(errmsg, "array member ");
+	dstValue = 0;
+	return false;
+}
+
+bool CWSCodec::GetCJsonObjectValue(cJSON * obj, CSimpleStringA & dstValue, char* errmsg)
+{
+	if (cJSON_String == obj->type) {
+		//DbgEx("GetCJsonObjectValue CSimpleStringA = %s", obj->valuestring);
+		//hexdump(obj->valuestring, strlen(obj->valuestring));
 #if (defined _WIN32 || defined _WIN64)
-			dstValue = obj->valuestring;
+		dstValue = obj->valuestring;
 #else
-			CSimpleStringW strw = "";
-			UTF8ToUnicode(obj->valuestring, strw);
-			dstValue = CSimpleStringW2A(strw);
+		CSimpleStringW strw = "";
+		UTF8ToUnicode(obj->valuestring, strw);
+		dstValue = CSimpleStringW2A(strw);
 #endif
 
-			return true;
-		}
-		strcat(errmsg, "array member ");
-		DbgEx("GetCJsonObjectValue Type %d", obj->type);
-		dstValue = "";
-		return false;
+		return true;
 	}
+	strcat(errmsg, "array member ");
+	dstValue = "";
+	return false;
+}
 
 
-	bool CWSCodec::GetCJsonObjectValue(cJSON * obj, CSimpleStringW & dstValue, char* errmsg) {
-		if (cJSON_String == obj->type) {
+bool CWSCodec::GetCJsonObjectValue(cJSON * obj, CSimpleStringW & dstValue, char* errmsg)
+{
+	if (cJSON_String == obj->type) {
 #if (defined _WIN32 || defined _WIN64)
-			dstValue = CSimpleStringA2W(obj->valuestring);
+		dstValue = CSimpleStringA2W(obj->valuestring);
 #else
-			UTF8ToUnicode(obj->valuestring, dstValue);
+		UTF8ToUnicode(obj->valuestring, dstValue);
 #endif
-			return true;
-		}
-		strcat(errmsg, "array member ");
-		dstValue = "";
-		return false;
+		return true;
 	}
-
-	int CWSCodec::UTF8ToUnicode(char* input, CSimpleStringW & output) {
-		if (nullptr == input)
-			return -1;
+	strcat(errmsg, "array member ");
+	dstValue = "";
+	return false;
+}
+
+int CWSCodec::UTF8ToUnicode(char* input, CSimpleStringW & output)
+{
+	if (nullptr == input)
+		return -1;
 #if (defined(_WIN32) || defined(_WIN64))
-		//UTF8 to Unicode
-		//预转换,得到所需空间的大小
-		int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, input, strlen(input), NULL, 0);
-		//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
-		wchar_t* wszString = new wchar_t[wcsLen + 1];
-		//转换
-		::MultiByteToWideChar(CP_UTF8, NULL, input, strlen(input), wszString, wcsLen);
-		//最后加上'\0'
-		wszString[wcsLen] = '\0';
-		output = wszString;
-		delete[] wszString;
-		wszString = NULL;
-		return 0;
+	//UTF8 to Unicode
+	//预转换,得到所需空间的大小
+	int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, input, strlen(input), NULL, 0);
+	//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
+	wchar_t* wszString = new wchar_t[wcsLen + 1];
+	//转换
+	::MultiByteToWideChar(CP_UTF8, NULL, input, strlen(input), wszString, wcsLen);
+	//最后加上'\0'
+	wszString[wcsLen] = '\0';
+	output = wszString;
+	delete[] wszString;
+	wszString = NULL;
+	return 0;
 #else
-		std::wstring ret = SP::Utility::S2W(input);
-		output = ret.c_str();
-		return 0;
+	std::wstring ret = SP::Utility::S2W(input);
+	output = ret.c_str();
+	return 0;
 #endif
-	}
-
-	void CWSCodec::hexdump(const char* buf, const int num) {
-		char str[8192] = { 0 };
-		int i = 0;
-		char c[5] = { 0 };
-		if (num > 1200)
-		{
-			for (i = 0; i < 50; i++)
-			{
-				sprintf(c, "%02X ", (unsigned char)buf[i]);
-				strcat(str, c);
-			}
-			DbgEx("buffer too long to show!show pre 50 hex! CWSCodec hex buf : %d : %s", num, str);
-			return;
-		}
-		for (i = 0; i < num; i++)
-		{
+}
+
+void CWSCodec::hexdump(const char* buf, const int num)
+{
+	char str[8192] = { 0 };
+	int i = 0;
+	char c[5] = { 0 };
+	if (num > 1200) {
+		for (i = 0; i < 50; i++) {
 			sprintf(c, "%02X ", (unsigned char)buf[i]);
 			strcat(str, c);
 		}
-		DbgEx("CWSCodec hex buf : %s", str);
+		DbgEx("buffer too long to show!show pre 50 hex! CWSCodec hex buf : %d : %s", num, str);
 		return;
 	}
-
-	std::string CWSCodec::GetEntityName(std::string strJson) {
-		cJSON* pJson = cJSON_Parse(strJson.c_str());
-		char entity_name[64] = { 0 };
-		char errmsg[1024] = { 0 };
-
-		GetCJsonObjectValue(pJson, "entity", entity_name, errmsg);
-		std::string s(entity_name);
-		cJSON_Delete(pJson);
-		//cJSON_free(pJson);
-		return s;
+	for (i = 0; i < num; i++) {
+		sprintf(c, "%02X ", (unsigned char)buf[i]);
+		strcat(str, c);
 	}
+	DbgEx("CWSCodec hex buf : %s", str);
+	return;
+}
+
+std::string CWSCodec::GetEntityName(std::string strJson)
+{
+	cJSON* pJson = cJSON_Parse(strJson.c_str());
+	char entity_name[64] = { 0 };
+	char errmsg[1024] = { 0 };
+
+	GetCJsonObjectValue(pJson, "entity", entity_name, errmsg);
+	std::string s(entity_name);
+	cJSON_Delete(pJson);
+	return s;
+}
+
+std::string CWSCodec::GetClassName(std::string strJson)
+{
+	cJSON* pJson = cJSON_Parse(strJson.c_str());
+	char class_name[64] = { 0 };
+	char errmsg[1024] = { 0 };
+
+	GetCJsonObjectValue(pJson, "class", class_name, errmsg);
+	std::string s(class_name);
+	cJSON_Delete(pJson);
+	return s;
+}
 
-	std::string CWSCodec::GetClassName(std::string strJson) {
-		cJSON* pJson = cJSON_Parse(strJson.c_str());
-		char class_name[64] = { 0 };
-		char errmsg[1024] = { 0 };
-
-		GetCJsonObjectValue(pJson, "class", class_name, errmsg);
-		std::string s(class_name);
-		cJSON_Delete(pJson);
-		//cJSON_free(pJson);
-		return s;
 	}
-
-		}

+ 37 - 33
Module/mod_chromium/CWebsocketServer.cpp

@@ -141,16 +141,13 @@ namespace Chromium {
 
 	void CWebsocketServer::deal_webchromium_msg(std::string& payload, websocketpp::connection_hdl hdl, int messageType)
 	{
-		DbgEx("deal_webchromium_msg :%d, %s", payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
 		switch (messageType)
 		{
 		case RegisterNotify:
 		{
 			std::shared_ptr<cJSON> pJson(cJSON_Parse(payload.c_str()), [](cJSON* p) {
-				if (nullptr != p) {
-                    cJSON_Delete(p);
-					//cJSON_free(p);
-				}
+				if (nullptr != p)
+					cJSON_Delete(p);
 				});
 			auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
 			if (transIdJson == nullptr)
@@ -173,10 +170,8 @@ namespace Chromium {
 	void CWebsocketServer::deal_logMsg(std::string& payload, websocketpp::connection_hdl hdl, int messageType)
 	{
 		std::shared_ptr<cJSON> pJson(cJSON_Parse(payload.c_str()), [](cJSON* p) {
-            if (nullptr != p) {
-                cJSON_Delete(p);
-                //cJSON_free(p);
-            }
+			if (nullptr != p)
+				cJSON_Delete(p);
 			});
 		if (nullptr == pJson.get()) {
 			DbgEx("CWebsocketServer -> deal_logMsg, jsonErr:%s", payload.c_str());
@@ -206,10 +201,8 @@ namespace Chromium {
 	void CWebsocketServer::deal_sessionBreakMsg(std::string& payload, websocketpp::connection_hdl hdl)
 	{
 		std::shared_ptr<cJSON> pJson(cJSON_Parse(payload.c_str()), [](cJSON* p) {
-            if (nullptr != p) {
-                cJSON_Delete(p);
-                //cJSON_free(p);
-            }
+			if (nullptr != p)
+				cJSON_Delete(p);
 			});
 		if (nullptr == pJson.get()) {
 			DbgEx("CWebsocketServer -> deal_sessionBreakMsg, jsonErr:%s", payload.c_str());
@@ -237,7 +230,6 @@ namespace Chromium {
 	void CWebsocketServer::deal_msg(std::string& payload, websocketpp::connection_hdl hdl)
 	{
 		boost::lock_guard<boost::mutex> lock(m_dealMsgLock);	//在buffer和json处理时,deal_msg会调用多次,导致transId存在重复可能
-		DbgEx("deal_msg :%d, %s", payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
 		auto ret = this->m_serializer->JsonToBuffer(payload);
 		CMessage* p = ret.second;
 		if (ret.first == Broadcast && nullptr == p)
@@ -252,10 +244,8 @@ namespace Chromium {
 			{
 				//can not find the method
 				std::shared_ptr<cJSON> pJson(cJSON_Parse(payload.c_str()), [](cJSON* p) {
-                    if (nullptr != p) {
-                        cJSON_Delete(p);
-                        //cJSON_free(p);
-                    }
+					if (nullptr != p)
+						cJSON_Delete(p);
 					});
 				auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
 				if(transIdJson != nullptr)
@@ -271,10 +261,8 @@ namespace Chromium {
 		else if (ret.first == GetSession)
 		{
 			std::shared_ptr<cJSON> pJson(cJSON_Parse(payload.c_str()), [](cJSON* p) {
-                if (nullptr != p) {
-                    cJSON_Delete(p);
-                    //cJSON_free(p);
-                }
+				if (nullptr != p)
+					cJSON_Delete(p);
 				});
 			auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
 			if (transIdJson != nullptr)
@@ -342,6 +330,16 @@ namespace Chromium {
 
 	// websocket message handler
 	void CWebsocketServer::message_handler(websocketpp::connection_hdl hdl, server::message_ptr msg) {
+		/*
+		static bool isTest = true;
+		if (isTest)
+		{
+			msg->set_payload("{\"messageType\":13,\"transID\" : 11111,\"name\" : \"UIState\",\"value\" : \"M\"}");
+			isTest = false;
+		}
+		else
+			return;
+			*/
 		static int pos = 0;
 		static std::map<int, int> t_hdlArr;
 		int hdlPos = (long)hdl.lock().get();
@@ -358,10 +356,8 @@ namespace Chromium {
 #endif
 
 			std::shared_ptr<cJSON> pJson(cJSON_Parse(payload.c_str()), [](cJSON* p) {
-                if (nullptr != p) {
-                    cJSON_Delete(p);
-                    //cJSON_free(p);
-                }
+				if (nullptr != p)
+					cJSON_Delete(p);
 				});
 			if (nullptr == pJson.get()) {
 				DbgEx("CWebsocketServer -> message_handler, jsonErr:%s", payload.c_str());
@@ -387,11 +383,21 @@ namespace Chromium {
 
 			auto messageType = messageTypeJson->valueint;
 			if (messageType < WEB_CHROMIUM_MSG_BEGIN)
+			{
+				DbgEx("deal_msg, messageType:%d(%s), len:%d, payload:%s", messageType, GetMessageTypeString(messageType).c_str(),
+					payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
 				deal_msg(dstPayLoad, hdl);
+			}				
 			else if (messageType > WEB_CHROMIUM_MSG_BEGIN && messageType < WEB_CHROMIUM_MSG_END)
+			{
+				DbgEx("deal_webchromium_msg, messageType:%d(%s), len:%d, payload:%s", messageType, GetMessageTypeString(messageType).c_str(),
+ payload.length(), payload.length() > 800 ? payload.substr(0, 800).append("...").c_str() : payload.c_str());
 				deal_webchromium_msg(dstPayLoad, hdl, messageType);
+			}				
 			else if (messageType > METHOD_SYSTEM_START && messageType < METHOD_SYSTEM_END)
 				deal_logMsg(dstPayLoad, hdl, messageType);
+
+			//DbgEx("Leave CWebsocketServer -> message_handler");
 		};
 		boost::thread dealMsgThread(msgHandleFun);
 		dealMsgThread.join();
@@ -400,10 +406,8 @@ namespace Chromium {
 	std::string CWebsocketServer::restroreTransId(std::string payLoad)
 	{
 		std::shared_ptr<cJSON> pJson(cJSON_Parse(payLoad.c_str()), [](cJSON* p) {
-            if (nullptr != p) {
-                cJSON_Delete(p);
-                //cJSON_free(p);
-            }
+			if (nullptr != p)
+				cJSON_Delete(p);
 			});
 		auto transIdJson = cJSON_GetObjectItem(pJson.get(), "transId");
 		if (transIdJson != nullptr)
@@ -713,9 +717,9 @@ namespace Chromium {
 
 			auto ret = m_esm->DoSessionRemove(sessionId);
 			if (ret.first)
-				DbgEx("detect session %s:%d lost!remove success", ret.second.c_str(), sessionId);
+				DbgEx("MessgeType:%s, detect session %s:%d lost!remove success", GetMessageTypeString(2).c_str(), ret.second.c_str(), sessionId);
 			else
-				DbgEx("detect session %d lost!remove failed", sessionId);
+				DbgEx("MessgeType:%s, detect session %d lost!remove failed", GetMessageTypeString(2).c_str(), sessionId);
 
 		}
 		else if (5 == msg.getMessageType())
@@ -724,7 +728,7 @@ namespace Chromium {
 			auto sessionId = msg.getSessionID();
 			if (ACKPROCESS_NOTHING == ret.first)
 			{
-				DbgEx("can not find save session, process noting, %s", ret.second.c_str());//error
+				DbgEx("MessgeType:%s, can not find save session, process noting, %s", GetMessageTypeString(2).c_str(), ret.second.c_str());//error
 				return;
 			}
 			if (0 != hdlID)

+ 110 - 0
Module/mod_chromium/MessageType.cpp

@@ -0,0 +1,110 @@
+#include "MessageType.h"
+
+
+#if (defined _WIN32 || defined _WIN64)
+std::string GetMessageTypeString(int messageType) {
+#define CASE(code) \
+  case code:       \
+    return #code
+	switch (messageType)
+	{
+		CASE(Info);
+		CASE(BeginSession);
+		CASE(EndSession);
+		CASE(Request);
+		CASE(RequestAck);
+		CASE(SessionAck);
+		CASE(Register);
+		CASE(Unregister);
+		CASE(Event);
+		CASE(LogEventMsgType);
+		CASE(LogWarnMsgType);
+		CASE(SetVarReq);
+		CASE(SetVarAck);
+		CASE(GetVarReq);
+		CASE(GetVarAck);
+		CASE(Broadcast);
+		CASE(GetSession);
+		CASE(WEB_CHROMIUM_MSG_BEGIN);
+		CASE(RegisterNotify);
+		CASE(UnRegisterNotify);
+		CASE(WEB_CHROMIUM_MSG_END);
+		CASE(METHOD_SYSTEM_START);
+		CASE(METHOD_SYSTEM_LOG_DEBUG);
+		CASE(METHOD_SYSTEM_LOG_INFO);
+		CASE(METHOD_SYSTEM_LOG_WARN);
+		CASE(METHOD_SYSTEM_LOG_ERROR);
+		CASE(METHOD_SYSTEM_END);
+	default:
+		return "UNKNOWN";
+	}
+}
+#else
+std::string GetMessageTypeString(int messageType) {
+	switch (messageType)
+	{
+	case Info:
+		return "Info";
+	case BeginSession:
+		return "BeginSession";
+	case EndSession:
+		return "EndSession";
+	case Request:
+		return "Request";
+	case RequestAck:
+		return "RequestAck";
+	case SessionAck:
+		return "SessionAck";
+	case Register:
+		return "Register";
+	case Unregister:
+		return "Unregister";
+	case Event:
+		return "Event";
+	case LogEventMsgType:
+		return "LogEventMsgType";
+	case LogWarnMsgType:
+		return "LogWarnMsgType";
+	case SetVarReq:
+		return "SetVarReq";
+	case SetVarAck:
+		return "SetVarAck";
+	case GetVarReq:
+		return "GetVarReq";
+	case GetVarAck:
+		return "GetVarAck";
+	case Broadcast:
+		return "Broadcast";
+	case GetSession:
+		return "GetSession";
+	case WEB_CHROMIUM_MSG_BEGIN:
+		return "WEB_CHROMIUM_MSG_BEGIN";
+	case RegisterNotify:
+		return "RegisterNotify";
+	case UnRegisterNotify:
+		return "UnRegisterNotify";
+	case WEB_CHROMIUM_MSG_END:
+		return "WEB_CHROMIUM_MSG_END";
+	case METHOD_SYSTEM_START:
+		return "METHOD_SYSTEM_START";
+	case METHOD_SYSTEM_LOG_DEBUG:
+		return "METHOD_SYSTEM_LOG_DEBUG";
+	case METHOD_SYSTEM_LOG_INFO:
+		return "METHOD_SYSTEM_LOG_INFO";
+	case METHOD_SYSTEM_LOG_WARN:
+		return "METHOD_SYSTEM_LOG_WARN";
+	case METHOD_SYSTEM_LOG_ERROR:
+		return "METHOD_SYSTEM_LOG_ERROR";
+	case METHOD_SYSTEM_END:
+		return "METHOD_SYSTEM_END";
+	default:
+		return "UNKNOWN";
+
+	}
+}
+#endif
+
+
+
+
+

+ 4 - 0
Module/mod_chromium/MessageType.h

@@ -2,6 +2,7 @@
 #define __MESSAGE_TYPE_H
 
 #pragma once
+#include <string>
 
 enum MessageType : int
 {
@@ -52,4 +53,7 @@ typedef struct {
 	int reservedControl;
 }link_context;
 
+//(1)发现linux下inline有问题,扩展不开(2)存在宏定义拼接时,出现问题
+std::string GetMessageTypeString(int messageType);
+
 #endif

+ 83 - 0
Module/mod_chromium/baseEx.cpp

@@ -12,6 +12,10 @@
 #include "exLog/log.h"
 using namespace boost::interprocess;
 
+//read ini
+#include <boost/property_tree/ptree.hpp>  
+#include <boost/property_tree/ini_parser.hpp>
+
 #if (defined _WIN32 || defined _WIN64)
 #define BOOST_INTERPROCESS_SHARED_DIR_PATH "C:\\"
 #endif
@@ -19,11 +23,55 @@ using namespace boost::interprocess;
 void* logProducer = nullptr;
 bool g_useMagic = false;
 bool g_loggerInitSuccess = false;
+std::string g_usercodeTranslateFile = "";
 
 #define NOR_LEN 50
 #define MAX_LOG_LEN 4096
 #define MAX_CEFLOG_LEN 5120
 
+
+#if (defined _WIN32 || defined _WIN64)
+std::string UtfToGbk(const char* utf8)
+{
+	int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
+	wchar_t* wstr = new wchar_t[len + 1];
+	memset(wstr, 0, len + 1);
+	MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
+	len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
+	char* str = new char[len + 1];
+	memset(str, 0, len + 1);
+	WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
+	if (wstr) delete[] wstr;
+	return str;
+}
+
+//GBK转化为UTF8格式
+std::string ConvertGBKToUtf8(std::string& strGBK)
+{
+	int len = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK.c_str(), -1, NULL, 0);
+	wchar_t* wszUtf8 = new wchar_t[len];
+	memset(wszUtf8, 0, len);
+	MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK.c_str(), -1, wszUtf8, len);
+	len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
+	char* szUtf8 = new char[len + 1];
+	memset(szUtf8, 0, len + 1);
+	WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL);
+	std::string ret = szUtf8;
+	delete[] szUtf8;
+	delete[] wszUtf8;
+	return ret;
+}
+#else
+std::string UtfToGbk(const char* utf8)
+{
+	return utf8;
+}
+std::string ConvertGBKToUtf8(std::string& strGBK)
+{
+	return strGBK;
+}
+#endif
+
 struct cefclientLog {
 	LOG_LEVEL_E m_level;
 	LOG_TYPE_E m_type;
@@ -216,6 +264,41 @@ std::string generateTimeStr(bool isSimple)
 	return std::string(date);
 }
 
+void InitTranslateFile(std::string srcFile)
+{
+	DbgEx("InitTranslateFile %s", srcFile.c_str());
+	g_usercodeTranslateFile = srcFile;
+}
+
+std::pair<unsigned long, std::string> splitStrToUserCodeAndErrMsg(std::string srcMsg)
+{
+	const std::string headerStr = "UserError=";
+	if (srcMsg.find(headerStr) != 0)
+		return std::make_pair(0, srcMsg);
+
+	unsigned long userCode = std::stoi(srcMsg.substr(headerStr.length()));
+	std::string userCodeStr = CSimpleString::Format("0x%X", userCode).GetData();
+
+	if (g_usercodeTranslateFile.length() == 0)
+		return std::make_pair(userCode, srcMsg);
+
+	try
+	{
+		boost::property_tree::ptree ptr, tag;
+		boost::property_tree::ini_parser::read_ini(g_usercodeTranslateFile, ptr);
+
+		tag = ptr.get_child("UserCodeToMsgTip");
+		std::string tipMsg = tag.get<std::string>(userCodeStr);
+		return std::make_pair(userCode, UtfToGbk(tipMsg.c_str()));
+	}
+	catch (...) {
+		DbgEx("ini_parse failed");
+	}
+	
+	return std::make_pair(userCode, srcMsg);
+}
+
+
 //singal,退出函数
 #if (defined _WIN32 || defined _WIN64)
 #else

+ 6 - 0
Module/mod_chromium/baseEx.h

@@ -6,6 +6,7 @@
 extern void* logProducer;
 extern bool g_useMagic;
 
+
 void DbgEx(const char* str, ...);
 std::vector<std::string> find_files(const std::string srcPath, const std::string fileName, bool isDir = false);
 std::string generateTimeStr(bool isSimple = false);
@@ -15,6 +16,11 @@ bool InitFileLogger(std::string dbgPath);
 void DbgToFileLogger(std::string msg);
 
 bool deleteDir_byFileSystem(const std::string srcPath);
+void InitTranslateFile(std::string srcFile);
+std::pair<unsigned long, std::string> splitStrToUserCodeAndErrMsg(std::string srcMsg);
+
+std::string UtfToGbk(const char* utf8);
+std::string ConvertGBKToUtf8(std::string& strGBK);
 
 
 #if (defined _WIN32 || defined _WIN64)

+ 11 - 4
Module/mod_chromium/mod_chromium.cpp

@@ -271,7 +271,7 @@ namespace Chromium {
 					else
 						DbgEx("can not find %s, use default", webMaskKey.GetData());
 				}
-				if (!m_runAd && !m_runMain && !m_runExtend && !m_withBrowser && !CModTools::get_mutable_instance().IsConfigWork())
+				if (!m_runAd && !m_runMain && !m_runExtend && !m_withBrowser)
 				{
 					DbgEx("can not open centerSetting, maybe fault");
 					/*
@@ -296,6 +296,11 @@ namespace Chromium {
 					DbgEx("[ERROR]logger init failed!");
 
 #endif
+				CSimpleString translatePath;
+				GetFunction()->GetPath("Cfg", translatePath);
+				translatePath.Append(CSimpleStringA(SPLIT_SLASH_STR) + "UserCodeToMsgTip.ini");
+
+				InitTranslateFile(translatePath.GetData());
 
 				std::string magicStr = CModTools::get_mutable_instance().getMagicStr();
 				boost::thread(boost::bind(SaveCefclientLog, magicStr)).detach();
@@ -748,9 +753,11 @@ namespace Chromium {
 		CModTools::get_mutable_instance().StopChromiumBrowser(ERR_PAGE_REASON::breakdown, true);//close all tab
 		auto tmpDirArr = find_files(tmpCacheDir.GetData(), "cefCache*", true);
 
-		for (auto it = tmpDirArr.begin(); it != tmpDirArr.end(); it++)
-			LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_CACHE_CLEAER, CSimpleStringA::Format("clear chromium browser cache %s %s", it->c_str(),
-				RemoveDirRecursive(it->c_str()) ? "success" : "fail"));
+		for each (auto it in tmpDirArr)
+		{
+			LogWarn(Severity_Low, Error_Debug, LOG_EVT_CHROMIUM_BROWSER_CACHE_CLEAER, CSimpleStringA::Format("clear chromium browser cache %s %s", it.c_str(),
+				RemoveDirRecursive(it.c_str()) ? "success" : "fail"));
+		}
 
 		CModTools::get_mutable_instance().unlockGuard();
 #else

+ 1 - 1
Module/mod_chromium/mod_chromium.h

@@ -36,6 +36,7 @@
 
 
 
+
 #pragma once
 namespace Chromium {
 
@@ -163,7 +164,6 @@ namespace Chromium {
 			SP_END_ENTITY_MSG()
 
 #endif
-
 			SP_BEGIN_ENTITY_MSG("ResourceWatcher")
 			SP_MSG_HANDLE_NS_EX(ResourceWatcher, BrowserCacheClean, ResourceWatcher::BrowserCacheClean, OnBrowserCacheClean)
 			SP_END_ENTITY_MSG()

+ 9 - 1
Module/mod_guiconsole/CMakeLists.txt

@@ -29,6 +29,8 @@ endif(MSVC)
 set(MOD_VERSION_STRING "0.0.1-dev1")
 add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
 
+MESSAGE( STATUS "CONAN_INCLUDE_DIRS_JSONCPP = ${CONAN_INCLUDE_DIRS_JSONCPP}")
+
 target_include_directories(${MODULE_NAME} PRIVATE
 	${MODULE_BASE_DIR}/mod_MobileDial
 	${MODULE_BASE_DIR}/mod_accessauth
@@ -37,10 +39,16 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${MODULE_BASE_DIR}/mod_cardissuer
 	${MODULE_BASE_DIR}/mod_MaintainWatcher
 	${MODULE_BASE_DIR}/mod_cardissuer
+	${CONAN_INCLUDE_DIRS_JSONCPP}
+	${OTHER_LIB_BASE_DIR}/libRestfulFunc
+)
+
+target_link_directories(${MODULE_NAME} PRIVATE
+	${CONAN_LIB_DIRS_JSONCPP}
 )
 
 # 添加实体需要依赖的其他共享库(包括系统库)
-set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_ALL_LIBS})
+set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_ALL_LIBS} ${CONAN_PKG_LIBS_JSONCPP})
 if(MSVC)
 	conan_cmake_run(REQUIRES WTL/8.1.12085@LR04.02_ThirdParty/stable BASIC_SETUP CMAKE_TARGETS)
 	add_subdirectory(${CONAN_WTL_ROOT} ${CMAKE_CURRENT_BINARY_DIR}/WTL)

+ 2 - 2
Module/mod_guiconsole/GUIConsoleFSM.cpp

@@ -33,7 +33,7 @@ ErrorCodeEnum CGUIConsoleFSM::OnExit()
 
 void CGUIConsoleFSM::OnStateTrans(int iSrcState, int iDstState)
 {
-	Dbg("state change from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("state change from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
 
 	if (iDstState == s4 || iDstState == s5)
 	{
@@ -69,7 +69,7 @@ void CGUIConsoleFSM::s1_on_entry()
     int nUkeyFlg = 0;
     rc = pConfig->ReadConfigValueInt("Initializer", "SupportUkey", nUkeyFlg);
     assert(rc == Error_Succeed);
-    Dbg("SupportUkey[%d]", nUkeyFlg);
+    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SupportUkey[%d]", nUkeyFlg);
 
     if (1 == nUkeyFlg) {
         m_pGuiTask->ShowBeginInit(FALSE);

+ 1 - 1
Module/mod_guiconsole/GUIConsole_client_g.h

@@ -32,7 +32,7 @@ public:
 	}
 	void OnClose(ErrorCodeEnum)
 	{
-		Dbg("session closed.");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("session closed.");
 		bSessionClosed = true;
 	}
 	bool QuerySessionClosed()

+ 338 - 200
Module/mod_guiconsole/MaterialMgrCnn.cpp

@@ -9,41 +9,73 @@
 
 #endif //RVC_OS_LINUX
 
-CMaterialMgrCnn::CMaterialMgrCnn(CEntityBase *pEntity)
-:SpSecureClient(pEntity)
+static void HTTPLogCallback(const char* msg)
 {
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HTTPLogCallback gray failed, %s", msg);
 }
 
+CMaterialMgrCnn::CMaterialMgrCnn(CEntityBase* pEntity)
+	:SpSecureClient(pEntity), m_strCallRouteBranchNo(""), m_materialUrl(""), m_forceBranch(true)
+{
+
+	CSmartPointer<IConfigInfo> pConfig;
+	auto rc = pEntity->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
+	assert(rc == Error_Succeed);
+
+	rc = pConfig->ReadConfigValue("Initializer", "SubBankNo", m_strCallRouteBranchNo);
+	if (0 != m_strCallRouteBranchNo.GetLength())
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_strCallRouteBranchNo:%s", m_strCallRouteBranchNo.GetData());
+
+	rc = pConfig->ReadConfigValue("GUIConsole", "MaterialUrl", m_materialUrl);
+	if (0 != m_materialUrl.GetLength())
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_materialUrl:%s", m_materialUrl.GetData());
+
+	rc = pConfig->ReadConfigValueInt("GUIConsole", "forceBranch", m_forceBranch);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("forceBranch:%d", m_forceBranch);
+	/*对于旧版本
+	forceBranch为0,则只使用总行;forceBranch为1,则分行和总行都使用,以分行为准
+	基于有可能存在SyncMaterial数据异常问题
+	新版本
+	forceBransch为0,只使用总行;forceBranch为1,则分行和总行都使用,以分行为准;forceBranch为2,则只使用分行
+	*/
+	LoadTerminalId();
+	m_pHttpFunc = create_http(HTTPLogCallback);
+
+}
+
+
+
 
 CMaterialMgrCnn::~CMaterialMgrCnn()
 {
+
 }
 
-ErrorCodeEnum CMaterialMgrCnn::GetMD5(char *pStr, BYTE md5v[16])
+ErrorCodeEnum CMaterialMgrCnn::GetMD5(char* pStr, BYTE md5v[16])
 {
 #if defined(_MSC_VER)
-    HCRYPTPROV hCryptProv;
-    ErrorCodeEnum rc = Error_Unexpect;
+	HCRYPTPROV hCryptProv;
+	ErrorCodeEnum rc = Error_Unexpect;
 
-    if (CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)) {
-        HCRYPTHASH hHash;
-        if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)) {
-            CryptHashData(hHash, (LPBYTE)pStr, strlen(pStr), 0);
+	if (CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET)) {
+		HCRYPTHASH hHash;
+		if (CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)) {
+			CryptHashData(hHash, (LPBYTE)pStr, strlen(pStr), 0);
 
-            DWORD dwLen = 16;
-            CryptGetHashParam(hHash, HP_HASHVAL, (LPBYTE)&md5v[0], &dwLen, 0);
-            rc = Error_Succeed;
-        }
+			DWORD dwLen = 16;
+			CryptGetHashParam(hHash, HP_HASHVAL, (LPBYTE)&md5v[0], &dwLen, 0);
+			rc = Error_Succeed;
+		}
 
-        CryptDestroyHash(hHash);
-    }
+		CryptDestroyHash(hHash);
+	}
 
-    CryptReleaseContext(hCryptProv, 0);
-    return rc;
+	CryptReleaseContext(hCryptProv, 0);
+	return rc;
 #else
-    unsigned char x[MD5_DIGESTSIZE];
-    md5_ctx_t ctx;
-    md5_init(&ctx);
+	unsigned char x[MD5_DIGESTSIZE];
+	md5_ctx_t ctx;
+	md5_init(&ctx);
 	md5(x, pStr, strlen(pStr));
 	memcpy(md5v, x, MD5_DIGESTSIZE);
 	return Error_Succeed;
@@ -51,17 +83,16 @@ ErrorCodeEnum CMaterialMgrCnn::GetMD5(char *pStr, BYTE md5v[16])
 #endif //_MSC_VER
 }
 
-ErrorCodeEnum CMaterialMgrCnn::ModifyEnrolInfo(const char *pszUserID, const char *pszPwd, const char *pszAddr, const char *pszGPS)
+ErrorCodeEnum CMaterialMgrCnn::ModifyEnrolInfo(const char* pszUserID, const char* pszPwd, const char* pszAddr, const char* pszGPS)
 {
 	CSmartPointer<IPackage> pReqPkg = CreateNewPackage("ModInfo");
-	
+
 	ModifyEnrollInfoReq info = {};
 
 	if (pszAddr != NULL)
 		strncpy_s(info.EnrolAddr, sizeof(info.EnrolAddr), pszAddr, _TRUNCATE);
 
-	if (pszGPS != NULL)
-	{
+	if (pszGPS != NULL) {
 		sscanf(pszGPS, "%f,%f", &info.EnrolGPS[0], &info.EnrolGPS[4]);
 	}
 
@@ -81,7 +112,7 @@ ErrorCodeEnum CMaterialMgrCnn::ModifyEnrolInfo(const char *pszUserID, const char
 	return HandleModifyEnrollInfoRet(pRetPkg);
 }
 
-ErrorCodeEnum CMaterialMgrCnn::AddTradeManage(const char *pszTerminalNo, const char *pszAgentID, const char *pszTime)
+ErrorCodeEnum CMaterialMgrCnn::AddTradeManage(const char* pszTerminalNo, const char* pszAgentID, const char* pszTime)
 {
 	auto pReqPkg = CreateNewPackage("TradeManage");
 
@@ -101,10 +132,10 @@ ErrorCodeEnum CMaterialMgrCnn::AddTradeManage(const char *pszTerminalNo, const c
 	return HandleAddTradeManageRet(pRetPkg);
 }
 
-ErrorCodeEnum CMaterialMgrCnn::AddMaterialCounter(const char *pszTerminalNo, const char *pszMaterial)
+ErrorCodeEnum CMaterialMgrCnn::AddMaterialCounter(const char* pszTerminalNo, const char* pszMaterial)
 {
 	auto pReqPkg = CreateNewPackage("AddCount");
-	
+
 	AddMaterialCounterReq req = {};
 	strncpy_s(req.Material, sizeof(req.Material), pszMaterial, _TRUNCATE);
 	strncpy_s(req.TerminalNo, sizeof(req.TerminalNo), pszTerminalNo, _TRUNCATE);
@@ -121,34 +152,104 @@ ErrorCodeEnum CMaterialMgrCnn::AddMaterialCounter(const char *pszTerminalNo, con
 	return HandleAddMaterialCounterRet(pRetPkg);
 }
 
-ErrorCodeEnum CMaterialMgrCnn::QueryMaterialInfo(const char *pszDeviceNo, unsigned int &count, CAutoArray<CSimpleStringA> &arrDeviceNo, CAutoArray<CSimpleStringA> &arrMateriel,
-	CAutoArray<CSimpleStringA> &CardGroove, CAutoArray<CSimpleStringA> &CardBoxNo, CAutoArray<CSimpleStringA> &PsbCode, CAutoArray<CSimpleStringA> &PsbName,
-	CAutoArray<unsigned int> &CardInit, CAutoArray<unsigned int> &CardRemains, CAutoArray<unsigned int> &CardIssued, CAutoArray<unsigned int> &CardMixed,
-	CAutoArray<unsigned int> &CardPercent, CAutoArray<CSimpleStringA> &TerminalNo, CAutoArray<CSimpleStringA> &Maintainer, CAutoArray<CSimpleStringA> &MaintainTime,
-	CAutoArray<CSimpleStringA> &UpdateTime)
+ErrorCodeEnum CMaterialMgrCnn::QueryMaterialInfo(const char* pszDeviceNo, unsigned int& count, CAutoArray<CSimpleStringA>& arrDeviceNo, CAutoArray<CSimpleStringA>& arrMateriel,
+												 CAutoArray<CSimpleStringA>& CardGroove, CAutoArray<CSimpleStringA>& CardBoxNo, CAutoArray<CSimpleStringA>& PsbCode, CAutoArray<CSimpleStringA>& PsbName,
+												 CAutoArray<unsigned int>& CardInit, CAutoArray<unsigned int>& CardRemains, CAutoArray<unsigned int>& CardIssued, CAutoArray<unsigned int>& CardMixed,
+												 CAutoArray<unsigned int>& CardPercent, CAutoArray<CSimpleStringA>& TerminalNo, CAutoArray<CSimpleStringA>& Maintainer, CAutoArray<CSimpleStringA>& MaintainTime,
+												 CAutoArray<CSimpleStringA>& UpdateTime)
 {
-	auto pReqPkg = CreateNewPackage("QueryMC");
 
-	QueryMaterialInfoReq req = {};
-	strncpy_s(req.DeviceNo, sizeof(req.DeviceNo), pszDeviceNo, _TRUNCATE);
+	bool totalBranch = false, subBranch = false, useSub = true;
+	if (m_forceBranch == 0) {
+		totalBranch = true;
+		subBranch = useSub = false;
+	} else if (m_forceBranch == 1) {
+		totalBranch = subBranch = useSub = true;
+	} else if (m_forceBranch == 2) {
+		totalBranch = false;
+		subBranch = useSub = true;
+	}
 
-	pReqPkg->AddStruct("QryMCR", false, false, (BYTE*)&req, sizeof(req));
+	if (totalBranch) {
+		do {
+			if (m_materialUrl.GetLength() == 0) {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QueryMaterialInfo")("QueryMaterialInfo m_materialUrl is null");
+				break;
+			}
+
+			QueryMaterialInfoHTTPReq req;
+			req.DeviceNo = pszDeviceNo;
+			req.m_url = m_materialUrl.Append("/cardIssue/getCardIssueInfo");
+			req.m_headers.emplace(std::make_pair("Content-Type", "application/json"));
+			QueryMaterialInfoHTTPRet materialRet;
+			if (!m_pHttpFunc->Post(req, materialRet)) {//post failed
+				if (useSub == false) {
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QueryMaterialInfo")("QueryMaterialInfo by totalBranch return false");
+					return Error_TimeOut;
+				}
+				break;
+			}
+
+			count = materialRet.retData.size();
+			arrDeviceNo.Init(count + 1); arrMateriel.Init(count + 1); CardGroove.Init(count + 1); CardBoxNo.Init(count + 1); PsbCode.Init(count + 1); PsbName.Init(count + 1); CardInit.Init(count + 1);
+			CardRemains.Init(count + 1); CardIssued.Init(count + 1);	CardMixed.Init(count + 1); CardPercent.Init(count + 1); TerminalNo.Init(count + 1); Maintainer.Init(count + 1);
+			MaintainTime.Init(count + 1); UpdateTime.Init(count + 1);
+			for (int i = 0; i < count; i++) {
+				QueryMaterialInfoRetDate* curData = &(materialRet.retData[i]);
+				arrDeviceNo[i] = curData->DeviceNo;
+				arrMateriel[i] = curData->Materiel;
+				CardGroove[i] = curData->CardGroove;
+				CardBoxNo[i] = curData->CardBoxNo;
+				char tempStr[200] = "";
+				memcpy(tempStr, curData->PsbCode, sizeof(curData->PsbCode));
+				tempStr[4] = '\0';
+				PsbCode[i] = tempStr;
+				PsbName[i] = curData->PsbName;
+				CardInit[i] = curData->CardInit;
+				CardRemains[i] = curData->CardRemains;
+				CardIssued[i] = curData->CardIssued;
+				CardMixed[i] = curData->CardMixed;
+				CardPercent[i] = curData->CardPercent;
+				TerminalNo[i] = curData->TerminalNo;
+				Maintainer[i] = curData->Maintainer;
+				MaintainTime[i] = curData->MaintainTime;
+				UpdateTime[i] = curData->UpdateTime;
+			}
+			if (useSub == false) {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QueryMaterialInfo")("QueryMaterialInfo by totalBranch return true");
+				return Error_Succeed;
+			}
+
+		} while (false);
+	}
 
-	if (SendPackage(pReqPkg) == "")
-		return  Error_Unexpect;
 
-	auto pRetPkg = ReceivePackage(5);
-	if (pRetPkg == NULL)
-		return Error_TimeOut;
+	if (subBranch) {
+		do {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryMaterialInfo by branch");
+			auto pReqPkg = CreateNewPackage("QueryMC");
+			QueryMaterialInfoReq req = {};
+			strncpy_s(req.DeviceNo, sizeof(req.DeviceNo), pszDeviceNo, _TRUNCATE);
+
+			pReqPkg->AddStruct("QryMCR", false, false, (BYTE*)&req, sizeof(req));
+			if (SendPackage(pReqPkg) == "")
+				return  Error_Unexpect;
+			auto pRetPkg = ReceivePackage(5);
+			if (pRetPkg == NULL)
+				return Error_TimeOut;
 
-	return HandleQueryMaterialInfoRet(pRetPkg, count, arrDeviceNo, arrMateriel, CardGroove, CardBoxNo, PsbCode, PsbName, CardInit,
-		CardRemains, CardIssued, CardMixed, CardPercent, TerminalNo, Maintainer, MaintainTime, UpdateTime);
+			return HandleQueryMaterialInfoRet(pRetPkg, count, arrDeviceNo, arrMateriel, CardGroove, CardBoxNo, PsbCode, PsbName, CardInit,
+											  CardRemains, CardIssued, CardMixed, CardPercent, TerminalNo, Maintainer, MaintainTime, UpdateTime);
+		} while (false);
+	}
+
+	return Error_Unexpect;
 }
 
-ErrorCodeEnum CMaterialMgrCnn::GetMaterialCounter(const char *pszMaterial, const char *pszTerminalNo, const char *pszUserID, unsigned int &nLastCapacity, unsigned int &nUsedCount)
+ErrorCodeEnum CMaterialMgrCnn::GetMaterialCounter(const char* pszMaterial, const char* pszTerminalNo, const char* pszUserID, unsigned int& nLastCapacity, unsigned int& nUsedCount)
 {
 	auto pReqPkg = CreateNewPackage("GetCount");
-	
+
 	GetMaterialCounterReq req = {};
 	strncpy_s(req.Material, sizeof(req.Material), pszMaterial, _TRUNCATE);
 	strncpy_s(req.TerminalNo, sizeof(req.TerminalNo), pszTerminalNo, _TRUNCATE);
@@ -166,11 +267,11 @@ ErrorCodeEnum CMaterialMgrCnn::GetMaterialCounter(const char *pszMaterial, const
 	return HandleGetMaterialCounterRet(pRetPkg, nLastCapacity, nUsedCount);
 }
 
-ErrorCodeEnum CMaterialMgrCnn::ResetMaterialCounter(const char *pszMaterial, const char *pszTerminalNo, 
-		const char *pszUserID, int nResetCapacity, int nTerminalCount,  int nRemainCount, const char *pszComment)
+ErrorCodeEnum CMaterialMgrCnn::ResetMaterialCounter(const char* pszMaterial, const char* pszTerminalNo,
+													const char* pszUserID, int nResetCapacity, int nTerminalCount, int nRemainCount, const char* pszComment)
 {
 	auto pReqPkg = CreateNewPackage("ResetMC");
-	
+
 	ResetMaterialCounterReq req = {};
 	strncpy_s(req.Material, sizeof(req.Material), pszMaterial, _TRUNCATE);
 	strncpy_s(req.TerminalNo, sizeof(req.TerminalNo), pszTerminalNo, _TRUNCATE);
@@ -192,10 +293,10 @@ ErrorCodeEnum CMaterialMgrCnn::ResetMaterialCounter(const char *pszMaterial, con
 	return HandleResetMaterialCounterRet(pRetPkg);
 }
 
-ErrorCodeEnum CMaterialMgrCnn::MaintainerLogin(const char* pszMaintainerID, const char *pszPassword)
+ErrorCodeEnum CMaterialMgrCnn::MaintainerLogin(const char* pszMaintainerID, const char* pszPassword)
 {
 	auto pReqPkg = CreateNewPackage("UsrLogin");
-	
+
 	UserLoginReq req = {};
 	strncpy_s(req.User, sizeof(req.User), pszMaintainerID, _TRUNCATE);
 	strncpy_s(req.Password, sizeof(req.Password), pszPassword, _TRUNCATE);
@@ -212,18 +313,18 @@ ErrorCodeEnum CMaterialMgrCnn::MaintainerLogin(const char* pszMaintainerID, cons
 	return HandleMaintainerLoginRet(pRetPkg);
 }
 
-ErrorCodeEnum CMaterialMgrCnn::RegistSwallowedCard(const char *pszTerminalType, const char *pszTerminalNo, const char *pszCardNo,
-	const char *pszReasonCode, const char *pszSwallowDate, const char *pszSwallowTime, const char *pszDeviceSciNo)
+ErrorCodeEnum CMaterialMgrCnn::RegistSwallowedCard(const char* pszTerminalType, const char* pszTerminalNo, const char* pszCardNo,
+												   const char* pszReasonCode, const char* pszSwallowDate, const char* pszSwallowTime, const char* pszDeviceSciNo)
 {
 	RegistSwallowedCardReqV2 req = {};
 	strncpy_s(req.TerminalType, sizeof(req.TerminalType), pszTerminalType, _TRUNCATE);
 	strncpy_s(req.TerminalNo, sizeof(req.TerminalNo), pszTerminalNo, _TRUNCATE);
 	strncpy_s(req.CardNo, sizeof(req.CardNo), pszCardNo, _TRUNCATE);
-	
+
 	strncpy(req.ReasonCode, pszReasonCode, sizeof(req.ReasonCode));
 	strncpy(req.SwallowDate, pszSwallowDate, sizeof(req.SwallowDate));
 	strncpy(req.SwallowTime, pszSwallowTime, sizeof(req.SwallowTime));
-	
+
 	strncpy_s(req.DeviceSciNo, sizeof(req.DeviceSciNo), pszDeviceSciNo, _TRUNCATE);
 
 	auto pReqPkg = CreateNewPackage("RegCard");
@@ -239,128 +340,176 @@ ErrorCodeEnum CMaterialMgrCnn::RegistSwallowedCard(const char *pszTerminalType,
 	return HandleRegistSwallowedCardRet(pRetPkg);
 }
 
-ErrorCodeEnum CMaterialMgrCnn::SyncMaterialCount(const char *pszDeviceNo, DWORD dwCardBoxNum,
-	CAutoArray<bool> &arrMaintainFlag, CAutoArray<CSimpleStringA> &arrMaintainer, CAutoArray<unsigned int> &arrMaintainTime,
-	CAutoArray<CSimpleStringA> &arrCardBoxNo, CAutoArray<CSimpleStringA> &arrPsbCode,
-	CAutoArray<CSimpleStringA> &arrPsbName, CAutoArray<unsigned int> &arrCardInit,
-	CAutoArray<unsigned int> &arrCardRemains, CAutoArray<unsigned int> &arrCardIssued,
-	CAutoArray<unsigned int> &arrCardMixed, CAutoArray<unsigned int> &arrCardPercent)
+ErrorCodeEnum CMaterialMgrCnn::SyncMaterialCount(const char* pszDeviceNo, DWORD dwCardBoxNum,
+												 CAutoArray<bool>& arrMaintainFlag, CAutoArray<CSimpleStringA>& arrMaintainer, CAutoArray<unsigned int>& arrMaintainTime,
+												 CAutoArray<CSimpleStringA>& arrCardBoxNo, CAutoArray<CSimpleStringA>& arrPsbCode,
+												 CAutoArray<CSimpleStringA>& arrPsbName, CAutoArray<unsigned int>& arrCardInit,
+												 CAutoArray<unsigned int>& arrCardRemains, CAutoArray<unsigned int>& arrCardIssued,
+												 CAutoArray<unsigned int>& arrCardMixed, CAutoArray<unsigned int>& arrCardPercent)
 {
+
+	bool totalBranch = false, subBranch = false, useSub = true;
+	if (m_forceBranch == 0) {
+		totalBranch = true;
+		subBranch = useSub = false;
+	} else if (m_forceBranch == 1) {
+		totalBranch = subBranch = useSub = true;
+	} else if (m_forceBranch == 2) {
+		totalBranch = false;
+		subBranch = useSub = true;
+	}
+
 	CSystemStaticInfo info;
 	m_pEntity->GetFunction()->GetSystemStaticInfo(info);
 
-	SyncMaterialCountReq1 req1 = {};
-	strncpy_s(req1.TerminalNo, sizeof(req1.TerminalNo), info.strTerminalID, _TRUNCATE);
-	strncpy_s(req1.DeviceNo, sizeof(req1.DeviceNo), pszDeviceNo, _TRUNCATE);
-	strncpy_s(req1.Material, sizeof(req1.Material), "DebitCard", _TRUNCATE);
-	req1.CardBoxNum = dwCardBoxNum;
-
-	// 最后一个数组列放吞卡计数
-	char buf[1024] = {};
-	assert(sizeof(SyncMaterialCountReq2) * (dwCardBoxNum +1)< 1024);
-	SyncMaterialCountReq2 *pReq2 = (SyncMaterialCountReq2*)buf;
-	for (int i = 0; i <= dwCardBoxNum; i++)
-	{
-		pReq2[i].bMaintain= arrMaintainFlag[i];
-		if (arrMaintainFlag[i])
-		{
-			strncpy_s(pReq2[i].Maintainer, sizeof(pReq2[i].Maintainer), arrMaintainer[i], _TRUNCATE);
-			pReq2[i].MaintainTime = arrMaintainTime[i];
-		}
+	if (totalBranch) {
+		do {
+
+			if (m_materialUrl.GetLength() == 0) {
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncMaterialCount")("SyncMaterialCount m_materialUrl is null");
+				break;
+			}
+
+			SyncMaterialCountHTTPReq req;
+			req.m_url = m_materialUrl.Append("/cardIssue/insertOrUpdateCardIssue");
+			req.m_headers.emplace(std::make_pair("Content-Type", "application/json"));
+			SyncMaterialCountReq1& req1 = req.reqInfo;
+			strncpy_s(req1.TerminalNo, sizeof(req1.TerminalNo), info.strTerminalID, _TRUNCATE);
+			strncpy_s(req1.DeviceNo, sizeof(req1.DeviceNo), pszDeviceNo, _TRUNCATE);
+			strncpy_s(req1.Material, sizeof(req1.Material), "DebitCard", _TRUNCATE);
+			req1.CardBoxNum = dwCardBoxNum;
+			for (int i = 0; i <= dwCardBoxNum; i++) {
+				SyncMaterialCountReq2 pReq2;
+				memset(&pReq2, 0, sizeof(SyncMaterialCountReq2));
+				pReq2.bMaintain = arrMaintainFlag[i];
+				if (arrMaintainFlag[i]) {
+					strncpy_s(pReq2.Maintainer, sizeof(pReq2.Maintainer), arrMaintainer[i], _TRUNCATE);
+					pReq2.MaintainTime = arrMaintainTime[i];
+				}
+
+				strncpy_s(pReq2.CardBoxNo, sizeof(pReq2.CardBoxNo), arrCardBoxNo[i], _TRUNCATE);
+				strncpy_s(pReq2.PsbCode, sizeof(pReq2.PsbCode), arrPsbCode[i], _TRUNCATE);
+				strncpy_s(pReq2.PsbName, sizeof(pReq2.PsbName), arrPsbName[i], _TRUNCATE);
+				pReq2.CardInit = arrCardInit[i];
+				pReq2.CardRemains = arrCardRemains[i];
+				pReq2.CardIssued = arrCardIssued[i];
+				pReq2.CardMixed = arrCardMixed[i];
+				pReq2.CardPercent = arrCardPercent[i];
+				req.reqData.push_back(pReq2);
+			}
+			SyncMaterialCountHTTPRet materialRet;
+			bool ret = m_pHttpFunc->Post(req, materialRet);
+			if (!useSub)	//不是一定要分行服务,以分行服务同步为准
+			{
+				if (!ret)
+					return Error_TimeOut;
+				else
+					return materialRet.m_success ? Error_Succeed : Error_Unexpect;
+			} else
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SyncMaterialCount")("SyncMaterialCount by totalBranch %d", ret);
+
+		} while (false);
+	}
 
-		strncpy_s(pReq2[i].CardBoxNo, sizeof(pReq2[i].CardBoxNo), arrCardBoxNo[i], _TRUNCATE);
-		strncpy_s(pReq2[i].PsbCode, sizeof(pReq2[i].PsbCode), arrPsbCode[i], _TRUNCATE);
-		CSimpleStringA curPsbName = arrPsbName[i];
+	if (subBranch) {
+		do {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SyncMaterialCount by branch");
+
+			SyncMaterialCountReq1 req1 = {};
+			strncpy_s(req1.TerminalNo, sizeof(req1.TerminalNo), info.strTerminalID, _TRUNCATE);
+			strncpy_s(req1.DeviceNo, sizeof(req1.DeviceNo), pszDeviceNo, _TRUNCATE);
+			strncpy_s(req1.Material, sizeof(req1.Material), "DebitCard", _TRUNCATE);
+			req1.CardBoxNum = dwCardBoxNum;
+
+			// 最后一个数组列放吞卡计数
+			char buf[2048] = {};
+			assert(sizeof(SyncMaterialCountReq2) * (dwCardBoxNum + 1) < 2048);
+			SyncMaterialCountReq2* pReq2 = (SyncMaterialCountReq2*)buf;
+			for (int i = 0; i <= dwCardBoxNum; i++) {
+				pReq2[i].bMaintain = arrMaintainFlag[i];
+				if (arrMaintainFlag[i]) {
+					strncpy_s(pReq2[i].Maintainer, sizeof(pReq2[i].Maintainer), arrMaintainer[i], _TRUNCATE);
+					pReq2[i].MaintainTime = arrMaintainTime[i];
+				}
+
+				strncpy_s(pReq2[i].CardBoxNo, sizeof(pReq2[i].CardBoxNo), arrCardBoxNo[i], _TRUNCATE);
+				strncpy_s(pReq2[i].PsbCode, sizeof(pReq2[i].PsbCode), arrPsbCode[i], _TRUNCATE);
+				CSimpleStringA curPsbName = arrPsbName[i];
 #if defined(RVC_OS_LINUX)
-		const auto tmp = SP::Utility::UTF8ToGBK(std::string(curPsbName.GetData()));
-		curPsbName = tmp.c_str();
-		const auto test1 = SP::Utility::GBK2UTF8(std::string(curPsbName.GetData()));
-		Dbg("%s: convert and convert: %s", __FUNCTION__, test1.c_str());
+				const auto tmp = SP::Utility::UTF8ToGBK(std::string(curPsbName.GetData()));
+				curPsbName = tmp.c_str();
+				const auto test1 = SP::Utility::GBK2UTF8(std::string(curPsbName.GetData()));
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s: convert and convert: %s", __FUNCTION__, test1.c_str());
 #endif //RVC_OS_LINUX
-		strncpy_s(pReq2[i].PsbName, sizeof(pReq2[i].PsbName), curPsbName, _TRUNCATE);
-		pReq2[i].CardInit = arrCardInit[i];
-		pReq2[i].CardRemains = arrCardRemains[i];
-		pReq2[i].CardIssued = arrCardIssued[i];
-		pReq2[i].CardMixed = arrCardMixed[i];
-		pReq2[i].CardPercent = arrCardPercent[i];
+				strncpy_s(pReq2[i].PsbName, sizeof(pReq2[i].PsbName), curPsbName, _TRUNCATE);
+				pReq2[i].CardInit = arrCardInit[i];
+				pReq2[i].CardRemains = arrCardRemains[i];
+				pReq2[i].CardIssued = arrCardIssued[i];
+				pReq2[i].CardMixed = arrCardMixed[i];
+				pReq2[i].CardPercent = arrCardPercent[i];
+			}
+
+			auto pReqPkg = CreateNewPackage("SyncMC");
+			pReqPkg->AddStruct("SyncMC1", false, false, (BYTE*)&req1, sizeof(req1));
+			pReqPkg->AddStruct("SyncMC2", false, false, (BYTE*)pReq2, sizeof(SyncMaterialCountReq2) * (dwCardBoxNum + 1), dwCardBoxNum + 1);
+
+			if (SendPackage(pReqPkg) == "")
+				return  Error_Unexpect;
+
+			auto pReplyPkg = ReceivePackage(5);
+			if (pReplyPkg == NULL || pReplyPkg->GetServiceCode() != "SyncMC")
+				return Error_TimeOut;
+
+			return HandleSyncMaterialCount(pReplyPkg);
+		} while (false);
 	}
 
-	auto pReqPkg = CreateNewPackage("SyncMC");
-	pReqPkg->AddStruct("SyncMC1", false, false, (BYTE*)&req1, sizeof(req1));
-	pReqPkg->AddStruct("SyncMC2", false, false, (BYTE*)pReq2, sizeof(SyncMaterialCountReq2)*(dwCardBoxNum+1), dwCardBoxNum+1);
-
-	if (SendPackage(pReqPkg) == "")
-		return  Error_Unexpect;
-
-	auto pReplyPkg = ReceivePackage(5);
-	if (pReplyPkg == NULL || pReplyPkg->GetServiceCode() != "SyncMC")
-		return Error_TimeOut;
 
-	return HandleSyncMaterialCount(pReplyPkg);
+	return  Error_Unexpect;
 }
 
 void CMaterialMgrCnn::OnDisconnect()
 {
-	Dbg("connection disconnected");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connection disconnected");
 }
 
-void CMaterialMgrCnn::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
+void CMaterialMgrCnn::OnPkgAnswer(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	string serviceCode = pRecvPkg->GetServiceCode();
-	if (serviceCode == "ModInfo")
-	{
+	if (serviceCode == "ModInfo") {
 		HandleModifyEnrollInfoRet(pRecvPkg);
-	}
-	else if (serviceCode == "AddCount")
-	{
+	} else if (serviceCode == "AddCount") {
 		HandleAddMaterialCounterRet(pRecvPkg);
-	}
-	else if (serviceCode == "TradeManage")
-	{
+	} else if (serviceCode == "TradeManage") {
 		HandleAddTradeManageRet(pRecvPkg);
-	}
-	else if (serviceCode == "QryMC")
-	{
+	} else if (serviceCode == "QryMC") {
 		unsigned int count;
 		CAutoArray<CSimpleStringA> arrDeviceNo, arrMateriel, CardGroove, CardBoxNo, PsbCode, PsbName, TerminalNo, Maintainer, MaintainTime, UpdateTime;
 		CAutoArray<unsigned int> CardInit, CardRemains, CardIssued, CardMixed, CardPercent;
 		HandleQueryMaterialInfoRet(pRecvPkg, count, arrDeviceNo, arrMateriel, CardGroove, CardBoxNo, PsbCode, PsbName, CardInit, CardRemains, CardIssued, CardMixed, CardPercent,
-			TerminalNo, Maintainer, MaintainTime, UpdateTime);
-	}
-	else if (serviceCode == "GetCount")
-	{
+								   TerminalNo, Maintainer, MaintainTime, UpdateTime);
+	} else if (serviceCode == "GetCount") {
 		unsigned int nCapacity(0), nCount(0);
 		HandleGetMaterialCounterRet(pRecvPkg, nCapacity, nCount);
-	}
-	else if (serviceCode == "ResetMC")
-	{
+	} else if (serviceCode == "ResetMC") {
 		HandleResetMaterialCounterRet(pRecvPkg);
-	}
-	else if (serviceCode == "UsrLogin")
-	{
+	} else if (serviceCode == "UsrLogin") {
 		HandleMaintainerLoginRet(pRecvPkg);
-	}
-	else if (serviceCode == "RegCard")
-	{
+	} else if (serviceCode == "RegCard") {
 		HandleRegistSwallowedCardRet(pRecvPkg);
-	}
-	else if (serviceCode == "SyncMC")
-	{
+	} else if (serviceCode == "SyncMC") {
 		HandleSyncMaterialCount(pRecvPkg);
-	}
-	else
-	{
-		Dbg("unknown service code: %s", serviceCode.c_str());
+	} else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unknown service code: %s", serviceCode.c_str());
 	}
 }
 
-ErrorCodeEnum CMaterialMgrCnn::HandleModifyEnrollInfoRet(const CSmartPointer<IPackage> &pRecvPkg)
+ErrorCodeEnum CMaterialMgrCnn::HandleModifyEnrollInfoRet(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	ErrorCodeEnum rc = Error_Succeed;
-	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
-	{
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
 		rc = (ErrorCodeEnum)dwSysCode;
         const std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		LogError(Severity_Middle, rc, dwUserCode, 
@@ -369,17 +518,16 @@ ErrorCodeEnum CMaterialMgrCnn::HandleModifyEnrollInfoRet(const CSmartPointer<IPa
 		return rc;
 	}
 
-	Dbg("modify terminal deployment info succeed");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("modify terminal deployment info succeed");
 	return Error_Succeed;
 }
 
-ErrorCodeEnum CMaterialMgrCnn::HandleAddTradeManageRet(const CSmartPointer<IPackage> &pRecvPkg)
+ErrorCodeEnum CMaterialMgrCnn::HandleAddTradeManageRet(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	ErrorCodeEnum rc = Error_Succeed;
-	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
-	{
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
 		rc = (ErrorCodeEnum)dwSysCode;
         const std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		LogError(Severity_Middle, rc, dwUserCode,
@@ -388,18 +536,17 @@ ErrorCodeEnum CMaterialMgrCnn::HandleAddTradeManageRet(const CSmartPointer<IPack
 		return rc;
 	}
 
-	Dbg("add terminal trade manage succeed");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("add terminal trade manage succeed");
 	return Error_Succeed;
 }
 
 
-ErrorCodeEnum CMaterialMgrCnn::HandleAddMaterialCounterRet(const CSmartPointer<IPackage> &pRecvPkg)
+ErrorCodeEnum CMaterialMgrCnn::HandleAddMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	ErrorCodeEnum rc = Error_Succeed;
-	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
-	{
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
 		rc = (ErrorCodeEnum)dwSysCode;
         const std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		LogError(Severity_Middle, rc, dwUserCode, 
@@ -408,22 +555,21 @@ ErrorCodeEnum CMaterialMgrCnn::HandleAddMaterialCounterRet(const CSmartPointer<I
 		return rc;
 	}
 
-	Dbg("add terminal material counter succeed");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("add terminal material counter succeed");
 	return Error_Succeed;
 }
 
 //查询物料信息
-ErrorCodeEnum CMaterialMgrCnn::HandleQueryMaterialInfoRet(const CSmartPointer<IPackage> &pRecvPkg, unsigned int &count,
-	CAutoArray<CSimpleStringA> &arrDeviceNo, CAutoArray<CSimpleStringA> &arrMateriel, CAutoArray<CSimpleStringA> &CardGroove,
-	CAutoArray<CSimpleStringA> &CardBoxNo, CAutoArray<CSimpleStringA> &PsbCode, CAutoArray<CSimpleStringA> &PsbName, CAutoArray<unsigned int> &CardInit,
-	CAutoArray<unsigned int> &CardRemains, CAutoArray<unsigned int> &CardIssued, CAutoArray<unsigned int> &CardMixed, CAutoArray<unsigned int> &CardPercent,
-	CAutoArray<CSimpleStringA> &TerminalNo, CAutoArray<CSimpleStringA> &Maintainer, CAutoArray<CSimpleStringA> &MaintainTime, CAutoArray<CSimpleStringA> &UpdateTime)
+ErrorCodeEnum CMaterialMgrCnn::HandleQueryMaterialInfoRet(const CSmartPointer<IPackage>& pRecvPkg, unsigned int& count,
+														  CAutoArray<CSimpleStringA>& arrDeviceNo, CAutoArray<CSimpleStringA>& arrMateriel, CAutoArray<CSimpleStringA>& CardGroove,
+														  CAutoArray<CSimpleStringA>& CardBoxNo, CAutoArray<CSimpleStringA>& PsbCode, CAutoArray<CSimpleStringA>& PsbName, CAutoArray<unsigned int>& CardInit,
+														  CAutoArray<unsigned int>& CardRemains, CAutoArray<unsigned int>& CardIssued, CAutoArray<unsigned int>& CardMixed, CAutoArray<unsigned int>& CardPercent,
+														  CAutoArray<CSimpleStringA>& TerminalNo, CAutoArray<CSimpleStringA>& Maintainer, CAutoArray<CSimpleStringA>& MaintainTime, CAutoArray<CSimpleStringA>& UpdateTime)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	ErrorCodeEnum rc = Error_Succeed;
-	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
-	{
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
 		rc = (ErrorCodeEnum)dwSysCode;
         const std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("query material info fail, %s", errStr.c_str()));
@@ -431,49 +577,43 @@ ErrorCodeEnum CMaterialMgrCnn::HandleQueryMaterialInfoRet(const CSmartPointer<IP
 		return rc;
 	}
 
-	//Dbg("get material counter succeed");
+	//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get material counter succeed");
 	QueryMaterialInfoRet1 ret = {};
 	int nRetSize = sizeof(ret);
 	int nArrayNum = 0;
-	if (!pRecvPkg->GetStructData("QryMCA1", (BYTE*)&ret, &nRetSize, &nArrayNum))
-	{
-		Dbg("get struct {QryMCA1} fail");
+	if (!pRecvPkg->GetStructData("QryMCA1", (BYTE*)&ret, &nRetSize, &nArrayNum)) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get struct {QryMCA1} fail");
 		return Error_Param;
-	}
-	else
-		Dbg("get struct {QryMCA1} success, count:%d", ret.count);
+	} else
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get struct {QryMCA1} success, count:%d", ret.count);
 
-	QueryMaterialInfoRetDate *ret2 = new QueryMaterialInfoRetDate[ret.count];
+	QueryMaterialInfoRetDate* ret2 = new QueryMaterialInfoRetDate[ret.count];
 	ZeroMemory(ret2, sizeof(QueryMaterialInfoRetDate) * ret.count);
 	nRetSize = sizeof(QueryMaterialInfoRetDate) * ret.count;
 	nArrayNum = 0;
 
-	if (!pRecvPkg->GetStructData("QryMCA2", (BYTE *)ret2, &nRetSize, &nArrayNum))
-	{
-		Dbg("get struct {QryMCA2} fail");
-		delete []ret2;
+	if (!pRecvPkg->GetStructData("QryMCA2", (BYTE*)ret2, &nRetSize, &nArrayNum)) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get struct {QryMCA2} fail");
+		delete[]ret2;
 		return Error_Param;
-	}
-	else
-	{
-		Dbg("get struct {QryMCA2} success, retSize:%d, arrayNum:%d", nRetSize, nArrayNum);
+	} else {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get struct {QryMCA2} success, retSize:%d, arrayNum:%d", nRetSize, nArrayNum);
 	}
 
 
 	// 返回物料数
 	count = ret.count;
-	arrDeviceNo.Init(count + 1);arrMateriel.Init(count + 1);CardGroove.Init(count + 1);CardBoxNo.Init(count + 1);PsbCode.Init(count + 1);PsbName.Init(count + 1);CardInit.Init(count + 1);
-	CardRemains.Init(count + 1);CardIssued.Init(count + 1);	CardMixed.Init(count + 1);CardPercent.Init(count + 1);TerminalNo.Init(count + 1);Maintainer.Init(count + 1);
-	MaintainTime.Init(count + 1);UpdateTime.Init(count + 1);
-	for (int i = 0; i < count; i++)
-	{
+	arrDeviceNo.Init(count + 1); arrMateriel.Init(count + 1); CardGroove.Init(count + 1); CardBoxNo.Init(count + 1); PsbCode.Init(count + 1); PsbName.Init(count + 1); CardInit.Init(count + 1);
+	CardRemains.Init(count + 1); CardIssued.Init(count + 1);	CardMixed.Init(count + 1); CardPercent.Init(count + 1); TerminalNo.Init(count + 1); Maintainer.Init(count + 1);
+	MaintainTime.Init(count + 1); UpdateTime.Init(count + 1);
+	for (int i = 0; i < count; i++) {
 		arrDeviceNo[i] = ret2[i].DeviceNo;
 		arrMateriel[i] = ret2[i].Materiel;
 		CardGroove[i] = ret2[i].CardGroove;
 		CardBoxNo[i] = ret2[i].CardBoxNo;
 		char tempStr[200] = "";
 #if defined(_MSC_VER)
-        strncpy_s(tempStr, ret2[i].PsbCode, sizeof(ret2[i].PsbCode));
+		strncpy_s(tempStr, ret2[i].PsbCode, sizeof(ret2[i].PsbCode));
 #else
 		strcpy(tempStr, ret2[i].PsbCode);
 #endif //_MSC_VER
@@ -482,9 +622,9 @@ ErrorCodeEnum CMaterialMgrCnn::HandleQueryMaterialInfoRet(const CSmartPointer<IP
 #if defined(RVC_OS_LINUX)
 		const auto tmp = SP::Utility::GBK2UTF8(std::string(ret2[i].PsbName));
 		PsbName[i] = tmp.c_str();
-		Dbg("%s: conveted: %s", __FUNCTION__, PsbName[i]);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s: conveted: %s", __FUNCTION__, PsbName[i]);
 #else
-        PsbName[i] = ret2[i].PsbName;
+		PsbName[i] = ret2[i].PsbName;
 #endif //RVC_OS_LINUX
 		CardInit[i] = ret2[i].CardInit;
 		CardRemains[i] = ret2[i].CardRemains;
@@ -496,19 +636,18 @@ ErrorCodeEnum CMaterialMgrCnn::HandleQueryMaterialInfoRet(const CSmartPointer<IP
 		MaintainTime[i] = ret2[i].MaintainTime;
 		UpdateTime[i] = ret2[i].UpdateTime;
 	}
-	delete []ret2;
+	delete[]ret2;
 	return Error_Succeed;
-	
+
 }
 
-ErrorCodeEnum CMaterialMgrCnn::HandleGetMaterialCounterRet(const CSmartPointer<IPackage> &pRecvPkg, 
-	unsigned int &nLastCapacity, unsigned int &nUsedCount)
+ErrorCodeEnum CMaterialMgrCnn::HandleGetMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg,
+														   unsigned int& nLastCapacity, unsigned int& nUsedCount)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	ErrorCodeEnum rc = Error_Succeed;
-	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
-	{
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
 		rc = (ErrorCodeEnum)dwSysCode;
         const std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("get material counter fail, %s", errStr.c_str()));
@@ -516,12 +655,11 @@ ErrorCodeEnum CMaterialMgrCnn::HandleGetMaterialCounterRet(const CSmartPointer<I
 		return rc;
 	}
 
-	//Dbg("get material counter succeed");
+	//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get material counter succeed");
 	GetMaterialCounterRet ret = {};
 	int nRetSize = sizeof(ret);
 	int nArrayNum = 0;
-	if (!pRecvPkg->GetStructData("GetMCA", (BYTE*)&ret, &nRetSize, &nArrayNum))
-	{
+	if (!pRecvPkg->GetStructData("GetMCA", (BYTE*)&ret, &nRetSize, &nArrayNum)) {
 		LogError(Severity_Middle, Error_Param, 0, "get struct {GetMCA} fail");
 		return Error_Param;
 	}
@@ -532,13 +670,12 @@ ErrorCodeEnum CMaterialMgrCnn::HandleGetMaterialCounterRet(const CSmartPointer<I
 	return Error_Succeed;
 }
 
-ErrorCodeEnum CMaterialMgrCnn::HandleResetMaterialCounterRet(const CSmartPointer<IPackage> &pRecvPkg)
+ErrorCodeEnum CMaterialMgrCnn::HandleResetMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	ErrorCodeEnum rc = Error_Succeed;
-	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
-	{
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
 		rc = (ErrorCodeEnum)dwSysCode;
         const std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		LogError(Severity_Middle, rc, dwUserCode, 
@@ -547,11 +684,11 @@ ErrorCodeEnum CMaterialMgrCnn::HandleResetMaterialCounterRet(const CSmartPointer
 		return rc;
 	}
 
-	Dbg("reset material counter succeed");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("reset material counter succeed");
 	return Error_Succeed;
 }
 
-ErrorCodeEnum CMaterialMgrCnn::HandleMaintainerLoginRet(const CSmartPointer<IPackage> &pRecvPkg)
+ErrorCodeEnum CMaterialMgrCnn::HandleMaintainerLoginRet(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
@@ -565,11 +702,11 @@ ErrorCodeEnum CMaterialMgrCnn::HandleMaintainerLoginRet(const CSmartPointer<IPac
 		return rc;
 	}
 
-	Dbg("maintainer login succeed");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("maintainer login succeed");
 	return rc;
 }
 
-ErrorCodeEnum CMaterialMgrCnn::HandleRegistSwallowedCardRet(const CSmartPointer<IPackage> &pRecvPkg)
+ErrorCodeEnum CMaterialMgrCnn::HandleRegistSwallowedCardRet(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
@@ -578,27 +715,28 @@ ErrorCodeEnum CMaterialMgrCnn::HandleRegistSwallowedCardRet(const CSmartPointer<
 	{
 		std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		rc = (ErrorCodeEnum)dwSysCode;
-		LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("regist swallowed card fail, %s", errStr.c_str()));
+		LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("regist swallowed card fail, %s", strErrMsg.c_str()));
 	}
 	else
-		Dbg("regist swallowed card succeed");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("regist swallowed card succeed");
+
 
 	return rc;
 }
 
-ErrorCodeEnum CMaterialMgrCnn::HandleSyncMaterialCount(const CSmartPointer<IPackage> &pRecvPkg)
+ErrorCodeEnum CMaterialMgrCnn::HandleSyncMaterialCount(const CSmartPointer<IPackage>& pRecvPkg)
 {
 	DWORD dwSysCode, dwUserCode;
 	string strErrMsg;
 	ErrorCodeEnum rc = Error_Succeed;
-	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
-	{
+	if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg)) {
 		rc = (ErrorCodeEnum)dwSysCode;
         const std::string errStr = SP::Utility::GBK2UTF8(strErrMsg);
 		LogError(Severity_Middle, rc, dwUserCode, CSimpleStringA::Format("sync material count fail, %s", errStr.c_str()));
 	}
 	else
-		Dbg("sync material count succeed");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sync material count succeed");
+
 
 	return rc;
 }

+ 377 - 153
Module/mod_guiconsole/MaterialMgrCnn.h

@@ -2,7 +2,9 @@
 #define RVC_MODULE_MATERIALMGR_CNN_H_
 
 #pragma once
-
+#include "IHttpFunc.h"
+#include <vector>
+#include "json/json.h"
 #include "SpSecureClient.h"
 #include "GUIConsole_def_g.h"
 using namespace GUIConsole;
@@ -12,11 +14,11 @@ using namespace GUIConsole;
 // [StructName("ModInfoR")]
 struct ModifyEnrollInfoReq
 {
-	//char UserID[16];				//	登录用户
-	//BYTE Password[16];			// 登录密码(Hash)
-	char TerminalNo[16];		// 终端号码
-	BYTE EnrolGPS[8];				// 终端GPS坐标点
-	char EnrolAddr[128];			// 终端部署地址
+    //char UserID[16];				//	登录用户
+    //BYTE Password[16];			// 登录密码(Hash)
+    char TerminalNo[16];		// 终端号码
+    BYTE EnrolGPS[8];				// 终端GPS坐标点
+    char EnrolAddr[128];			// 终端部署地址
 };
 
 // 递增物料使用计数
@@ -26,115 +28,259 @@ struct AddMaterialCounterReq
     //TerminalNo	终端号	字符数字	16
     char TerminalNo[16];
 
-	//Materiel	物料代码	字符	16
-	char Material[16];
+    //Materiel	物料代码	字符	16
+    char Material[16];
 };
 
 // [StructName("AddTMR")]
 struct AddTradeManageReq
 {
-	char TerminalNo[16];
-	char AgentID[16];
-	char Time[32];
+    char TerminalNo[16];
+    char AgentID[16];
+    char Time[32];
 };
 
 //查询物料数据
 //[StructName("QryMCR")]
 struct QueryMaterialInfoReq
 {
-	char DeviceNo[16];
+    char DeviceNo[16];
 };
 
 //[StructName("QryMCA2")]
 struct QueryMaterialInfoRetDate
 {
-	char DeviceNo[16];         //发卡器编号或终端号
-	char Materiel[16];         //物料类型
-	char CardGroove[2];         //卡槽号
-	char CardBoxNo[20];         //卡箱号
-	char PsbCode[4];         //凭证种类
-	char PsbName[128];         //凭证种类名称
-	unsigned int CardInit;
-	unsigned int CardRemains;
-	unsigned int CardIssued;
-	unsigned int CardMixed;
-	unsigned int CardPercent;
-	char TerminalNo[16];         //如果是发卡器物料数据,这个是对应的Pad终端号
-	char Maintainer[16];         //物料维护人员
-	char MaintainTime[32];         //物料维护时间
-	char UpdateTime[32];         //同步时间
+    char DeviceNo[16];         //发卡器编号或终端号
+    char Materiel[16];         //物料类型
+    char CardGroove[2];         //卡槽号
+    char CardBoxNo[20];         //卡箱号
+    char PsbCode[4];         //凭证种类
+    char PsbName[128];         //凭证种类名称
+    unsigned int CardInit;
+    unsigned int CardRemains;
+    unsigned int CardIssued;
+    unsigned int CardMixed;
+    unsigned int CardPercent;
+    char TerminalNo[16];         //如果是发卡器物料数据,这个是对应的Pad终端号
+    char Maintainer[16];         //物料维护人员
+    char MaintainTime[32];         //物料维护时间
+    char UpdateTime[32];         //同步时间
 };
 
 
-// struct QueryMaterialInfoRet2
-// {
-// 	char InfoResult[2048];
-// };
-
 //[StructName("QryMCA1")]
 struct QueryMaterialInfoRet1
 {
-	unsigned int count;
+    unsigned int count;
+};
+
+struct GrayLaunchReq : CHTTPReq
+{
+    GrayLaunchReq()
+    {
+        m_timeOut = 500;
+    }
+    CSimpleStringA m_terminal_no;
+    CSimpleStringA m_branch_no;
+    CSimpleStringA m_modular;
+    virtual string ToJson()
+    {
+        char reqcontent[512];
+        sprintf(reqcontent, "{\"terminal_no\":\"%s\",\"branch_no\":\"%s\",\"modular\":\"%s\"}", m_terminal_no.GetData(),
+                m_branch_no.GetData(), m_modular.GetData());
+        return reqcontent;
+    }
+};
+
+struct GrayLaunchResponse : CHTTPRet
+{
+    GrayLaunchResponse() :m_result(false) {}
+    bool m_result;
+    virtual bool Parse(string strData)
+    {
+        //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GrayLaunchResponse: data = %s", strData.c_str());
+        Json::Value root;
+        Json::Reader reader;
+        reader.parse(strData, root, false);
+        if (root["data"].isBool()) {
+            m_result = root["data"].asBool();
+        }
+        return m_result;
+    }
+};
+
+
+struct QueryMaterialInfoHTTPReq : CHTTPReq
+{
+    QueryMaterialInfoHTTPReq() { m_timeOut = 500; }
+    CSimpleStringA DeviceNo;
+
+    virtual string ToJson()
+    {
+        char reqcontent[512];
+        sprintf(reqcontent, "{\"deviceNo\":\"%s\"}", DeviceNo.GetData());
+        return reqcontent;
+    }
+};
+
+struct QueryMaterialInfoHTTPRet : CHTTPRet
+{
+    QueryMaterialInfoHTTPRet() {}
+    std::vector<QueryMaterialInfoRetDate> retData;
+    virtual bool Parse(std::string strData)
+    {
+        //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryMaterialInfoHTTPRet: data = %s", strData.c_str());
+        Json::Value root;
+        Json::Reader reader;
+        reader.parse(strData, root);
+        if (root.isNull() || root["data"].isNull())
+            return false;
+        for (int i = 0; i < root["data"].size(); i++) {
+            QueryMaterialInfoRetDate cur;
+            auto curObject = root["data"][i];
+            ZeroMemory(&cur, sizeof(QueryMaterialInfoRetDate));
+            if (!curObject["DeviceNo"].isNull() && curObject["DeviceNo"].isString()) {
+                sprintf(cur.DeviceNo, "%s", curObject["DeviceNo"].asString().c_str());
+            } else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse DeviceNo failed");
+
+            if (!curObject["Materiel"].isNull() && curObject["Materiel"].isString())
+                sprintf(cur.Materiel, "%s", curObject["Materiel"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse Materiel failed");
+
+            if (!curObject["CardGroove"].isNull() && curObject["CardGroove"].isString())
+                sprintf(cur.CardGroove, "%s", curObject["CardGroove"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardGroove failed");
+
+            if (!curObject["CardBoxNo"].isNull() && curObject["CardBoxNo"].isString())
+                sprintf(cur.CardBoxNo, "%s", curObject["CardBoxNo"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardBoxNo failed");
+
+            if (!curObject["PsbCode"].isNull() && curObject["PsbCode"].isString())
+                sprintf(cur.PsbCode, "%s", curObject["PsbCode"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse PsbCode failed");
+
+            if (!curObject["PsbName"].isNull() && curObject["PsbName"].isString())
+                sprintf(cur.PsbName, "%s", curObject["PsbName"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse PsbName failed");
+
+            if (!curObject["CardInit"].isNull() && curObject["CardInit"].isInt())
+                cur.CardInit = curObject["CardInit"].asInt();
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardInit failed");
+
+            if (!curObject["CardRemains"].isNull() && curObject["CardRemains"].isInt())
+                cur.CardRemains = curObject["CardRemains"].asInt();
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardRemains failed");
+
+            if (!curObject["CardIssued"].isNull() && curObject["CardIssued"].isInt())
+                cur.CardIssued = curObject["CardIssued"].asInt();
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardIssued failed");
+
+            if (!curObject["CardMixed"].isNull() && curObject["CardMixed"].isInt())
+                cur.CardMixed = curObject["CardMixed"].asInt();
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardMixed failed");
+
+            if (!curObject["CardPercent"].isNull() && curObject["CardPercent"].isInt())
+                cur.CardPercent = curObject["CardPercent"].asInt();
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse CardPercent failed");
+
+            if (!curObject["TerminalNo"].isNull() && curObject["TerminalNo"].isString())
+                sprintf(cur.TerminalNo, "%s", curObject["TerminalNo"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse TerminalNo failed");
+
+            if (!curObject["Maintainer"].isNull() && curObject["Maintainer"].isString())
+                sprintf(cur.Maintainer, "%s", curObject["Maintainer"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse Maintainer failed");
+
+            if (!curObject["MaintainTime"].isNull() && curObject["MaintainTime"].isString())
+                sprintf(cur.MaintainTime, "%s", curObject["MaintainTime"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse MaintainTime failed");
+
+            if (!curObject["UpdateTime"].isNull() && curObject["UpdateTime"].isString())
+                sprintf(cur.UpdateTime, "%s", curObject["UpdateTime"].asString().c_str());
+            else
+                DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse UpdateTime failed");
+
+            retData.push_back(cur);
+        }
+
+        return true;
+    }
+
 };
 
 
+
 // 获取后台物料计数
 // [StructName("GetMCR")]
 struct GetMaterialCounterReq
 {
-	//TerminalNo	终端号	字符数字	16
-	char TerminalNo[16];
+    //TerminalNo	终端号	字符数字	16
+    char TerminalNo[16];
 
-	//Materiel	物料代码	字符	16
-	char Material[16];
+    //Materiel	物料代码	字符	16
+    char Material[16];
 
-	//Maintainer	维护人	字符	16
-	char Maintainer[16];
+    //Maintainer	维护人	字符	16
+    char Maintainer[16];
 };
 
 // [StructName("GetMCA")]
 struct GetMaterialCounterRet
 {
-	//Materiel	物料代码	字符	16
-	char Material[16];
+    //Materiel	物料代码	字符	16
+    char Material[16];
 
-	//Capacity	放置数量	整数	4
-	int Capacity;
+    //Capacity	放置数量	整数	4
+    int Capacity;
 
-	//Counter	使用计数	整数	4
-	int Counter;
+    //Counter	使用计数	整数	4
+    int Counter;
 
-	//Maintainer	上次物料添加维护人	字符	16
-	char Maintainer[16];
+    //Maintainer	上次物料添加维护人	字符	16
+    char Maintainer[16];
 
-	//维护时间	格式:年年月月日日时时分分	字符	10
-	char MaintainTime[32];
+    //维护时间	格式:年年月月日日时时分分	字符	10
+    char MaintainTime[32];
 };
 
 // 物料重置
 // [StructName("ResetMCR")]
 struct ResetMaterialCounterReq
 {
-	//TerminalNo	终端号	字符数字	16
-	char TerminalNo[16];
+    //TerminalNo	终端号	字符数字	16
+    char TerminalNo[16];
 
-	//Materiel	物料代码	字符	16
-	char Material[16];
+    //Materiel	物料代码	字符	16
+    char Material[16];
 
-	//ResetCapacity	重置数量	整数	4
-	int ResetCapacity;
+    //ResetCapacity	重置数量	整数	4
+    int ResetCapacity;
 
-	//TerminalCounter	终端对应计数	整数	4
-	int  TerminalCounter;
+    //TerminalCounter	终端对应计数	整数	4
+    int  TerminalCounter;
 
-	// 实际剩余计数
-    int RemainCounter;      
+    // 实际剩余计数
+    int RemainCounter;
 
-	//Maintainer	维护人	字符	16
-	char Maintainer[16];
+    //Maintainer	维护人	字符	16
+    char Maintainer[16];
 
-	// 不符意见
-	char Comment[128];
+    // 不符意见
+    char Comment[128];
 };
 
 // 终端用户登录
@@ -149,48 +295,48 @@ struct UserLoginReq
 // [StructName("RegCardR")]
 struct RegistSwallowedCardReq
 {
-	char TerminalType[16];
-	//TerminalNo	终端号	字符数字	16
-	char TerminalNo[16];
+    char TerminalType[16];
+    //TerminalNo	终端号	字符数字	16
+    char TerminalNo[16];
 
-	//TerminalNo	终端号	字符数字	16
-	char CardNo[20];
+    //TerminalNo	终端号	字符数字	16
+    char CardNo[20];
 
-	//Materiel	物料代码	字符	4
-	char ReasonCode[4];
+    //Materiel	物料代码	字符	4
+    char ReasonCode[4];
 
-	// 吞卡日期
-	char SwallowDate[8];
+    // 吞卡日期
+    char SwallowDate[8];
 
-	// 吞卡时间
-	char SwallowTime[6];
+    // 吞卡时间
+    char SwallowTime[6];
 };
 
 // 吞卡登记 (xkm@20160419)
 // [StructName("RegCard2")]
 struct RegistSwallowedCardReqV2
 {
-	char TerminalType[16];
-	//TerminalNo	终端号	字符数字	16
-	char TerminalNo[16];
+    char TerminalType[16];
+    //TerminalNo	终端号	字符数字	16
+    char TerminalNo[16];
 
-	//TerminalNo	终端号	字符数字	16
-	char CardNo[20];
+    //TerminalNo	终端号	字符数字	16
+    char CardNo[20];
 
-	//Materiel	物料代码	字符	4
-	char ReasonCode[4];
+    //Materiel	物料代码	字符	4
+    char ReasonCode[4];
 
-	// 吞卡日期
-	char SwallowDate[8];
+    // 吞卡日期
+    char SwallowDate[8];
 
-	// 吞卡时间
-	char SwallowTime[6];
+    // 吞卡时间
+    char SwallowTime[6];
 
-	// 发卡器编号
-	char DeviceSciNo[20];
+    // 发卡器编号
+    char DeviceSciNo[20];
 
-	// 保留字段
-	char Reserved[64];
+    // 保留字段
+    char Reserved[64];
 };
 
 
@@ -200,81 +346,159 @@ struct RegistSwallowedCardReqV2
 // [StructName("SyncMC1")]
 struct SyncMaterialCountReq1
 {
-	char TerminalNo[16]; 
-	char DeviceNo[16];
-	char Material[16];
-	DWORD CardBoxNum;
+    char TerminalNo[16];
+    char DeviceNo[16];
+    char Material[16];
+    DWORD CardBoxNum;
 };
-		
+
 // [StructName("SyncMC2")]
 struct SyncMaterialCountReq2
 {
-	bool bMaintain;
-	char Maintainer[16];
-	DWORD MaintainTime;
-	char CardBoxNo[20];
-	char PsbCode[8];
-	char PsbName[128];
-	DWORD CardInit;
-	DWORD CardRemains;
-	DWORD CardIssued;
-	DWORD CardMixed;
-	DWORD CardPercent;		
+    bool bMaintain;
+    char Maintainer[16];
+    DWORD MaintainTime;
+    char CardBoxNo[20];
+    char PsbCode[8];
+    char PsbName[128];
+    DWORD CardInit;
+    DWORD CardRemains;
+    DWORD CardIssued;
+    DWORD CardMixed;
+    DWORD CardPercent;
 };
+
+struct SyncMaterialCountHTTPReq : CHTTPReq
+{
+    SyncMaterialCountHTTPReq() { m_timeOut = 500; }
+    SyncMaterialCountReq1 reqInfo;
+    std::vector<SyncMaterialCountReq2> reqData;
+
+
+    virtual string ToJson()
+    {
+        Json::Value root;
+        Json::Value arrayObj;
+        root["terminalNo"] = reqInfo.TerminalNo;
+        root["deviceNo"] = reqInfo.DeviceNo;
+        root["materiel"] = reqInfo.Material;
+        root["cardBoxNum"] = (int)reqInfo.CardBoxNum;
+        for (int i = 0; i <= reqInfo.CardBoxNum; i++) {
+            Json::Value item;
+            item["CardBoxNo"] = reqData[i].CardBoxNo;
+            item["PsbCode"] = reqData[i].PsbCode;
+            item["PsbName"] = reqData[i].PsbName;
+            item["CardInit"] = (int)reqData[i].CardInit;
+            item["CardRemains"] = (int)reqData[i].CardRemains;
+            item["CardIssued"] = (int)reqData[i].CardIssued;
+            item["CardMixed"] = (int)reqData[i].CardMixed;
+            item["CardPercent"] = (int)reqData[i].CardPercent;
+            item["Maintainer"] = reqData[i].Maintainer;
+            if (reqData[i].MaintainTime == 0)
+                item["MaintainTime"] = "";
+            else {
+                item["MaintainTime"] = CSmallDateTime::GetNow().ToTimeString().GetData();
+                //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("MaintainTime:%d", (DWORD)CSmallDateTime::GetNow());
+            }
+
+            item["bMaintain"] = reqData[i].bMaintain;
+            arrayObj.append(item);
+        }
+        root["cardIssueList"] = arrayObj;
+        return root.toStyledString();
+    }
+};
+
+struct SyncMaterialCountHTTPRet : CHTTPRet
+{
+    SyncMaterialCountHTTPRet() : m_success(false) {}
+    bool m_success;
+    virtual bool Parse(string strData)
+    {
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SyncMaterialCountHTTPRet: data = %s", strData.c_str());
+        Json::Value root;
+        Json::Reader reader;
+        reader.parse(strData, root, false);
+        if (root["success"].isBool()) {
+            m_success = root["success"].asBool();
+        }
+        return m_success;
+    }
+};
+
+
+
 #pragma pack()
 
-class CMaterialMgrCnn: public SpSecureClient
+class CMaterialMgrCnn : public SpSecureClient
 {
 public:
-	CMaterialMgrCnn(CEntityBase *pEntity);
-
-	// 全部实现成同步版本
-	ErrorCodeEnum ModifyEnrolInfo(const char *pszUserID, const char *pszPwd, const char *pszAddr, const char *pszGPS);
-	ErrorCodeEnum AddMaterialCounter(const char *pszTerminalNo, const char *pszMaterial);
-	ErrorCodeEnum AddTradeManage(const char *pszTerminalNo, const char *pszAgentID, const char *pszTime);
-	//查询物料信息
-	ErrorCodeEnum QueryMaterialInfo(const char *pszDeviceNo, unsigned int &count, CAutoArray<CSimpleStringA> &arrDeviceNo, CAutoArray<CSimpleStringA> &arrMateriel,
-		CAutoArray<CSimpleStringA> &CardGroove, CAutoArray<CSimpleStringA> &CardBoxNo, CAutoArray<CSimpleStringA> &PsbCode, CAutoArray<CSimpleStringA> &PsbName,
-		CAutoArray<unsigned int> &CardInit, CAutoArray<unsigned int> &CardRemains, CAutoArray<unsigned int> &CardIssued, CAutoArray<unsigned int> &CardMixed, CAutoArray<unsigned int> &CardPercent, 
-		CAutoArray<CSimpleStringA> &TerminalNo, CAutoArray<CSimpleStringA> &Maintainer,	CAutoArray<CSimpleStringA> &MaintainTime, CAutoArray<CSimpleStringA> &UpdateTime);
-	ErrorCodeEnum GetMaterialCounter(const char *pszMaterial, const char *pszTerminalNo, const char *pszUserID, 
-		unsigned int &nLastCapacity, unsigned int &nUsedCount);
-	ErrorCodeEnum ResetMaterialCounter(const char *pszMaterial, const char *pszTerminalNo, const char *pszUserID, 
-																int nResetCapacity, int nTerminalCount, int nRemainCount, const char *pszComment);
-	ErrorCodeEnum MaintainerLogin(const char* pszMaintainerID, const char *pszPassword);
-	ErrorCodeEnum RegistSwallowedCard(const char *pszTerminalType, const char *pszTerminalNo, const char *pszCardNo, const char *pszReasonCode,
-		const char *pszDate, const char *pszTime, const char *pszDeviceSciNo);
-
-
-
-	ErrorCodeEnum SyncMaterialCount(const char *pszDeviceNo, DWORD dwCardBoxNum, 
-		CAutoArray<bool> &arrMaintainFlag, CAutoArray<CSimpleStringA> &arrMaintainer, CAutoArray<unsigned int> &arrMaintainTime,
-		CAutoArray<CSimpleStringA> &arrCardBoxNo, CAutoArray<CSimpleStringA> &arrPsbCode,
-		CAutoArray<CSimpleStringA> &arrPsbName, CAutoArray<unsigned int> &arrCardInit, CAutoArray<unsigned int> &arrCardRemains,
-		CAutoArray<unsigned int> &arrCardIssued, CAutoArray<unsigned int> &arrCardMixed, CAutoArray<unsigned int> &arrCardPercent);
+    CMaterialMgrCnn(CEntityBase* pEntity);
+
+    // 全部实现成同步版本
+    ErrorCodeEnum ModifyEnrolInfo(const char* pszUserID, const char* pszPwd, const char* pszAddr, const char* pszGPS);
+    ErrorCodeEnum AddMaterialCounter(const char* pszTerminalNo, const char* pszMaterial);
+    ErrorCodeEnum AddTradeManage(const char* pszTerminalNo, const char* pszAgentID, const char* pszTime);
+    //查询物料信息
+    ErrorCodeEnum QueryMaterialInfo(const char* pszDeviceNo, unsigned int& count, CAutoArray<CSimpleStringA>& arrDeviceNo, CAutoArray<CSimpleStringA>& arrMateriel,
+                                    CAutoArray<CSimpleStringA>& CardGroove, CAutoArray<CSimpleStringA>& CardBoxNo, CAutoArray<CSimpleStringA>& PsbCode, CAutoArray<CSimpleStringA>& PsbName,
+                                    CAutoArray<unsigned int>& CardInit, CAutoArray<unsigned int>& CardRemains, CAutoArray<unsigned int>& CardIssued, CAutoArray<unsigned int>& CardMixed, CAutoArray<unsigned int>& CardPercent,
+                                    CAutoArray<CSimpleStringA>& TerminalNo, CAutoArray<CSimpleStringA>& Maintainer, CAutoArray<CSimpleStringA>& MaintainTime, CAutoArray<CSimpleStringA>& UpdateTime);
+    ErrorCodeEnum GetMaterialCounter(const char* pszMaterial, const char* pszTerminalNo, const char* pszUserID,
+                                     unsigned int& nLastCapacity, unsigned int& nUsedCount);
+    ErrorCodeEnum ResetMaterialCounter(const char* pszMaterial, const char* pszTerminalNo, const char* pszUserID,
+                                       int nResetCapacity, int nTerminalCount, int nRemainCount, const char* pszComment);
+    ErrorCodeEnum MaintainerLogin(const char* pszMaintainerID, const char* pszPassword);
+    ErrorCodeEnum RegistSwallowedCard(const char* pszTerminalType, const char* pszTerminalNo, const char* pszCardNo, const char* pszReasonCode,
+                                      const char* pszDate, const char* pszTime, const char* pszDeviceSciNo);
+
+
+
+    ErrorCodeEnum SyncMaterialCount(const char* pszDeviceNo, DWORD dwCardBoxNum,
+                                    CAutoArray<bool>& arrMaintainFlag, CAutoArray<CSimpleStringA>& arrMaintainer, CAutoArray<unsigned int>& arrMaintainTime,
+                                    CAutoArray<CSimpleStringA>& arrCardBoxNo, CAutoArray<CSimpleStringA>& arrPsbCode,
+                                    CAutoArray<CSimpleStringA>& arrPsbName, CAutoArray<unsigned int>& arrCardInit, CAutoArray<unsigned int>& arrCardRemains,
+                                    CAutoArray<unsigned int>& arrCardIssued, CAutoArray<unsigned int>& arrCardMixed, CAutoArray<unsigned int>& arrCardPercent);
 
 private:
-	~CMaterialMgrCnn();
-
-	void OnDisconnect();
-	void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
-
-	ErrorCodeEnum HandleModifyEnrollInfoRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleAddMaterialCounterRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleAddTradeManageRet(const CSmartPointer<IPackage> &pRecvPkg);
-	//查询物料信息
-	ErrorCodeEnum HandleQueryMaterialInfoRet(const CSmartPointer<IPackage> &pRecvPkg, unsigned int &count, CAutoArray<CSimpleStringA> &arrDeviceNo, CAutoArray<CSimpleStringA> &arrMateriel,
-		CAutoArray<CSimpleStringA> &CardGroove, CAutoArray<CSimpleStringA> &CardBoxNo, CAutoArray<CSimpleStringA> &PsbCode, CAutoArray<CSimpleStringA> &PsbName,
-		CAutoArray<unsigned int> &CardInit, CAutoArray<unsigned int> &CardRemains, CAutoArray<unsigned int> &CardIssued, CAutoArray<unsigned int> &CardMixed, CAutoArray<unsigned int> &CardPercent, 
-		CAutoArray<CSimpleStringA> &TerminalNo, CAutoArray<CSimpleStringA> &Maintainer,	CAutoArray<CSimpleStringA> &MaintainTime, CAutoArray<CSimpleStringA> &UpdateTime);
-	ErrorCodeEnum HandleGetMaterialCounterRet(const CSmartPointer<IPackage> &pRecvPkg, unsigned int &nLastCapacity, unsigned int &nUsedCount);
-	ErrorCodeEnum HandleResetMaterialCounterRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleMaintainerLoginRet(const CSmartPointer<IPackage> &pRecvPkg);
-	ErrorCodeEnum HandleRegistSwallowedCardRet(const CSmartPointer<IPackage> &pRecvPkg);
-
-	ErrorCodeEnum HandleSyncMaterialCount(const CSmartPointer<IPackage> &pRecvPkg);
-
-	ErrorCodeEnum GetMD5(char *pStr, BYTE md5[16]);
+    ~CMaterialMgrCnn();
+
+    void OnDisconnect();
+    void OnPkgAnswer(const CSmartPointer<IPackage>& pRecvPkg);
+
+    ErrorCodeEnum HandleModifyEnrollInfoRet(const CSmartPointer<IPackage>& pRecvPkg);
+    ErrorCodeEnum HandleAddMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg);
+    ErrorCodeEnum HandleAddTradeManageRet(const CSmartPointer<IPackage>& pRecvPkg);
+    //查询物料信息
+    ErrorCodeEnum HandleQueryMaterialInfoRet(const CSmartPointer<IPackage>& pRecvPkg, unsigned int& count, CAutoArray<CSimpleStringA>& arrDeviceNo, CAutoArray<CSimpleStringA>& arrMateriel,
+                                             CAutoArray<CSimpleStringA>& CardGroove, CAutoArray<CSimpleStringA>& CardBoxNo, CAutoArray<CSimpleStringA>& PsbCode, CAutoArray<CSimpleStringA>& PsbName,
+                                             CAutoArray<unsigned int>& CardInit, CAutoArray<unsigned int>& CardRemains, CAutoArray<unsigned int>& CardIssued, CAutoArray<unsigned int>& CardMixed, CAutoArray<unsigned int>& CardPercent,
+                                             CAutoArray<CSimpleStringA>& TerminalNo, CAutoArray<CSimpleStringA>& Maintainer, CAutoArray<CSimpleStringA>& MaintainTime, CAutoArray<CSimpleStringA>& UpdateTime);
+    ErrorCodeEnum HandleGetMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg, unsigned int& nLastCapacity, unsigned int& nUsedCount);
+    ErrorCodeEnum HandleResetMaterialCounterRet(const CSmartPointer<IPackage>& pRecvPkg);
+    ErrorCodeEnum HandleMaintainerLoginRet(const CSmartPointer<IPackage>& pRecvPkg);
+    ErrorCodeEnum HandleRegistSwallowedCardRet(const CSmartPointer<IPackage>& pRecvPkg);
+
+    ErrorCodeEnum HandleSyncMaterialCount(const CSmartPointer<IPackage>& pRecvPkg);
+
+    ErrorCodeEnum GetMD5(char* pStr, BYTE md5[16]);
+
+    IHttpFunc* m_pHttpFunc;
+    CSimpleStringA m_strTerminalId;
+    CSimpleStringA m_strCallRouteBranchNo;
+    CSimpleStringA m_materialUrl;
+    BOOL m_forceBranch;
+
+    ErrorCodeEnum LoadTerminalId()
+    {
+        CSystemStaticInfo Info;
+        ErrorCodeEnum Error = m_pEntity->GetFunction()->GetSystemStaticInfo(Info);
+        if (Error == Error_Succeed) {
+            m_strTerminalId = Info.strTerminalID;
+        }
+        return Error;
+    }
+
 };
 
 #endif //RVC_MODULE_MATERIALMGR_CNN_H_

+ 3 - 3
Module/mod_guiconsole/guitask.cpp

@@ -202,7 +202,7 @@ ErrorCodeEnum GUITask::BeginAccessAuth()
 	auto rc = pClient->Connect();
 	if (rc == Error_Succeed)
 	{
-		Dbg("connect to entity [AccessAuthorization] succeed, start access auth now");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to entity [AccessAuthorization] succeed, start access auth now");
 		rc = pClient->Regist();
 		pClient->GetFunction()->CloseSession();
 	}
@@ -267,10 +267,10 @@ ErrorCodeEnum GUITask::DeleteKeySet()
 #if defined(_MSC_VER)
     HCRYPTPROV hProv(0);
     if (!CryptAcquireContext(&hProv, "RVC", MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET | CRYPT_DELETEKEYSET)) {
-        Dbg("delete keyset fail: %d", GetLastError());
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("delete keyset fail: %d", GetLastError());
         return Error_Unexpect;
     } else {
-        Dbg("delete keyset succ");
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("delete keyset succ");
         return Error_Succeed;
     }
 #else

+ 1 - 1
Module/mod_guiconsole/guitask.h

@@ -104,7 +104,7 @@ public:
 	virtual void OnCeateConnection(const char *pszCallerEntity,const char *pszServiceEntity) {}
 	virtual void OnCloseConnection(const char *pszCallerEntity,const char *pszServiceEntity) {}
 	virtual void OnUserStateHook(const char *pszEntityName,DWORD dwState,DWORD dwLastState)	{
-		//Dbg("OnUserStateHook: %s, %d -> %d", pszEntityName, dwLastState, dwState);	
+		//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnUserStateHook: %s, %d -> %d", pszEntityName, dwLastState, dwState);	
 	}
 
 	// ICallbackListener

+ 14 - 13
Module/mod_guiconsole/mainfrm.cpp

@@ -84,7 +84,7 @@ void CAboutDlg::OnOK2(UINT uNotifyCode, int nID, CWindow wndCtl)
 	auto rc = pClient->Connect();
 	if (rc != Error_Succeed)
 	{
-		Dbg("connect to MaintainWatcher entity fail: %d", rc);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to MaintainWatcher entity fail: %d", rc);
 	}
 	else
 	{
@@ -93,14 +93,14 @@ void CAboutDlg::OnOK2(UINT uNotifyCode, int nID, CWindow wndCtl)
 		rc = pClient->GetUserInfo(req, ans, 10000);
 		if (rc != Error_Succeed)
 		{
-			Dbg("get userinfo fail from MaintainWatcher: %d", rc);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get userinfo fail from MaintainWatcher: %d", rc);
 			pClient->SafeDelete();
 		}
 		else
 		{
 			// UserID=SP00000004;UserName=RVC0001;AuthorierID=SP00000001;AuthorizeTime=2014/8/13 18:46:29;RecommenderSAP=80274390;RecommenderOfficeID=274390;
 			CSimpleStringA &str = ans.UserInfo;
-			Dbg("get maintainer info: %s", (const char*)str);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get maintainer info: %s", (const char*)str);
 
 			CSimpleStringA m_strUserID, m_strUserName, m_strAuthorizer, m_strAuthTime;
 			auto arr = str.Split(';');
@@ -120,7 +120,7 @@ void CAboutDlg::OnOK2(UINT uNotifyCode, int nID, CWindow wndCtl)
 					m_strAuthTime = arr2[1];
 			}
 
-			Dbg("UserID=%s;UserName=%s;Authorizer=%s;AuthTime=%s",
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("UserID=%s;UserName=%s;Authorizer=%s;AuthTime=%s",
 				(const char*)m_strUserID,
 				(const char*)m_strUserName,
 				(const char*)m_strAuthorizer,
@@ -159,7 +159,7 @@ void CAboutDlg::OnOK4(UINT uNotifyCode, int nID, CWindow wndCtl)
 	auto rc = pEntity->GetFunction()->GetSystemStaticInfo(info);
 	if (rc != Error_Succeed)
 	{
-		Dbg("GetSystemStaticInfo fail: %d", rc);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetSystemStaticInfo fail: %d", rc);
 		return;
 	}
 
@@ -1504,7 +1504,8 @@ BOOL CSysInitView::CheckThreadRunning()
 	return TRUE;
 }
 
-void CSysInitView::TestHighLevelDbg(BOOL isShow, BOOL isHighLevel)
+void CSysInitView::TestHighLevelDbg(
+	BOOL isShow, BOOL isHighLevel)
 {
 	::PostMessage(this->GetParent(), WM_SHOW_MAINTAIN_VIEW, isShow ? 1 : 0, isHighLevel ? 1 : 0);
 }
@@ -2066,7 +2067,7 @@ void CControlView::OnCommitResult(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*w
 		}
 		else
 		{
-			Dbg("连接CardIssuer实体失败");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("连接CardIssuer实体失败");
 			pClient->SafeDelete();
 		}
 
@@ -2075,7 +2076,7 @@ void CControlView::OnCommitResult(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*w
 	else
 	{
 		rc = Error_Unexpect;
-		Dbg("未知物料: {%s}", (const char*)strMaterialCode);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("未知物料: {%s}", (const char*)strMaterialCode);
 	}
 
 	if (rc != Error_Succeed)
@@ -2099,7 +2100,7 @@ void CControlView::OnCommitResult(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*w
 	if (rc == Error_Succeed)
 	{
 		ClearAndHideMaterialEditView();
-		Dbg("重置物料{%s}计数成功", (const char*)strMaterialCode);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("重置物料{%s}计数成功", (const char*)strMaterialCode);
 		MessageBoxA("重置物料计数成功");
 	}
 	else
@@ -3258,25 +3259,25 @@ void CMainFrame::OnAbout(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/)
 
 void CMainFrame::OnInitialize(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/)
 {
-	Dbg("begin initialize...");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin initialize...");
 	m_pConsole->BeginInitialize();	
 }
 
 void CMainFrame::OnMobileDial(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/)
 {
-	Dbg("begin show mobiledial dialog...");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin show mobiledial dialog...");
 	m_pConsole->ShowMobileDialog();	
 }
 
 void CMainFrame::OnDeleteKeySet(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/)
 {
-	Dbg("delete keyset...");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("delete keyset...");
 	m_pConsole->DeleteKeySet();
 }
 
 void CMainFrame::OnMaintain(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wnd*/)
 {
-	//Dbg("begin maintain, validate user now");
+	//DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin maintain, validate user now");
 	CLoginDlg dlg;
 	if (dlg.DoModal() == IDOK)
 	{

+ 40 - 37
Module/mod_guiconsole/mod_guiconsole.cpp

@@ -16,9 +16,9 @@ void CGUIConsoleEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPoin
 	m_FSM.Init(this);
 	auto  rc = SubscribeEntitysEvents();
 	if (rc != Error_Succeed)
-		Dbg("subscribe MaintainWatcher event fail, %s",  SpStrError(rc));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe MaintainWatcher event fail, %s",  SpStrError(rc));
 	else
-		Dbg("subscribe MaintainWatcher event succeed");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe MaintainWatcher event succeed");
 		
     bool toInitializeSysLog(true);
     CSmartPointer<IConfigInfo> pConfig;
@@ -56,19 +56,21 @@ void CGUIConsoleEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogI
 	const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
 	const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext& pLinkInfo)
 	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnLog(entity = %s, syscode = 0x%X, usercode = 0x%X", pszEntityName, dwSysError, dwUserCode);
+
 		if (dwUserCode == EVENT_MACHINE_COVER_OPEN)		// 机盖打开
 		{
-			Dbg("the machine cover open!!");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the machine cover open!!");
 			m_FSM.PostEventFIFO(new FSMEvent(CGUIConsoleFSM::Event_CoverOpen));
 		}
 		else if (dwUserCode == EVENT_MACHINE_COVER_CLOSE)	// 机盖关闭
 		{
-			Dbg("the machine cover close.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the machine cover close.");
 			m_FSM.PostEventFIFO(new FSMEvent(CGUIConsoleFSM::Event_CoverClose));
 		}
 		else if (dwUserCode == EVENT_UKEY_INSERTED)		// 证书插入
 		{			
-			Dbg("the key inserted");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the key inserted");
 			m_FSM.PostEventFIFO(new FSMEvent(CGUIConsoleFSM::Event_UKeyInserted));
 		}
 		else if ((dwUserCode == EVENT_UKEY_LOW_LEVEL)		// 具有维护权
@@ -77,9 +79,9 @@ void CGUIConsoleEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogI
 			bool bLowLevel = dwUserCode == EVENT_UKEY_LOW_LEVEL;
 			
 			if (bLowLevel)
-				Dbg("lower priviledge");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("lower priviledge");
 			else
-				Dbg("higher priviledge");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("higher priviledge");
 
 			// 调用UKey接口取维护人员信息
 			m_strUserID = "";
@@ -91,7 +93,7 @@ void CGUIConsoleEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogI
 			auto rc = pClient->Connect();
 			if (rc != Error_Succeed)
 			{
-				Dbg("connect to MaintainWatcher entity fail: %d", rc);
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to MaintainWatcher entity fail: %d", rc);
 				pClient->SafeDelete();
 			}
 			else
@@ -101,13 +103,13 @@ void CGUIConsoleEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogI
 				rc = pClient->GetUserInfo(req, ans, 10000);
 				if (rc != Error_Succeed)
 				{
-					Dbg("get userinfo fail from MaintainWatcher: %s", SpStrError(rc));
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get userinfo fail from MaintainWatcher: %s", SpStrError(rc));
 				}
 				else
 				{
 					// UserID=SP00000004;UserName=RVC0001;AuthorierID=SP00000001;AuthorizeTime=2014/8/13 18:46:29;RecommenderSAP=80274390;RecommenderOfficeID=274390;
 					CSimpleStringA &str = ans.UserInfo;
-					Dbg("get maintainer info: %s", (const char*)str);
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get maintainer info: %s", (const char*)str);
 
 					auto arr = str.Split(';');
 					for (int i = 0; i < arr.GetCount(); i++)
@@ -148,13 +150,13 @@ void CGUIConsoleEntity::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogI
 			m_strCurRight = "";
 			m_dwBeginTime = 0;
 
-			Dbg("certificate key pull out");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("certificate key pull out");
 			m_FSM.PostEventFIFO(new FSMEvent(CGUIConsoleFSM::Event_UKeyPulled));
 		}
 		else if (dwUserCode == LOG_EVT_HEALTH_FIRST_ENTER_MAINPADE)
 		{
 			// IE首页打开, 关闭运行输出
-			Dbg("IE main page has been loaded successfully, close console terminal!");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IE main page has been loaded successfully, close console terminal!");
 			GetFunction()->GetPrivilegeFunction()->CloseOuputConsole();
 		}
 	}
@@ -249,7 +251,7 @@ ErrorCodeEnum CGUIConsoleEntity::PostUserLoginEvent(const char *pszUserID)
 
 ErrorCodeEnum CGUIConsoleEntity::AddTradeManage(const char *pszTerminalNo, const char *pszAgentID, const char *pszTime)
 {
-	Dbg("AddTradeManage: %s, %s, %s", pszTerminalNo, pszAgentID, pszTime);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AddTradeManage: %s, %s, %s", pszTerminalNo, pszAgentID, pszTime);
 
 	ErrorCodeEnum rc = Error_Succeed;
 	CMaterialMgrCnn *pCnn = new CMaterialMgrCnn(this);
@@ -260,14 +262,14 @@ ErrorCodeEnum CGUIConsoleEntity::AddTradeManage(const char *pszTerminalNo, const
 	}
 	else
 	{
-		Dbg("连接物料服务失败");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("连接物料服务失败");
 		rc = Error_NetBroken;
 	}
 
 	pCnn->DecRefCount();
 	pCnn = NULL;
 	if (Error_Succeed != rc)
-		Dbg("mod AddTradeManage return : %s", SpStrError(rc));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("mod AddTradeManage return : %s", SpStrError(rc));
 	return rc;
 }
 
@@ -275,7 +277,7 @@ ErrorCodeEnum CGUIConsoleEntity::AddTradeManage(const char *pszTerminalNo, const
 ErrorCodeEnum CGUIConsoleEntity::AddMaterialCounter(const char *pszMaterialCode)
 {
 	// 递增后台计数
-	Dbg("AddMaterialCounter: %s", pszMaterialCode);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AddMaterialCounter: %s", pszMaterialCode);
 
 	CSystemStaticInfo sysInfo;
 	auto rc = GetFunction()->GetSystemStaticInfo(sysInfo);
@@ -289,7 +291,7 @@ ErrorCodeEnum CGUIConsoleEntity::AddMaterialCounter(const char *pszMaterialCode)
 	}
 	else
 	{
-		Dbg("Connect to MaterialMgrEntity failed!");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to MaterialMgrEntity failed!");
 		rc = Error_NetBroken;
 	}
 
@@ -298,7 +300,7 @@ ErrorCodeEnum CGUIConsoleEntity::AddMaterialCounter(const char *pszMaterialCode)
 
 	if (rc == Error_Succeed)
 	{
-		Dbg("Add material counter for %s succ.", pszMaterialCode);		
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Add material counter for %s succ.", pszMaterialCode);		
 	}
 	else
 	{
@@ -314,7 +316,8 @@ ErrorCodeEnum CGUIConsoleEntity::QueryMaterialInfo(const char *pszDeviceNo, unsi
 	CAutoArray<unsigned int> &CardPercent, CAutoArray<CSimpleStringA> &TerminalNo, CAutoArray<CSimpleStringA> &Maintainer, CAutoArray<CSimpleStringA> &MaintainTime,
 	CAutoArray<CSimpleStringA> &UpdateTime)
 {
-	Dbg("QueryMaterialInfo DeviceNo = %s", pszDeviceNo);
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryMaterialInfo DeviceNo = %s", pszDeviceNo);
 
 	ErrorCodeEnum rc = Error_Succeed;
 	CMaterialMgrCnn *pCnn = new CMaterialMgrCnn(this);
@@ -323,7 +326,7 @@ ErrorCodeEnum CGUIConsoleEntity::QueryMaterialInfo(const char *pszDeviceNo, unsi
 		CSystemStaticInfo sysInfo;
 		auto rc = GetFunction()->GetSystemStaticInfo(sysInfo);
 		assert(rc == Error_Succeed);
-
+		
 		rc = pCnn->QueryMaterialInfo(pszDeviceNo, count, arrDeviceNo, arrMateriel, CardGroove, CardBoxNo, PsbCode, PsbName, CardInit, CardRemains, CardIssued, CardMixed,
 			CardPercent, TerminalNo, Maintainer, MaintainTime, UpdateTime);
 
@@ -331,7 +334,7 @@ ErrorCodeEnum CGUIConsoleEntity::QueryMaterialInfo(const char *pszDeviceNo, unsi
 	}
 	else
 	{
-		Dbg("Connect to MaterialMgr failed!");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to MaterialMgr failed!");
 		rc = Error_NetBroken;
 	}
 
@@ -358,7 +361,7 @@ ErrorCodeEnum CGUIConsoleEntity::GetMaterialCounter(const char *pszMaterial, uns
 	}
 	else
 	{
-		Dbg("Connect to MaterialMgrEntity failed!");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to MaterialMgrEntity failed!");
 		rc = Error_NetBroken;
 	}
 
@@ -370,7 +373,7 @@ ErrorCodeEnum CGUIConsoleEntity::GetMaterialCounter(const char *pszMaterial, uns
 ErrorCodeEnum CGUIConsoleEntity::ResetMaterialCounter(const char *pszMaterial, unsigned int dwResetCapacity, 
 	unsigned int dwUsedCounter, unsigned int dwRemainCounter, const char *pszComment)
 {
-	Dbg("ResetMaterialCounter: %s, reset: %d", pszMaterial, dwResetCapacity);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ResetMaterialCounter: %s, reset: %d", pszMaterial, dwResetCapacity);
 
 	// 重置硬件计数
 	ErrorCodeEnum rc = Error_Succeed;
@@ -409,14 +412,14 @@ ErrorCodeEnum CGUIConsoleEntity::ResetMaterialCounter(const char *pszMaterial, u
 		}
 		else
 		{
-			Dbg("连接CardIssuer失败");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("连接CardIssuer失败");
             pClient->SafeDelete();
 		}
     }
 	else
 	{
 		rc = Error_NoTarget;
-		Dbg("Unknow material code: {%s}", (const char*)strMaterialCode);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Unknow material code: {%s}", (const char*)strMaterialCode);
 	}
 
 	if (rc != Error_Succeed)
@@ -446,7 +449,7 @@ ErrorCodeEnum CGUIConsoleEntity::ResetMaterialCounter(const char *pszMaterial, u
 
 	if (rc == Error_Succeed)
 	{
-		Dbg("Reset teminal material counter succ: %s", (const char*)strMaterialCode);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Reset teminal material counter succ: %s", (const char*)strMaterialCode);
 	}
 	else
 	{
@@ -459,7 +462,7 @@ ErrorCodeEnum CGUIConsoleEntity::ResetMaterialCounter(const char *pszMaterial, u
 ErrorCodeEnum CGUIConsoleEntity::RegistSwallowedCard(const char *pszCardNo, const char *pszReasonCode, 
 	const char *pszDate, const char *pszTime, const char *pszDeviceSciNo)
 {
-	Dbg("RegistSwallowedCard card = %s, reson = %s", pszCardNo, pszReasonCode);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("RegistSwallowedCard card = %s, reson = %s", pszCardNo, pszReasonCode);
 
 	// 20170210: 空卡或无卡号吞卡也要登记
 	//if (pszCardNo == NULL || strlen(pszCardNo) == 0)
@@ -503,9 +506,9 @@ ErrorCodeEnum CGUIConsoleEntity::RegistSwallowedCard(const char *pszCardNo, cons
 
 
 	if (rc == Error_Succeed)
-		Dbg("Register swallow card succ,cardno: %s, reason: %s", tempCardNo, pszReasonCode);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Register swallow card succ,cardno: %s, reason: %s", tempCardNo, pszReasonCode);
 	else
-		Dbg("Register swallow card failed(%s),cardno: %s, reason: %s", SpStrError(rc), tempCardNo, pszReasonCode);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Register swallow card failed(%s),cardno: %s, reason: %s", SpStrError(rc), tempCardNo, pszReasonCode);
 	
 	return rc;
 }
@@ -516,17 +519,17 @@ ErrorCodeEnum CGUIConsoleEntity::SyncMaterialCount(const char *pszDeviceNo, DWOR
 	CAutoArray<CSimpleStringA> &arrPsbName, CAutoArray<unsigned int> &arrCardInit, CAutoArray<unsigned int> &arrCardRemains,
 	CAutoArray<unsigned int> &arrCardIssued, CAutoArray<unsigned int> &arrCardMixed, CAutoArray<unsigned int> &arrCardPercent)
 {
-	Dbg("SyncMaterialCount DeviceNo = %s, CardBoxNum = %d", pszDeviceNo, dwCardBoxNum);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("SyncMaterialCount DeviceNo = %s, CardBoxNum = %d", pszDeviceNo, dwCardBoxNum);
 
 	if (pszDeviceNo == NULL || strlen(pszDeviceNo) == 0)
 	{
-		Dbg("param [pszDeviceNo] invalid");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("param [pszDeviceNo] invalid");
 		return Error_Param;
 	}
 
 	if (dwCardBoxNum <= 0)
 	{
-		Dbg("param [dwCardBoxNum] invalid");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("param [dwCardBoxNum] invalid");
 		return Error_Param;
 	}
 
@@ -543,7 +546,7 @@ ErrorCodeEnum CGUIConsoleEntity::SyncMaterialCount(const char *pszDeviceNo, DWOR
 		|| arrMaintainer.GetCount() != (dwCardBoxNum + 1)
 		|| arrMaintainTime.GetCount() != (dwCardBoxNum + 1))
 	{
-		Dbg("element count of array param invalid");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("element count of array param invalid");
 		return Error_Param;
 	}
 
@@ -564,9 +567,9 @@ ErrorCodeEnum CGUIConsoleEntity::SyncMaterialCount(const char *pszDeviceNo, DWOR
 	pCnn = NULL;
 
 	if (rc == Error_Succeed)
-		Dbg("计数同步成功");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("计数同步成功");
 	else
-		Dbg("计数同步失败:%s", SpStrError(rc));
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("计数同步失败:%s", SpStrError(rc));
 
 	return rc;
 }
@@ -598,7 +601,7 @@ void CGUIConsoleEntity::InitializeBeidou()
 			LogWarn(Severity_Low, Error_Debug, EVENT_MOD_GUICONSOLE_ENABLE_UNIONNETLOG_WITH_VALICONFIG,
 					dbgInfo);
         } else {
-            Dbg("endpoint is empty, do not begin send log");
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("endpoint is empty, do not begin send log");
             LogWarn(Severity_Low, Error_Debug, EVENT_MOD_GUICONSOLE_DISABLE_UNIONNETLOG_BCZ_LACK, dbgInfo);
         }
     } else {
@@ -608,7 +611,7 @@ void CGUIConsoleEntity::InitializeBeidou()
         const char* topicBeidou = "LR18_23_VTMTerminalLogService_L_trace_VTMTerminalTraceLog_SRC_SZ";
         const char* topicBussSys = "LR18_23_VTMTerminalLogService_L_sys_VTMBusiness_SRC_SZ";
         const char* topicBussUser = "LR18_23_VTMTerminalLogService_L_biz_VTMBusiness_SRC_SZ";
-        Dbg("read endpoint and topic err, need check centersetting, use default %s-%s-%s-%s-%s-%s",
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read endpoint and topic err, need check centersetting, use default %s-%s-%s-%s-%s-%s",
             default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser);
         GetFunction()->GetPrivilegeFunction()->BeginLogSend(default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser);
 

+ 65 - 0
addin/cfg/UserCodeToMsgTip.ini

@@ -0,0 +1,65 @@
+[UserCodeToMsgTip]
+0x20200006=[RTA2206] IC卡上电失败,请拿起卡片重试
+0x2020000D=[RTA220D] IC卡交互失败,请拿起卡片重试
+0x20200204=[RTA22EC] 绑定后初始化蓝牙多合一失败,请尝试重新绑定并初始化
+0x20200208=[RTA22EG] 读取磁道数据长度有误,请确认卡片是否正常或联系厂商检查读卡器
+0x2020022F=[RTA22FJ] 读取二磁道数据存在非法字符,请联系厂商检查读卡器
+0x20300201=[RTA23E9] 未成功建立加密传输通道
+0x20300203=[RTA23EB] 卡箱连续吞卡超限,请及时执行清机
+0x20300204=[RTA23EC] 未检测到卡箱1,请检测卡箱1是否放好
+0x20300205=[RTA23ED] 未检测到卡箱2,请检测卡箱2是否放好
+0x20300206=[RTA23EE] 未检测到卡箱3,请检测卡箱3是否放好
+0x20300207=[RTA23EF] 卡箱1未检测到卡片,请检测卡箱1中卡片是否放好或卡片余量过低
+0x20300208=[RTA23EG] 卡箱2未检测到卡片,请检测卡箱2中卡片是否放好或卡片余量过低
+0x20300209=[RTA23EH] 卡箱3未检测到卡片,请检测卡箱3中卡片是否放好或卡片余量过低
+0x2030020A=[RTA23EI] 卡箱1本地计数无卡,请执行清机计划
+0x2030020B=[RTA23EJ] 卡箱2本地计数无卡,请执行清机计划
+0x2030020C=[RTA23EK] 卡箱3本地计数无卡,请执行清机计划
+0x2030020F=[RTA23EN] 卡库找不到空闲卡槽
+
+0x2180000D=[RTA2O01] 硬件模块不可用
+0x2180000E=[RTA2O02] 状态机正忙,请稍后再试
+0x2180000F=[RTA2O03] 绑定摄像头失败,请检查摄像头是否可用或是否被占用
+
+0x21700001=[RTA2N01] 设备打开失败,请检查硬件
+0x21700002=[RTA2N02] 硬件参数设置请求失败,请检查硬件
+0x21700003=[RTA2N03] 硬件预览请求失败,请检查硬件
+0x21700004=[RTA2N04] 硬件关闭预览失败,请检查硬件
+0x21700005=[RTA2N05] 硬件拍摄照片失败,请检查硬件
+0x21700006=[RTA2N06] 硬件拍摄照片失败,请检查硬件
+0x21700007=[RTA2N07] 硬件设置预览窗口失败,请检查硬件
+0x21700008=[RTA2N08] 硬件设置属性失败,请检查硬件
+0x21700009=[RTA2N09] 获取设备状态信息失败,请检查硬件
+0x2170000A=[RTA2N0A] 获取硬件类型数据失败,请检查硬件
+0x2170000B=[RTA2N0B] 硬件重置失败,请检查硬件
+0x2170000C=[RTA2N0C] 关闭高拍仪设备失败,请检查硬件
+0x21700201=[RTA2N0D] 提取拍摄照片失败
+0x21700202=[RTA2N0E] 创建适配器对象失败
+0x21700203=[RTA2N0F] 加载适配器失败
+0x21700209=[RTA2N0G] 状态机正忙,请稍后再试
+0x2170020A=[RTA2N0H] 获取硬件配置失败
+0x2170020B=[RTA2N0J] 所需加载驱动未配置
+0x2170020C=[RTA2N0K] 高拍仪断开连接,请检查硬件
+0x2170020D=[RTA2N0L] 拍摄条件准备异常
+0x2170020E=[RTA2N0M] 不支持的请求操作
+
+0x21C00001=[RTA2S01] 打开摄像头失败,请重试
+0x21C00002=[RTA2S02] 请求预览失败,请重试
+0x21C00003=[RTA2S03] 关闭预览失败
+0x21C00004=[RTA2S04] 预览异常
+0x21C00005=[RTA2S05] 拍照失败
+0x21C00006=[RTA2S06] 拍照失败
+0x21C00007=[RTA2S07] 重置摄像头失败
+0x21C00008=[RTA2S08] 获取照片存储路径失败,请重试
+0x21C00009=[RTA2S09] 读取照片失败
+0x21C0000A=[RTA2S0A] 拍摄照片内容错误
+0x21C00201=[RTA2S0B] 摄像头不可用,请检查是否异常或被占用
+0x21C00204=[RTA2S0C] 摄像头忙碌,请稍后再试
+0x21C00205=[RTA2S0D] 摄像头忙碌,请稍后再试
+0x21C00206=[RTA2S0E] 程序异常,请重启尝试
+0x21C00207=[RTA2S0F] 绑定摄像头失败,请检查是否异常或被占用
+0x21C00208=[RTA2S0G] 指定的摄像头名称不存在
+0x21C00209=[RTA2S0H] 状态机正忙,请稍后再试
+0x21C0020A=[RTA2S0J] 摄像头未绑定,请退出重试
+0x21C0020B=[RTA2S0K] 通过名称打开摄像头失败,请重试
+0x21C0020C=[RTA2S0L] 打开摄像头失败,请重试