CWSCodec.cpp 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427
  1. #if (defined _WIN32 || defined _WIN64)
  2. #include "stdafx.h"
  3. #endif
  4. #include "BufferOperation.h"
  5. #include "modp_b64.h"
  6. #include "SpHelper.h"
  7. #include "SpUtility.h"
  8. #include "CWSCodec.h"
  9. #include "MessageType.h"
  10. #include "Chromium_msg_g.h"
  11. #include <exception>
  12. #include <vector>
  13. #include <string>
  14. #include <memory>
  15. #include "../../ThirdParty/Include/CJson/cJSON.h"
  16. #include <boost/locale.hpp>
  17. #include <variant>
  18. #define DEFAULT_CAPACITY 20480
  19. namespace Chromium {
  20. static HANDLE m_mutex;
  21. static inline bool is_base64(CSimpleStringA str)
  22. {
  23. int num = str.GetLength() % 4;
  24. CSimpleStringA endStr = "";
  25. if (0 == num)
  26. return true;
  27. for (int i = 0; i < num; ++i)
  28. {
  29. endStr.Append("=");
  30. }
  31. return str.IsEndWith(endStr);
  32. }
  33. CWSCodec::CWSCodec() :m_DeserializeCache(MAX_TRANSFER_LEN), m_SerializeCache(MAX_TRANSFER_LEN)
  34. {
  35. Dbg("CWSCodec Constuctor");
  36. m_AckCallbackList = new std::map<int, entity_def_struct>();
  37. m_EventCallbackList = new std::map<int, std::vector<CMedthodInterface>*>();
  38. }
  39. CWSCodec::~CWSCodec() {
  40. if (mInterpreter) {
  41. delete this->mInterpreter;
  42. }
  43. ::CloseHandle(m_mutex);
  44. }
  45. CWSCodec* CWSCodec::getInstance() {
  46. Dbg("CWSCodec static method getInstance");
  47. m_mutex = ::CreateMutex(NULL, FALSE, NULL);
  48. // DWORD d = WaitForSingleObject(m_mutex, INFINITE);
  49. static CWSCodec obj;
  50. // ::ReleaseMutex(m_mutex);
  51. return &obj;
  52. }
  53. void CWSCodec::setEntityHandler(CSmartPointer<IEntityFunction> p) {
  54. this->m_pFunc = p;
  55. }
  56. void CWSCodec::init(const char* xmlPath) {
  57. Dbg("CWSCodec method -> init");
  58. mInterpreter = new CStructureInterpreter(xmlPath);
  59. }
  60. void CWSCodec::DeserializeBase(CMessage& msg, CTransStruct& ts, int& rpos, cJSON* ret) {
  61. std::list<CMethodParam>::iterator i = ts.mParamList.begin();
  62. auto deleteCjson = [](cJSON* dst) {
  63. if (NULL != dst)
  64. cJSON_Delete(dst);
  65. };
  66. std::unique_ptr<cJSON, decltype(deleteCjson)> extendJs(cJSON_CreateObject(), deleteCjson);
  67. std::string t_arr[] = { "messageType", "sessionID", "transID", "isEnd", "errorCode", "errorMsg" };
  68. std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
  69. for (auto paramInfo : ts.mParamList)
  70. {
  71. for (auto repeatName : c_repeatParamList)
  72. {
  73. if (paramInfo.mName == repeatName)
  74. Dbg("requestAck参数名字重复, error, %s", paramInfo.mName.c_str());
  75. }
  76. }
  77. //存在脏数据,不做另外处理
  78. try
  79. {
  80. while (i != ts.mParamList.end())
  81. {
  82. bool t_isRepeat = false;
  83. for (auto repeatName : c_repeatParamList)
  84. {
  85. if (i->mName == repeatName)
  86. {
  87. Dbg("requestAck参数名字重复, error, %s", i->mName);
  88. t_isRepeat = true;
  89. }
  90. }
  91. if (i->mType == "int")
  92. {
  93. int d = 0;
  94. ReadT(msg.getPayload(), d, &rpos);
  95. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  96. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  97. }
  98. else if (i->mType == "uint")
  99. {
  100. unsigned int d = 0;
  101. ReadT(msg.getPayload(), d, &rpos);
  102. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  103. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  104. }
  105. else if (i->mType == "short") {
  106. short d = 0;
  107. ReadT(msg.getPayload(), d, &rpos);
  108. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  109. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  110. }
  111. else if (i->mType == "ushort") {
  112. unsigned short d = 0;
  113. ReadT(msg.getPayload(), d, &rpos);
  114. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  115. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  116. }
  117. else if (i->mType == "char") {
  118. char d = 0;
  119. ReadT(msg.getPayload(), d, &rpos);
  120. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  121. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  122. }
  123. else if (i->mType == "uchar") {
  124. unsigned char d = 0;
  125. ReadT(msg.getPayload(), d, &rpos);
  126. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  127. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  128. }
  129. else if (i->mType == "int64") {
  130. __int64 d = 0;
  131. ReadT(msg.getPayload(), d, &rpos);
  132. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  133. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  134. }
  135. else if (i->mType == "uint64") {
  136. u_int64_t d = 0;
  137. ReadT(msg.getPayload(), d, &rpos);
  138. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  139. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  140. }
  141. else if (i->mType == "bool")
  142. {
  143. bool d = false;
  144. ReadT(msg.getPayload(), d, &rpos);
  145. if (!t_isRepeat) cJSON_AddBoolToObject(ret, i->mName.c_str(), d);
  146. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  147. }
  148. else if (i->mType == "double")
  149. {
  150. double d = false;
  151. ReadT(msg.getPayload(), d, &rpos);
  152. if (!t_isRepeat) cJSON_AddNumberToObject(ret, i->mName.c_str(), d);
  153. cJSON_AddNumberToObject(extendJs.get(), i->mName.c_str(), d);
  154. }
  155. else if (i->mType == "string")
  156. {
  157. CSimpleStringA d = "";
  158. ReadT(msg.getPayload(), d, &rpos);
  159. if (!t_isRepeat) cJSON_AddStringToObject(ret, i->mName.c_str(), d);
  160. cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), d);
  161. }
  162. else if (i->mType == "wstring")
  163. {
  164. CSimpleStringW d = "";
  165. ReadT(msg.getPayload(), d, &rpos);
  166. if (!t_isRepeat) cJSON_AddStringToObject(ret, i->mName.c_str(), CSimpleStringW2A(d));
  167. cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), CSimpleStringW2A(d));
  168. }
  169. else if (i->mType == "blob")
  170. {
  171. int len = 0;
  172. void* binData = NULL;
  173. char* base64Data = NULL;
  174. ReadT(msg.getPayload(), len, &rpos);
  175. if (0 != len)
  176. {//协商好,H5对blob数据进行base64加密,chromium这里进行base64解密
  177. binData = (char*)malloc(sizeof(char) * len);
  178. ReadT(msg.getPayload(), binData, len, &rpos);
  179. int base64Len = modp_b64_encode_len(len);
  180. base64Data = (char*)malloc(sizeof(char) * base64Len);
  181. modp_b64_encode(base64Data, (const char*)binData, len);
  182. if (!t_isRepeat) cJSON_AddStringToObject(ret, i->mName.c_str(), base64Data);
  183. cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), base64Data);
  184. if (binData != NULL) {
  185. free(binData);
  186. binData = NULL;
  187. }
  188. if (base64Data != NULL) {
  189. free(base64Data);
  190. base64Data = NULL;
  191. }
  192. }
  193. else {
  194. if (!t_isRepeat) cJSON_AddStringToObject(ret, i->mName.c_str(), "");
  195. cJSON_AddStringToObject(extendJs.get(), i->mName.c_str(), "");
  196. }
  197. }
  198. else if (i->mType == "array_int")
  199. {
  200. int len = 0;
  201. int d = 0;
  202. ReadT(msg.getPayload(), len, &rpos);
  203. cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
  204. for (int c = 0; c < len; ++c) {
  205. ReadT(msg.getPayload(), d, &rpos);
  206. cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
  207. cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
  208. }
  209. if (!t_isRepeat) cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
  210. cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
  211. }
  212. else if (i->mType == "array_uint")
  213. {
  214. int len = 0;
  215. unsigned int d = 0;
  216. ReadT(msg.getPayload(), len, &rpos);
  217. cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
  218. for (int c = 0; c < len; ++c) {
  219. ReadT(msg.getPayload(), d, &rpos);
  220. cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
  221. cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
  222. }
  223. if (!t_isRepeat) cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
  224. cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
  225. }
  226. else if (i->mType == "array_uint64")
  227. {
  228. int len = 0;
  229. u_int64_t d = 0;
  230. ReadT(msg.getPayload(), len, &rpos);
  231. cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
  232. for (int c = 0; c < len; c++) {
  233. ReadT(msg.getPayload(), d, &rpos);
  234. cJSON_AddItemToArray(tmpArray, cJSON_CreateNumber(d));
  235. cJSON_AddItemToArray(tmpArray2, cJSON_CreateNumber(d));
  236. }
  237. if (!t_isRepeat) cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
  238. cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
  239. }
  240. else if (i->mType == "array_string")
  241. {
  242. int len = 0;
  243. CSimpleStringA d = "";
  244. ReadT(msg.getPayload(), len, &rpos);
  245. cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
  246. for (int c = 0; c < len; ++c) {
  247. ReadT(msg.getPayload(), d, &rpos);
  248. cJSON_AddItemToArray(tmpArray, cJSON_CreateString(d));
  249. cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(d));
  250. }
  251. if (!t_isRepeat) cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
  252. cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
  253. }
  254. else if (i->mType == "array_wstring")
  255. {
  256. int len = 0;
  257. CSimpleStringW d = "";
  258. ReadT(msg.getPayload(), len, &rpos);
  259. cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
  260. for (int c = 0; c < len; ++c) {
  261. ReadT(msg.getPayload(), d, &rpos);
  262. cJSON_AddItemToArray(tmpArray, cJSON_CreateString(CSimpleStringW2A(d)));
  263. cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(CSimpleStringW2A(d)));
  264. }
  265. if (!t_isRepeat) cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
  266. cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
  267. }
  268. else if (i->mType == "array_blob")
  269. {
  270. int array_size = 0;
  271. ReadT(msg.getPayload(), array_size, &rpos);//array size
  272. //Dbg("array_blob 1:%d", msg.getBufferLength());
  273. //msg.hexToFile();
  274. cJSON* tmpArray = cJSON_CreateArray(), * tmpArray2 = cJSON_CreateArray();
  275. for (int c = 0; c < array_size; ++c) {
  276. int tmpSize = 0;
  277. ReadT(msg.getPayload(), tmpSize, &rpos);
  278. if (0 != tmpSize)
  279. {
  280. void* binData = (char*)malloc(sizeof(char) * tmpSize);
  281. ReadT(msg.getPayload(), binData, tmpSize, &rpos);
  282. //Dbg("array_blob 2:%d", tmpSize);
  283. int base64Len = modp_b64_encode_len(tmpSize);
  284. char* base64Data = (char*)malloc(sizeof(char) * base64Len);
  285. modp_b64_encode(base64Data, (const char*)binData, tmpSize);
  286. cJSON_AddItemToArray(tmpArray, cJSON_CreateString(base64Data));
  287. cJSON_AddItemToArray(tmpArray2, cJSON_CreateString(base64Data));
  288. }
  289. }
  290. if (!t_isRepeat) cJSON_AddItemToObject(ret, i->mName.c_str(), tmpArray);
  291. cJSON_AddItemToObject(extendJs.get(), i->mName.c_str(), tmpArray2);
  292. }
  293. else
  294. Dbg("DeserializeBase error name -> type: %s -> %s", i->mName.c_str(), i->mType.c_str());
  295. ++i;
  296. }
  297. }
  298. catch (...)
  299. {
  300. if (i != ts.mParamList.end())
  301. Dbg("DeserializeBase error:%s, %s", i->mName.c_str(), i->mType.c_str());
  302. }
  303. cJSON_AddStringToObject(ret, PARAMLIST_HEAD, cJSON_PrintUnformatted(extendJs.get()));
  304. //cJSON_AddItemToObject(ret, PARAMLIST_HEAD, extendJs.get());
  305. }
  306. void CWSCodec::DeserializeRequestAck(CMessage& msg, std::map<int, entity_def_struct>::iterator& it, int& rpos, cJSON* ret) {
  307. entity_def_struct* p_struct = &it->second;
  308. CMedthodInterface* mi = mInterpreter->getFunctionInterface(p_struct->entity_name, p_struct->class_name, p_struct->methodID);
  309. CTransStruct ts = mi->mResponseInterpreter;
  310. try
  311. {
  312. DeserializeBase(msg, ts, rpos, ret);
  313. }
  314. catch (...)
  315. {
  316. Dbg("error DeserializeRequestAck: %s, %s, %s", p_struct->entity_name, p_struct->class_name, p_struct->methodID);
  317. std::string errorMsg;
  318. for (auto it : ts.mParamList)
  319. errorMsg += it.mName + "--" + it.mType + "_";
  320. Dbg(errorMsg.c_str());
  321. throw std::exception(std::logic_error("error DeserializeRequestAck"));
  322. }
  323. }
  324. void CWSCodec::DeserializeEvent(CMessage& msg,
  325. std::vector<CMedthodInterface>* list,
  326. int& rpos, cJSON* ret) {
  327. int eventID = msg.getEventID();
  328. if (NULL == list || eventID < 0 || eventID >= list->size())
  329. {
  330. cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
  331. CSimpleStringA errmsg = "";
  332. errmsg.Format("Cannot find the eventID = %d!", eventID);
  333. cJSON_AddStringToObject(ret, "errorMsg", errmsg);
  334. return;
  335. }
  336. CMedthodInterface* mi = &(list->at(eventID));
  337. CTransStruct ts = mi->mResponseInterpreter;
  338. try
  339. {
  340. DeserializeBase(msg, ts, rpos, ret);
  341. }
  342. catch (...)
  343. {
  344. std::string errorMsg;
  345. for (auto it : ts.mParamList)
  346. errorMsg += it.mName + "--" + it.mType + "_";
  347. Dbg(errorMsg.c_str());
  348. throw std::exception(std::logic_error("error DeserializeRequestAck"));
  349. }
  350. }
  351. void receivehexdump(const char* buf, const int num) {
  352. char str[8192 * 2] = { 0 };
  353. int i = 0;
  354. char c[5] = { 0 };
  355. if (num > 1200)
  356. {
  357. for (i = 0; i < 50; i++)
  358. {
  359. sprintf(c, "%02X ", (unsigned char)buf[i]);
  360. strcat(str, c);
  361. }
  362. Dbg("buffer too long to show!show pre 50 hex! receivehexdump hex buf len = %d : %s", num, str);
  363. return;
  364. }
  365. for (i = 0; i < num; i++)
  366. {
  367. sprintf(c, "%02X ", (unsigned char)buf[i]);
  368. strcat(str, c);
  369. }
  370. Dbg("receivehexdump hex buf len = %d : %s", num, str);
  371. return;
  372. }
  373. std::string CWSCodec::BufferToJson(CMessage& msg, int replaceTransId) {
  374. LOG_FUNCTION();
  375. int rpos = 16;
  376. cJSON* ret = cJSON_CreateObject();
  377. int errorCode = Error_Succeed;
  378. CSimpleStringA errorMsg = "";
  379. receivehexdump(msg.getPayload(), msg.getLength());
  380. if (msg.getLength() < 12) //End session len = 12
  381. return std::string(); // 丢弃消息
  382. // 通用反序列化
  383. cJSON_AddNumberToObject(ret, "messageType", msg.getMessageType());
  384. switch (msg.getMessageType()) {
  385. case RequestAck:
  386. cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
  387. cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
  388. cJSON_AddNumberToObject(ret, "isEnd", msg.getIsEnd());
  389. rpos += 1;
  390. ReadT(msg.getPayload(), errorCode, &rpos);
  391. cJSON_AddNumberToObject(ret, "errorCode", errorCode);
  392. ReadT(msg.getPayload(), errorMsg, &rpos);
  393. cJSON_AddStringToObject(ret, "errorMsg", errorMsg);
  394. break;
  395. case SessionAck:
  396. cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
  397. cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
  398. ReadT(msg.getPayload(), errorCode, &rpos);
  399. cJSON_AddNumberToObject(ret, "errorCode", errorCode);
  400. ReadT(msg.getPayload(), errorMsg, &rpos);
  401. cJSON_AddStringToObject(ret, "errorMsg", errorMsg);
  402. break;
  403. case Event:
  404. cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
  405. cJSON_AddNumberToObject(ret, "eventID", msg.getEventID());
  406. cJSON_AddNumberToObject(ret, "signatureID", msg.getSignatureID());
  407. rpos += 8;
  408. break;
  409. case SetVarAck:
  410. cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
  411. cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
  412. ReadT(msg.getPayload(), errorCode, &rpos);
  413. cJSON_AddNumberToObject(ret, "errorCode", errorCode);
  414. ReadT(msg.getPayload(), errorMsg, &rpos);
  415. cJSON_AddStringToObject(ret, "errorMsg", errorMsg);
  416. break;
  417. case GetVarAck:
  418. cJSON_AddNumberToObject(ret, "sessionID", msg.getSessionID());
  419. cJSON_AddNumberToObject(ret, "transID", replaceTransId != 0 ? replaceTransId : msg.getTransID());
  420. ReadT(msg.getPayload(), errorCode, &rpos);
  421. cJSON_AddNumberToObject(ret, "errorCode", errorCode);
  422. ReadT(msg.getPayload(), errorMsg, &rpos);
  423. cJSON_AddStringToObject(ret, "value", errorMsg);
  424. break;
  425. default:
  426. errorCode = Error_Unexpect;
  427. cJSON_AddNumberToObject(ret, "errorCode", errorCode);
  428. cJSON_AddStringToObject(ret, "errorMsg", "未知消息类型");
  429. break;
  430. }
  431. Dbg("BufferToJson -> messageType=%d, sessionID=%d, transID=%d, replaceTransID=%d", msg.getMessageType(), msg.getSessionID(), msg.getTransID(), replaceTransId);
  432. // RequestAck 返回的有问题 要删除对应的回调list项
  433. if (Error_Succeed != errorCode && RequestAck == msg.getMessageType())
  434. {
  435. std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
  436. if (m_AckCallbackList->end() != it)
  437. m_AckCallbackList->erase(it);
  438. }
  439. // 有错误时直接返回 或者 不是RequestAck和Event时也可以返回
  440. if (Error_Succeed != errorCode ||
  441. (RequestAck != msg.getMessageType() && Event != msg.getMessageType()))
  442. {
  443. char* str = getJsonStr(ret);
  444. cJSON_Delete(ret);
  445. std::string s(str);
  446. free(str);
  447. return s;
  448. }
  449. // 数据部分反序列化 RequestAck & Event有数据部分
  450. if (RequestAck == msg.getMessageType())
  451. { // Request用户自定义部分反序列化
  452. // 回调反序列化列表
  453. std::map<int, entity_def_struct>::iterator it = m_AckCallbackList->find(msg.getTransID());
  454. if (m_AckCallbackList->end() == it)
  455. {
  456. // 没有对应的request,无法反序列化
  457. cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
  458. cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the request for the ack!");
  459. char* str = getJsonStr(ret);
  460. cJSON_Delete(ret);
  461. std::string s(str);
  462. free(str);
  463. return s;
  464. }
  465. DeserializeRequestAck(msg, it, rpos, ret);
  466. m_AckCallbackList->erase(it);
  467. }
  468. else if (Event == msg.getMessageType())
  469. {
  470. // Event用户自定义部分反序列化
  471. std::map<int, std::vector<CMedthodInterface>*>::iterator iter = m_EventCallbackList->find(msg.getTransID());
  472. if (m_EventCallbackList->end() == iter)
  473. {
  474. // 没有对应的register, 无法反序列化
  475. cJSON_AddNumberToObject(ret, "errorCode", Error_Unexpect);
  476. cJSON_AddStringToObject(ret, "errorMsg", "Cannot find the register for the ack!");
  477. char* str = getJsonStr(ret);
  478. cJSON_Delete(ret);
  479. std::string s(str);
  480. free(str);
  481. return s;
  482. }
  483. DeserializeEvent(msg, iter->second, rpos, ret);
  484. }
  485. char* str = getJsonStr(ret);
  486. cJSON_Delete(ret);
  487. std::string s(str);
  488. free(str);
  489. //delete []str;
  490. return s;
  491. }
  492. std::pair<int, CMessage*> CWSCodec::JsonToBuffer(std::string strJson) {
  493. cJSON* pJson = cJSON_Parse(strJson.c_str());
  494. char errmsg[1024] = { 0 };
  495. unsigned int messageType = 0;
  496. GetCJsonIntergerValue(pJson, "messageType", messageType, errmsg);
  497. // 查找序列化结构 有用户定义数据部分的只有 Info 和 Request
  498. CMedthodInterface* mi = NULL;
  499. if (Request == messageType || Info == messageType)
  500. {
  501. entity_def_struct st = { 0 };
  502. GetCJsonObjectValue(pJson, "class", st.class_name, errmsg);
  503. GetCJsonObjectValue(pJson, "entity", st.entity_name, errmsg);
  504. GetCJsonIntergerValue(pJson, "methodID", st.methodID, errmsg);
  505. mi = mInterpreter->getFunctionInterface(st.entity_name, st.class_name, st.methodID); //get the mothod of the json
  506. if (NULL == mi) {
  507. Dbg("JsonToBuffer : Entity or class not found in structure interpreter!");
  508. return std::make_pair(messageType, nullptr);
  509. }
  510. else
  511. Dbg("JsonToBuffer parse method success, entityName:%s, className:%s, methodID:%d, DstMethodName:%s, DstMethodParamNum:%d",
  512. st.entity_name, st.class_name, st.methodID, mi->mMethodName.c_str(), mi->mRequestInterpreter.mParamList.size()); //如出错,可对比方法名和变量数量
  513. if (Request == messageType) {
  514. // 维护回调列表 Request
  515. int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
  516. m_AckCallbackList->insert(std::pair<int, entity_def_struct>(transid, st));
  517. }
  518. }
  519. // 维护回调列表 Event
  520. if (Register == messageType)
  521. {
  522. std::vector<CMedthodInterface>* milist = NULL;
  523. entity_def_struct st = { 0 };
  524. unsigned int transid = cJSON_GetObjectItem(pJson, "transId")->valueint;
  525. GetCJsonObjectValue(pJson, "entity", st.entity_name, errmsg);
  526. milist = mInterpreter->getAllMessageInterface(st.entity_name);
  527. m_EventCallbackList->insert(std::pair<int, std::vector<CMedthodInterface>*>(transid, milist));
  528. }
  529. if (Broadcast == messageType)
  530. {
  531. ChromiumBroadcast e = {};
  532. GetCJsonObjectValue(pJson, "data", e.broadcastJson, errmsg);
  533. if (e.broadcastJson.GetLength() < 20000)
  534. {
  535. auto rc = SpSendBroadcast(m_pFunc, eMsg_ChromiumBroadcast, eMsgSig_ChromiumBroadcast, e);
  536. if (Error_Succeed != rc)
  537. Dbg("Broadcast Msg Error:%d", rc);
  538. }
  539. else
  540. Dbg("josn is too long, do not send out sp broadcast!");
  541. return std::make_pair(messageType, nullptr);
  542. }
  543. if (Event == messageType)
  544. {
  545. struct GeneralEventStruct
  546. {
  547. CSimpleStringA data;
  548. void Serialize(SpBuffer& Buf)
  549. {
  550. auto& buf = Buf & data;
  551. }
  552. };
  553. struct GeneralEventStruct e = {};
  554. unsigned int eventID = 0;
  555. unsigned int eventSign = 0;
  556. GetCJsonIntergerValue(pJson, "eventID", eventID, errmsg);
  557. GetCJsonIntergerValue(pJson, "eventSign", eventSign, errmsg);
  558. GetCJsonObjectValue(pJson, "data", e.data, errmsg);
  559. SpSendBroadcast(m_pFunc, eventID, eventSign, e);
  560. Dbg("JsonToBuffer errmsg : %s", errmsg);
  561. cJSON_Delete(pJson);
  562. return std::make_pair(messageType, nullptr);
  563. }
  564. // 数据定义
  565. char* data = (char*)malloc(MAX_TRANSFER_LEN);
  566. assert(data != NULL);
  567. int capacity = MAX_TRANSFER_LEN;
  568. int wpos = 0;
  569. unsigned int len = 0;
  570. // 通用序列化
  571. // 预先写入长度0
  572. WriteT(data, len, &wpos, &capacity);
  573. // 写消息类型
  574. WriteT(data, messageType, &wpos, &capacity);
  575. // 根据不同的request进行序列化
  576. switch (messageType) {
  577. case Info:
  578. SerializeInfo(pJson, data, &wpos, &capacity, mi, errmsg);
  579. break;
  580. case BeginSession:
  581. SerializeBeginSession(pJson, data, &wpos, &capacity, mi, errmsg);
  582. break;
  583. case EndSession:
  584. SerializeEndSession(pJson, data, &wpos, &capacity, mi, errmsg);
  585. break;
  586. case Request:
  587. SerializeRequest(pJson, data, &wpos, &capacity, mi, errmsg);
  588. break;
  589. case Register:
  590. SerializeRegister(pJson, data, &wpos, &capacity, mi, errmsg);
  591. break;
  592. case Unregister:
  593. SerializeUnregister(pJson, data, &wpos, &capacity, mi, errmsg);
  594. break;
  595. case LogEventMsgType:
  596. SerializeLogEvent(pJson, data, &wpos, &capacity, mi, errmsg);
  597. break;
  598. case LogWarnMsgType:
  599. SerializeLogWarn(pJson, data, &wpos, &capacity, mi, errmsg);
  600. break;
  601. case SetVarReq:
  602. SerializeSetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
  603. break;
  604. case GetVarReq:
  605. SerializeGetVarReq(pJson, data, &wpos, &capacity, mi, errmsg);
  606. break;
  607. default:
  608. // warn
  609. break;
  610. };
  611. // 修改头部的消息长度
  612. int i = 0;
  613. len = wpos - 8;
  614. WriteT(data, len, &i, &capacity);
  615. Dbg("JsonToBuffer errmsg : %s, len = %d", errmsg, len);
  616. cJSON_Delete(pJson);
  617. if (wpos < m_SerializeCache.getCMessageLength())
  618. {
  619. m_SerializeCache.clear();
  620. if (nullptr == memcpy(m_SerializeCache.getWriteableData(), data, wpos))
  621. Dbg("memcpy err ");
  622. free(data);
  623. }
  624. else
  625. { //数据长度过长
  626. free(data);
  627. Dbg("string too long, discard");
  628. return std::make_pair(messageType, nullptr);
  629. }
  630. return std::make_pair(messageType, &m_SerializeCache);
  631. }
  632. char* CWSCodec::getJsonStr(cJSON* pJson) {
  633. char* pStr = cJSON_PrintUnformatted(pJson);
  634. if (NULL == pStr) {
  635. pStr = (char*)malloc(64);
  636. if (pStr) {
  637. strncpy(pStr, "{\"errorCode\":1540,\"errormsg\":\"Failed to encode json\"}", 64);
  638. }
  639. }
  640. return pStr;
  641. }
  642. void CWSCodec::SerializeInfo(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  643. int i4 = 0;
  644. i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
  645. WriteT(data, i4, wpos, capacity);
  646. i4 = cJSON_GetObjectItem(js, "methodID")->valueint;
  647. WriteT(data, i4, wpos, capacity);
  648. i4 = cJSON_GetObjectItem(js, "signature")->valueint;
  649. WriteT(data, i4, wpos, capacity);
  650. if (NULL == pI)
  651. {
  652. // 没有对应定义
  653. return;
  654. }
  655. auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
  656. if (paramJs == NULL)
  657. {
  658. //detect the same name
  659. std::string t_arr[] = { "transID", "sessionID", "methodID", "signature", "timeout" ,"messageType","class","entity","methodID" };
  660. std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
  661. for (auto paramInfo : pI->mRequestInterpreter.mParamList)
  662. {
  663. for (auto repeatName : c_repeatParamList)
  664. {
  665. if (paramInfo.mName == repeatName)
  666. Dbg("request参数名字重复, error, %s", paramInfo.mName.c_str());
  667. }
  668. }
  669. //如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
  670. paramJs = js;
  671. }
  672. GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
  673. return;
  674. }
  675. void CWSCodec::SerializeBeginSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  676. unsigned int i4 = 0;
  677. GetCJsonIntergerValue(js, "transID", i4, errmsg);
  678. WriteT(data, i4, wpos, capacity);
  679. CSimpleStringA s = "";
  680. GetCJsonObjectValue(js, "entity", s, errmsg);
  681. WriteT(data, s, wpos, capacity);
  682. GetCJsonObjectValue(js, "method", s, errmsg);
  683. WriteT(data, s, wpos, capacity);
  684. GetCJsonObjectValue(js, "class", s, errmsg);
  685. WriteT(data, s, wpos, capacity);
  686. }
  687. void CWSCodec::SerializeEndSession(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  688. int i4 = 0;
  689. i4 = cJSON_GetObjectItem(js, "sessionID")->valueint;
  690. WriteT(data, i4, wpos, capacity);
  691. }
  692. void CWSCodec::SerializeRequest(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  693. unsigned int i4 = 0;
  694. GetCJsonIntergerValue(js, "transID", i4, errmsg);
  695. WriteT(data, i4, wpos, capacity);
  696. GetCJsonIntergerValue(js, "sessionID", i4, errmsg);
  697. WriteT(data, i4, wpos, capacity);
  698. GetCJsonIntergerValue(js, "methodID", i4, errmsg);
  699. WriteT(data, i4, wpos, capacity);
  700. GetCJsonIntergerValue(js, "signature", i4, errmsg);
  701. WriteT(data, i4, wpos, capacity);
  702. GetCJsonIntergerValue(js, "timeout", i4, errmsg);
  703. WriteT(data, i4, wpos, capacity);
  704. if (NULL == pI)
  705. {
  706. // 没有对应定义
  707. Dbg("没有对应定义");
  708. return;
  709. }
  710. auto paramJs = cJSON_GetObjectItem(js, PARAMLIST_HEAD);
  711. if (paramJs == NULL)
  712. {
  713. //detect the same name
  714. std::string t_arr[] = { "transID", "sessionID", "methodID", "signature", "timeout" ,"messageType","class","entity","methodID" };
  715. std::vector<std::string> c_repeatParamList(t_arr, t_arr + sizeof(t_arr) / sizeof(t_arr[0]));
  716. for (auto paramInfo : pI->mRequestInterpreter.mParamList)
  717. {
  718. for (auto repeatName : c_repeatParamList)
  719. {
  720. if (paramInfo.mName == repeatName)
  721. Dbg("request参数名字重复, error, %s", paramInfo.mName.c_str());
  722. }
  723. }
  724. //如果存在重复,可能数据已经脏了,所以也不需要作删除参数处理
  725. paramJs = js;
  726. }
  727. GeneralSerialize(paramJs, data, wpos, capacity, pI, errmsg);
  728. }
  729. void CWSCodec::SerializeRegister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  730. unsigned int i4 = 0;
  731. GetCJsonIntergerValue(js, "transID", i4, errmsg);
  732. WriteT(data, i4, wpos, capacity);
  733. CSimpleStringA s = "";
  734. GetCJsonObjectValue(js, "entity", s, errmsg);
  735. WriteT(data, s, wpos, capacity);
  736. s = "";
  737. WriteT(data, s, wpos, capacity);
  738. }
  739. void CWSCodec::SerializeUnregister(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  740. int i4 = 0;
  741. i4 = cJSON_GetObjectItem(js, "transID")->valueint;
  742. WriteT(data, i4, wpos, capacity);
  743. }
  744. void CWSCodec::SerializeLogEvent(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  745. int i4 = 0;
  746. i4 = cJSON_GetObjectItem(js, "securityLevel")->valueint;
  747. WriteT(data, i4, wpos, capacity);
  748. i4 = cJSON_GetObjectItem(js, "eventCode")->valueint;
  749. WriteT(data, i4, wpos, capacity);
  750. CSimpleStringA s = "";
  751. s = cJSON_GetObjectItem(js, "message")->valuestring;
  752. WriteT(data, s, wpos, capacity);
  753. }
  754. void CWSCodec::SerializeLogWarn(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  755. int i4 = 0;
  756. i4 = cJSON_GetObjectItem(js, "securityLevel")->valueint;
  757. WriteT(data, i4, wpos, capacity);
  758. i4 = cJSON_GetObjectItem(js, "eventCode")->valueint;
  759. CSimpleStringA s = "";
  760. s = cJSON_GetObjectItem(js, "message")->valuestring;
  761. WriteT(data, s, wpos, capacity);
  762. }
  763. void CWSCodec::SerializeSetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  764. int i4 = 0;
  765. i4 = cJSON_GetObjectItem(js, "transID")->valueint;
  766. WriteT(data, i4, wpos, capacity);
  767. CSimpleStringA s = "";
  768. s = cJSON_GetObjectItem(js, "name")->valuestring;
  769. WriteT(data, s, wpos, capacity);
  770. s = cJSON_GetObjectItem(js, "value")->valuestring;
  771. WriteT(data, s, wpos, capacity);
  772. }
  773. using namespace std;
  774. vector<string> split(const string& s, const string& seperator) {
  775. vector<string> result;
  776. typedef string::size_type string_size;
  777. string_size i = 0;
  778. while (i != s.size()) {
  779. //找到字符串中首个不等于分隔符的字母;
  780. int flag = 0;
  781. while (i != s.size() && flag == 0) {
  782. flag = 1;
  783. for (string_size x = 0; x < seperator.size(); ++x)
  784. if (s[i] == seperator[x]) {
  785. ++i;
  786. flag = 0;
  787. break;
  788. }
  789. }
  790. //找到又一个分隔符,将两个分隔符之间的字符串取出;
  791. flag = 0;
  792. string_size j = i;
  793. while (j != s.size() && flag == 0) {
  794. for (string_size x = 0; x < seperator.size(); ++x)
  795. if (s[j] == seperator[x]) {
  796. flag = 1;
  797. break;
  798. }
  799. if (flag == 0)
  800. ++j;
  801. }
  802. if (i != j) {
  803. result.push_back(s.substr(i, j - i));
  804. i = j;
  805. }
  806. }
  807. return result;
  808. }
  809. void CWSCodec::SerializeGetVarReq(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  810. int i4 = 0;
  811. i4 = cJSON_GetObjectItem(js, "transID")->valueint;
  812. WriteT(data, i4, wpos, capacity);
  813. CSimpleStringA s = "";
  814. s = cJSON_GetObjectItem(js, "name")->valuestring;
  815. WriteT(data, s, wpos, capacity);
  816. }
  817. void CWSCodec::GeneralSerialize(cJSON* js, char* data, int* wpos, int* capacity, CMedthodInterface* pI, char* errmsg) {
  818. std::list<CMethodParam>::iterator it = pI->mRequestInterpreter.mParamList.begin();
  819. auto dealBlob = [](CSimpleString src, char* bin)->std::pair <int, std::string> {
  820. if (!is_base64(src))
  821. return std::make_pair(-1, "base64 decode failed!");
  822. int binlen = modp_b64_decode_len(src.GetLength()) - 1;//二进制流,不需要结束
  823. if (binlen > 0)
  824. {
  825. bin = new char[binlen + 1];
  826. ZeroMemory(bin, binlen + 1);
  827. modp_b64_decode(bin, src.GetData(), src.GetLength());//binlen有可能比bin长
  828. short objectNum = *((short*)bin);
  829. int extendLen = 2 + objectNum * 2;
  830. int dstLen = binlen - (binlen - extendLen) % 4;
  831. return std::make_pair(dstLen, "");
  832. }
  833. else
  834. return std::make_pair(-1, "error binlen");
  835. };
  836. while (it != pI->mRequestInterpreter.mParamList.end()) {
  837. if (it->mType == "int")
  838. {
  839. unsigned int d = 0;
  840. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  841. WriteT(data, d, wpos, capacity);
  842. }
  843. else if (it->mType == "bool")
  844. {
  845. bool d = true;
  846. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  847. WriteT(data, d, wpos, capacity);
  848. }
  849. else if (it->mType == "double")
  850. {
  851. double d = 0;
  852. GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
  853. WriteT(data, d, wpos, capacity);
  854. }
  855. else if (it->mType == "char")
  856. {
  857. char d = 0;
  858. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  859. WriteT(data, d, wpos, capacity);
  860. }
  861. else if (it->mType == "short")
  862. {
  863. short d = 0;
  864. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  865. WriteT(data, d, wpos, capacity);
  866. }
  867. else if (it->mType == "ushort")
  868. {
  869. unsigned short d = 0;
  870. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  871. WriteT(data, d, wpos, capacity);
  872. }
  873. else if (it->mType == "uint")
  874. {
  875. unsigned int d = 0;
  876. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  877. WriteT(data, d, wpos, capacity);
  878. }
  879. else if (it->mType == "int64")
  880. {
  881. __int64 d = 0;
  882. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  883. WriteT(data, d, wpos, capacity);
  884. }
  885. else if (it->mType == "uint64")
  886. {
  887. u_int64_t d = 0;
  888. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  889. WriteT(data, d, wpos, capacity);
  890. }
  891. else if (it->mType == "uchar")
  892. {
  893. unsigned char d = 0;
  894. GetCJsonIntergerValue(js, it->mName.c_str(), d, errmsg);
  895. WriteT(data, d, wpos, capacity);
  896. }
  897. else if (it->mType == "string")
  898. {
  899. CSimpleStringA d = "";
  900. GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
  901. //Dbg("GeneralSerialize string %s -> %s", it->mName.c_str(), d);
  902. WriteT(data, d, wpos, capacity);
  903. }
  904. else if (it->mType == "wstring")
  905. {
  906. CSimpleStringW d = "";
  907. GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
  908. WriteT(data, d, wpos, capacity);
  909. }
  910. else if (it->mType == "blob")
  911. {
  912. CSimpleStringA d = "";
  913. GetCJsonObjectValue(js, it->mName.c_str(), d, errmsg);
  914. if (!is_base64(d)) {
  915. strcat(errmsg, "base64 decode failed!");
  916. ++it;
  917. continue;
  918. }
  919. int binlen = modp_b64_decode_len(d.GetLength()) - 1;//二进制流,不需要结束
  920. char* bin = NULL;
  921. if (binlen > 0)
  922. {
  923. bin = new char[binlen + 1];
  924. ZeroMemory(bin, binlen + 1);
  925. modp_b64_decode(bin, d.GetData(), d.GetLength());//binlen有可能比bin长
  926. short objectNum = *((short*)bin);
  927. int extendLen = 2 + objectNum * 2;
  928. int dstLen = binlen - (binlen - extendLen) % 4;
  929. std::string tempBlob = "blob len , " + std::to_string((ULONGLONG)dstLen) + ":";
  930. for (size_t i = 0; i < dstLen; i++)
  931. tempBlob += std::to_string((ULONGLONG)(unsigned char)bin[i]) + ",";
  932. Dbg(tempBlob.c_str());
  933. WriteT(data, dstLen, wpos, capacity);
  934. WriteT(data, bin, wpos, capacity, dstLen);
  935. delete[]bin;
  936. bin = NULL;
  937. }
  938. }
  939. else if (it->mType == "array_int")
  940. {
  941. Dbg("array int -> ");
  942. int len = 0;
  943. if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
  944. Dbg("array int -> true len = %d", len);
  945. WriteT(data, len, wpos, capacity);
  946. unsigned int d = 0;
  947. for (int i = 0; i < len; ++i) {
  948. if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg))
  949. break;
  950. WriteT(data, d, wpos, capacity);
  951. }
  952. }
  953. else {
  954. Dbg("array int -> false len = %d", len);
  955. WriteT(data, len, wpos, capacity);
  956. }
  957. }
  958. else if (it->mType == "array_uint")
  959. {
  960. Dbg("array uint -> ");
  961. int len = 0;
  962. if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
  963. Dbg("array int -> true len = %d", len);
  964. WriteT(data, len, wpos, capacity);
  965. unsigned int d = 0;
  966. for (int i = 0; i < len; ++i) {
  967. if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg))
  968. break;
  969. WriteT(data, d, wpos, capacity);
  970. }
  971. }
  972. else {
  973. Dbg("array int -> false len = %d", len);
  974. WriteT(data, len, wpos, capacity);
  975. }
  976. }
  977. else if (it->mType == "array_string")
  978. {
  979. Dbg("array string -> ");
  980. int len = 0;
  981. if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
  982. Dbg("array string -> true len = %d", len);
  983. WriteT(data, len, wpos, capacity);
  984. CSimpleStringA d = "";
  985. for (int i = 0; i < len; ++i) {
  986. if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg))
  987. break;
  988. WriteT(data, d, wpos, capacity);
  989. }
  990. }
  991. else {
  992. Dbg("array string -> false len = %d", len);
  993. WriteT(data, len, wpos, capacity);
  994. }
  995. }
  996. else if (it->mType == "array_wstring")
  997. {
  998. int len = 0;
  999. if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
  1000. WriteT(data, len, wpos, capacity);
  1001. CSimpleStringW d = "";
  1002. for (int i = 0; i < len; ++i) {
  1003. if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg))
  1004. break;
  1005. WriteT(data, d, wpos, capacity);
  1006. }
  1007. }
  1008. else {
  1009. WriteT(data, len, wpos, capacity);
  1010. }
  1011. }
  1012. else if (it->mType == "array_blob") {
  1013. int len = 0;
  1014. if (GetCJsonArraySize(js, it->mName.c_str(), len, errmsg)) {
  1015. WriteT(data, len, wpos, capacity);
  1016. CSimpleStringW d = "";
  1017. for (int i = 0; i < len; ++i) {
  1018. if (!GetCJsonObjectValue(cJSON_GetArrayItem(cJSON_GetObjectItem(js, it->mName.c_str()), i), d, errmsg))
  1019. break;
  1020. WriteT(data, d, wpos, capacity);
  1021. }
  1022. }
  1023. else {
  1024. WriteT(data, len, wpos, capacity);
  1025. }
  1026. }
  1027. else {
  1028. Dbg("GeneralSerialize error name -> type: %s -> %s", it->mName, it->mType);
  1029. }
  1030. ++it;
  1031. }
  1032. }
  1033. bool CWSCodec::GetCJsonObjectValue(cJSON* root, const char* strKey, char* dstValue, char* errmsg) {
  1034. cJSON* pTmpNode = NULL;
  1035. bool ret = false;
  1036. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1037. if (NULL != pTmpNode) {
  1038. strncpy(dstValue, pTmpNode->valuestring, strlen(pTmpNode->valuestring) + 1);
  1039. ret = true;
  1040. }
  1041. else {
  1042. if(nullptr != errmsg) strcat(errmsg, strKey);
  1043. strncpy(dstValue, "", strlen(""));
  1044. ret = false;
  1045. }
  1046. return ret;
  1047. }
  1048. bool CWSCodec::GetCJsonObjectValue(cJSON* root, const char* strKey, CSimpleStringA& dstValue, char* errmsg) {
  1049. cJSON* pTmpNode = NULL;
  1050. bool ret = false;
  1051. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1052. if (NULL != pTmpNode) {
  1053. CSimpleStringW wStr = "";
  1054. UTF8ToUnicode(pTmpNode->valuestring, wStr);
  1055. dstValue = CSimpleStringW2A(wStr);
  1056. ret = true;
  1057. }
  1058. else {
  1059. if(nullptr != errmsg) strcat(errmsg, strKey);
  1060. dstValue = "";
  1061. ret = false;
  1062. }
  1063. return ret;
  1064. }
  1065. bool CWSCodec::GetCJsonObjectValue(cJSON* root, const char* strKey, CSimpleStringW& dstValue, char* errmsg) {
  1066. cJSON* pTmpNode = NULL;
  1067. bool ret = false;
  1068. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1069. if (NULL != pTmpNode) {
  1070. UTF8ToUnicode(pTmpNode->valuestring, dstValue);
  1071. ret = true;
  1072. }
  1073. else {
  1074. if(nullptr != errmsg) strcat(errmsg, strKey);
  1075. dstValue = "";
  1076. ret = false;
  1077. }
  1078. return ret;
  1079. }
  1080. /*
  1081. bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, unsigned int& dstValue, char* errmsg){
  1082. cJSON *pTmpNode = NULL;
  1083. bool ret = false;
  1084. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1085. if(NULL != pTmpNode){
  1086. dstValue = *(unsigned int*)&pTmpNode->valueint;
  1087. ret = true;
  1088. }else{
  1089. if(nullptr != errmsg) strcat(errmsg, strKey);
  1090. dstValue = 0;
  1091. ret = false;
  1092. }
  1093. return ret;
  1094. }
  1095. bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, unsigned short& dstValue, char* errmsg){
  1096. cJSON *pTmpNode = NULL;
  1097. bool ret = false;
  1098. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1099. if(NULL != pTmpNode){
  1100. dstValue = pTmpNode->valueint;
  1101. ret = true;
  1102. }else{
  1103. if(nullptr != errmsg) strcat(errmsg, strKey);
  1104. dstValue = 0;
  1105. ret = false;
  1106. }
  1107. return ret;
  1108. }
  1109. bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, short& dstValue, char* errmsg){
  1110. cJSON *pTmpNode = NULL;
  1111. bool ret = false;
  1112. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1113. if(NULL != pTmpNode){
  1114. dstValue = pTmpNode->valueint;
  1115. ret = true;
  1116. }else{
  1117. if(nullptr != errmsg) strcat(errmsg, strKey);
  1118. dstValue = 0;
  1119. ret = false;
  1120. }
  1121. return ret;
  1122. }
  1123. bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, int& dstValue, char* errmsg){
  1124. cJSON *pTmpNode = NULL;
  1125. bool ret = false;
  1126. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1127. if(NULL != pTmpNode){
  1128. dstValue = pTmpNode->valueint;
  1129. ret = true;
  1130. }else{
  1131. if(nullptr != errmsg) strcat(errmsg, strKey);
  1132. dstValue = 0;
  1133. ret = false;
  1134. }
  1135. return ret;
  1136. }
  1137. */
  1138. bool CWSCodec::GetCJsonObjectValue(cJSON* root, const char* strKey, double& dstValue, char* errmsg) {
  1139. cJSON* pTmpNode = NULL;
  1140. bool ret = false;
  1141. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1142. if (NULL != pTmpNode) {
  1143. dstValue = pTmpNode->valuedouble;
  1144. ret = true;
  1145. }
  1146. else {
  1147. if(nullptr != errmsg) strcat(errmsg, strKey);
  1148. dstValue = 0;
  1149. ret = false;
  1150. }
  1151. return ret;
  1152. }
  1153. template<typename T>
  1154. bool CWSCodec::GetCJsonIntergerValue(cJSON* root, const char* strKey, T& dstValue, char* errmsg)
  1155. {
  1156. cJSON* pTmpNode = NULL;
  1157. bool ret = false;
  1158. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1159. if (NULL != pTmpNode) {
  1160. dstValue = pTmpNode->valueint;
  1161. ret = true;
  1162. }
  1163. else {
  1164. if(nullptr != errmsg) strcat(errmsg, strKey);
  1165. dstValue = 0;
  1166. ret = false;
  1167. }
  1168. return ret;
  1169. }
  1170. /*
  1171. bool CWSCodec::GetCJsonObjectValue(cJSON *root, const char* strKey, bool& dstValue, char* errmsg){
  1172. cJSON *pTmpNode = NULL;
  1173. bool ret = false;
  1174. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1175. if(NULL != pTmpNode){
  1176. dstValue = pTmpNode->valueint;
  1177. ret = true;
  1178. }else{
  1179. if(nullptr != errmsg) strcat(errmsg, strKey);
  1180. dstValue = 0;
  1181. ret = false;
  1182. }
  1183. return ret;
  1184. }
  1185. */
  1186. bool CWSCodec::GetCJsonArraySize(cJSON* root, const char* strKey, int& dstValue, char* errmsg) {
  1187. cJSON* pTmpNode = NULL;
  1188. bool ret = false;
  1189. pTmpNode = cJSON_GetObjectItem(root, strKey);
  1190. if (NULL != pTmpNode) {
  1191. dstValue = cJSON_GetArraySize(pTmpNode);
  1192. ret = true;
  1193. }
  1194. else {
  1195. if(nullptr != errmsg) strcat(errmsg, strKey);
  1196. dstValue = 0;
  1197. ret = false;
  1198. }
  1199. return ret;
  1200. }
  1201. bool CWSCodec::GetCJsonObjectValue(cJSON *obj, int& dstValue, char* errmsg){
  1202. if (cJSON_Number == obj->type)
  1203. {
  1204. dstValue = obj->valueint;
  1205. return true;
  1206. }
  1207. strcat(errmsg, "array member ");
  1208. dstValue = 0;
  1209. return false;
  1210. }
  1211. bool CWSCodec::GetCJsonObjectValue(cJSON *obj, unsigned int& dstValue, char* errmsg){
  1212. if (cJSON_Number == obj->type)
  1213. {
  1214. dstValue = obj->valueint;
  1215. return true;
  1216. }
  1217. strcat(errmsg, "array member ");
  1218. dstValue = 0;
  1219. return false;
  1220. }
  1221. bool CWSCodec::GetCJsonObjectValue(cJSON* obj, CSimpleStringA& dstValue, char* errmsg) {
  1222. if (cJSON_String == obj->type) {
  1223. Dbg("GetCJsonObjectValue CSimpleStringA = %s", obj->valuestring);
  1224. hexdump(obj->valuestring, strlen(obj->valuestring));
  1225. CSimpleStringW strw = "";
  1226. UTF8ToUnicode(obj->valuestring, strw);
  1227. dstValue = CSimpleStringW2A(strw);
  1228. return true;
  1229. }
  1230. strcat(errmsg, "array member ");
  1231. dstValue = "";
  1232. return false;
  1233. }
  1234. bool CWSCodec::GetCJsonObjectValue(cJSON* obj, CSimpleStringW& dstValue, char* errmsg) {
  1235. if (cJSON_String == obj->type) {
  1236. UTF8ToUnicode(obj->valuestring, dstValue);
  1237. return true;
  1238. }
  1239. strcat(errmsg, "array member ");
  1240. dstValue = "";
  1241. return false;
  1242. }
  1243. int CWSCodec::UTF8ToUnicode(char* input, CSimpleStringW& output) {
  1244. #if (defined(_WIN32) || defined(_WIN64))
  1245. //UTF8 to Unicode
  1246. //预转换,得到所需空间的大小
  1247. int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, input, strlen(input), NULL, 0);
  1248. //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
  1249. WCHAR* wszString = new WCHAR[wcsLen + 1];
  1250. //转换
  1251. ::MultiByteToWideChar(CP_UTF8, NULL, input, strlen(input), wszString, wcsLen);
  1252. //最后加上'\0'
  1253. wszString[wcsLen] = '\0';
  1254. output = wszString;
  1255. delete[] wszString;
  1256. wszString = NULL;
  1257. return 0;
  1258. #else
  1259. std::wstring ret = SP::Utility::S2W(input);
  1260. output = ret.c_str();
  1261. return 0;
  1262. #endif
  1263. }
  1264. void CWSCodec::hexdump(const char* buf, const int num) {
  1265. char str[8192] = { 0 };
  1266. int i = 0;
  1267. char c[5] = { 0 };
  1268. if (num > 1200)
  1269. {
  1270. for (i = 0; i < 50; i++)
  1271. {
  1272. sprintf(c, "%02X ", (unsigned char)buf[i]);
  1273. strcat(str, c);
  1274. }
  1275. Dbg("buffer too long to show!show pre 50 hex! CWSCodec hex buf : %d : %s", num, str);
  1276. return;
  1277. }
  1278. for (i = 0; i < num; i++)
  1279. {
  1280. sprintf(c, "%02X ", (unsigned char)buf[i]);
  1281. strcat(str, c);
  1282. }
  1283. Dbg("CWSCodec hex buf : %s", str);
  1284. return;
  1285. }
  1286. std::string CWSCodec::GetEntityName(std::string strJson) {
  1287. cJSON* pJson = cJSON_Parse(strJson.c_str());
  1288. char entity_name[64] = { 0 };
  1289. char errmsg[1024] = { 0 };
  1290. GetCJsonObjectValue(pJson, "entity", entity_name, errmsg);
  1291. std::string s(entity_name);
  1292. cJSON_Delete(pJson);
  1293. return s;
  1294. }
  1295. std::string CWSCodec::GetClassName(std::string strJson) {
  1296. cJSON* pJson = cJSON_Parse(strJson.c_str());
  1297. char class_name[64] = { 0 };
  1298. char errmsg[1024] = { 0 };
  1299. GetCJsonObjectValue(pJson, "class", class_name, errmsg);
  1300. std::string s(class_name);
  1301. cJSON_Delete(pJson);
  1302. return s;
  1303. }
  1304. }