PacketAnalizer.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. #include <assert.h>
  2. #include "Crc64.h"
  3. #include "CcosLock.h"
  4. #include "PacketAnalizer.h"
  5. #include <iostream>
  6. #include <sstream> // 添加字符串流支持
  7. #include <cstdint> // 添加标准整数类型头文件
  8. // 使用标准命名空间
  9. using namespace std;
  10. PacketAnalizer::PacketAnalizer(void)
  11. {
  12. }
  13. PacketAnalizer::~PacketAnalizer(void)
  14. {
  15. }
  16. uint32_t PacketAnalizer::MakePacketIdx()
  17. {
  18. return Thread_GetUniqTick();
  19. }
  20. uint32_t PacketAnalizer::GetPacketIdx(ResDataObject* pObj)
  21. {
  22. uint32_t ret = 0;
  23. try {
  24. int Idx = (*pObj).GetFirstOf(CCOS_PACK_IDX);
  25. if (Idx >= 0)
  26. {
  27. ret = static_cast<uint32_t>((*pObj)[CCOS_PACK_IDX]);
  28. }
  29. }
  30. catch (ResDataObjectExption& exp)
  31. {
  32. cout << exp.what() << endl;
  33. }
  34. catch (...)
  35. {
  36. }
  37. return ret;
  38. }
  39. bool PacketAnalizer::GetDestinationMachineId(ResDataObject& packet, string& machineId)
  40. {
  41. bool ret = false;
  42. try {
  43. // 检查目标并分派
  44. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  45. switch (type)
  46. {
  47. // 请求:设备总线+进程
  48. case PACKET_TYPE_REQ:
  49. if (PacketAnalizer::GetPacketHandleMachineId(&packet, machineId, true))
  50. {
  51. return true;
  52. }
  53. break;
  54. // 响应和通知:所有者总线+进程
  55. case PACKET_TYPE_RES:
  56. case PACKET_TYPE_NOTIFY:
  57. if (PacketAnalizer::GetPacketHandleMachineId(&packet, machineId, false))
  58. {
  59. return true;
  60. }
  61. break;
  62. default:
  63. break;
  64. }
  65. }
  66. catch (...)
  67. {
  68. }
  69. return ret;
  70. }
  71. bool PacketAnalizer::GetDestinationBusId(ResDataObject& packet, string& busId)
  72. {
  73. bool ret = false;
  74. try {
  75. // 检查目标并分派
  76. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  77. switch (type)
  78. {
  79. // 请求:设备总线+进程
  80. case PACKET_TYPE_REQ:
  81. if (PacketAnalizer::GetPacketHandleBusId(&packet, busId, true))
  82. {
  83. return true;
  84. }
  85. break;
  86. // 响应和通知:所有者总线+进程
  87. case PACKET_TYPE_RES:
  88. case PACKET_TYPE_NOTIFY:
  89. if (PacketAnalizer::GetPacketHandleBusId(&packet, busId, false))
  90. {
  91. return true;
  92. }
  93. break;
  94. default:
  95. break;
  96. }
  97. }
  98. catch (...)
  99. {
  100. }
  101. return ret;
  102. }
  103. bool PacketAnalizer::GetDestinationProcId(ResDataObject& packet, uint64_t& procId)
  104. {
  105. bool ret = false;
  106. try {
  107. // 检查目标并分派
  108. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  109. switch (type)
  110. {
  111. // 请求:设备总线+进程
  112. case PACKET_TYPE_REQ:
  113. if (PacketAnalizer::GetPacketHandleProcId(&packet, procId, true))
  114. {
  115. return true;
  116. }
  117. break;
  118. // 响应和通知:所有者总线+进程
  119. case PACKET_TYPE_RES:
  120. case PACKET_TYPE_NOTIFY:
  121. if (PacketAnalizer::GetPacketHandleProcId(&packet, procId, false))
  122. {
  123. return true;
  124. }
  125. break;
  126. default:
  127. break;
  128. }
  129. }
  130. catch (...)
  131. {
  132. }
  133. return ret;
  134. }
  135. PACKET_TYPE PacketAnalizer::GetPacketType(ResDataObject* pObj)
  136. {
  137. int cmd;
  138. PACKET_TYPE ret = PACKET_TYPE_NONE;
  139. try {
  140. cmd = static_cast<int>((*pObj)[CCOS_PACK_TYPE]);
  141. ret = static_cast<PACKET_TYPE>(cmd);
  142. if (ret >= 0 && ret < PACKET_TYPE_MAX)
  143. {
  144. return ret;
  145. }
  146. }
  147. catch (ResDataObjectExption& exp)
  148. {
  149. cout << exp.what() << endl;
  150. }
  151. catch (...)
  152. {
  153. }
  154. return PACKET_TYPE_NONE;
  155. }
  156. PACKET_CMD PacketAnalizer::GetPacketCmd(ResDataObject* pObj)
  157. {
  158. int cmd;
  159. PACKET_CMD ret = PACKET_CMD_NONE;
  160. try {
  161. cmd = static_cast<int>(((*pObj)[CCOS_PACK_CMD]));
  162. ret = static_cast<PACKET_CMD>(cmd);
  163. if (ret >= 0 && ret < PACKET_CMD_MAX)
  164. {
  165. return ret;
  166. }
  167. }
  168. catch (ResDataObjectExption& exp)
  169. {
  170. cout << exp.what() << endl;
  171. }
  172. catch (...)
  173. {
  174. }
  175. return PACKET_CMD_NONE;
  176. }
  177. ACTION_SYNC_MODE PacketAnalizer::GetPacketSyncMode(ResDataObject* pObj)
  178. {
  179. ACTION_SYNC_MODE ret = ACTION_SYNC;
  180. try {
  181. ret = static_cast<ACTION_SYNC_MODE>(static_cast<int>((*pObj)[CCOS_PACKET_SYNC]));
  182. }
  183. catch (...)
  184. {
  185. ret = ACTION_SYNC;
  186. }
  187. return ret;
  188. }
  189. ResDataObject* PacketAnalizer::GetPacketKeysRes(ResDataObject* pObj)
  190. {
  191. try {
  192. int Idx = (*pObj).GetFirstOf(CCOS_PACK_KEY);
  193. if (Idx >= 0)
  194. {
  195. ResDataObject& Res = (*pObj)[CCOS_PACK_KEY];
  196. return &Res;
  197. }
  198. }
  199. catch (ResDataObjectExption& exp)
  200. {
  201. cout << exp.what() << endl;
  202. }
  203. catch (...)
  204. {
  205. }
  206. return NULL;
  207. }
  208. string PacketAnalizer::GetPacketPublisher(ResDataObject* pObj)
  209. {
  210. std::string key = "";
  211. try {
  212. int Idx = (*pObj).GetFirstOf(CCOS_PUBLISH);
  213. if (Idx >= 0)
  214. {
  215. key = static_cast<const char*>((*pObj)[CCOS_PUBLISH]);
  216. }
  217. }
  218. catch (ResDataObjectExption& exp)
  219. {
  220. cout << exp.what() << endl;
  221. key = "";
  222. }
  223. catch (...)
  224. {
  225. key = "";
  226. }
  227. return key;
  228. }
  229. std::string PacketAnalizer::GetPacketKey(ResDataObject* pObj)
  230. {
  231. std::string key = "";
  232. try {
  233. int Idx = (*pObj).GetFirstOf(CCOS_PACK_KEY);
  234. if (Idx >= 0)
  235. {
  236. key = static_cast<const char*>((*pObj)[CCOS_PACK_KEY]);
  237. }
  238. }
  239. catch (ResDataObjectExption& exp)
  240. {
  241. cout << exp.what() << endl;
  242. key = "";
  243. }
  244. catch (...)
  245. {
  246. key = "";
  247. }
  248. return key;
  249. }
  250. bool PacketAnalizer::GetPacketHandleExistance(ResDataObject* pPacket)
  251. {
  252. bool ret = false;
  253. try {
  254. if ((*pPacket).GetFirstOf(CCOS_PACK_HANDLE) >= 0)
  255. {
  256. ret = true;
  257. }
  258. }
  259. catch (...)
  260. {
  261. ret = false;
  262. }
  263. return ret;
  264. }
  265. bool PacketAnalizer::GetPacketHandle(ResDataObject* pPacket, ResDataObject& Handle)
  266. {
  267. bool ret = true;
  268. try {
  269. Handle = (*pPacket)[CCOS_PACK_HANDLE];
  270. }
  271. catch (...)
  272. {
  273. ret = false;
  274. }
  275. return ret;
  276. }
  277. bool PacketAnalizer::GetPacketHandleBusId(ResDataObject* pPacket, string& BusId, bool dev)
  278. {
  279. bool ret = true;
  280. try {
  281. if (dev)
  282. {
  283. BusId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_BUSID]);
  284. }
  285. else
  286. {
  287. BusId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_BUSID]);
  288. }
  289. }
  290. catch (...)
  291. {
  292. BusId = "";
  293. ret = false;
  294. }
  295. return ret;
  296. }
  297. bool PacketAnalizer::GetPacketHandleMachineId(ResDataObject* pPacket, string& MachineId, bool dev)
  298. {
  299. bool ret = true;
  300. try {
  301. if (dev)
  302. {
  303. MachineId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_MACHINEID]);
  304. }
  305. else
  306. {
  307. MachineId = static_cast<const char*>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_MACHINEID]);
  308. }
  309. }
  310. catch (...)
  311. {
  312. MachineId = "";
  313. ret = false;
  314. }
  315. return ret;
  316. }
  317. bool PacketAnalizer::GetPacketHandleProcId(ResDataObject* pPacket, uint64_t& ProcId, bool dev)
  318. {
  319. bool ret = true;
  320. try {
  321. if (dev)
  322. {
  323. ProcId = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_PROCID]);
  324. }
  325. else
  326. {
  327. ProcId = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_PROCID]);
  328. }
  329. }
  330. catch (...)
  331. {
  332. ProcId = 0;
  333. ret = false;
  334. }
  335. return ret;
  336. }
  337. bool PacketAnalizer::GetPacketHandleCrc(ResDataObject* pPacket, uint64_t& Crc)
  338. {
  339. bool ret = true;
  340. try {
  341. Crc = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY]);
  342. }
  343. catch (...)
  344. {
  345. Crc = 0;
  346. ret = false;
  347. }
  348. return ret;
  349. }
  350. bool PacketAnalizer::GetPacketHandleAddr(ResDataObject* pPacket, uint64_t& Addr, bool dev)
  351. {
  352. bool ret = true;
  353. try {
  354. if (dev)
  355. {
  356. Addr = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_ADDR]);
  357. }
  358. else
  359. {
  360. Addr = static_cast<uint64_t>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID][CCOS_PACK_TARGET_ADDR]);
  361. }
  362. }
  363. catch (...)
  364. {
  365. Addr = 0;
  366. ret = false;
  367. }
  368. return ret;
  369. }
  370. bool PacketAnalizer::MakePacketContextExistance(ResDataObject* pPacket)
  371. {
  372. bool ret = false;
  373. try {
  374. if ((*pPacket).GetFirstOf(CCOS_PACK_CONTEXT) >= 0)
  375. {
  376. ret = true;
  377. }
  378. else
  379. {
  380. (*pPacket).add(CCOS_PACK_CONTEXT, "");
  381. ret = true;
  382. }
  383. }
  384. catch (...)
  385. {
  386. ret = false;
  387. }
  388. return ret;
  389. }
  390. bool PacketAnalizer::GetPacketRoute(ResDataObject* pPacket, CCOS_PACKET_ROUTE& Route)
  391. {
  392. bool ret = true;
  393. Route = CCOS_PACKET_ROUTE_ANY; // 设置默认值
  394. try {
  395. Route = static_cast<CCOS_PACKET_ROUTE>(static_cast<int>((*pPacket)[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_ROUTE]));
  396. }
  397. catch (...)
  398. {
  399. ret = false;
  400. }
  401. return ret;
  402. }
  403. bool PacketAnalizer::GetPacketContext(ResDataObject* pPacket, ResDataObject& Context)
  404. {
  405. bool ret = true;
  406. try {
  407. int Idx = (*pPacket).GetFirstOf(CCOS_PACK_CONTEXT);
  408. if (Idx >= 0)
  409. {
  410. Context = (*pPacket)[Idx];
  411. }
  412. }
  413. catch (...)
  414. {
  415. ret = false;
  416. }
  417. return ret;
  418. }
  419. bool PacketAnalizer::GetPacketTransaction(ResDataObject* pPacket, string& transaction)
  420. {
  421. bool ret = true;
  422. try {
  423. int Idx = (*pPacket).GetFirstOf(CCOS_TRANSACTION);
  424. if (Idx >= 0)
  425. {
  426. string id = static_cast<string>((*pPacket)[Idx]);
  427. transaction = id;
  428. }
  429. }
  430. catch (...)
  431. {
  432. ret = false;
  433. }
  434. return ret;
  435. }
  436. bool PacketAnalizer::GetPacketRetCode(ResDataObject* pPacket, RET_STATUS& retcode)
  437. {
  438. bool ret = true;
  439. try {
  440. (retcode) = (RET_STATUS)((int)((*pPacket)[CCOS_PACK_RETURN][CCOS_PACK_CODE]));
  441. }
  442. catch (...)
  443. {
  444. retcode = RET_FAILED;
  445. ret = false;
  446. }
  447. return ret;
  448. }
  449. bool PacketAnalizer::GetPacketMsgInfo(ResDataObject* pPacket, string& Info)
  450. {
  451. bool ret = true;
  452. try {
  453. int Idx = (*pPacket)[CCOS_PACK_RETURN].GetFirstOf(CCOS_PACK_MSG);
  454. if (Idx >= 0)
  455. {
  456. Info = static_cast<const char*>(((*pPacket)[CCOS_PACK_RETURN][Idx]));
  457. }
  458. }
  459. catch (...)
  460. {
  461. ret = false;
  462. }
  463. return ret;
  464. }
  465. void PacketAnalizer::MakeRetCode(RET_STATUS retcode, ResDataObject* pObj, const char* pMsg)
  466. {
  467. ResDataObject RetObj, SubObj;
  468. SubObj.add(CCOS_PACK_CODE, static_cast<int>(retcode));
  469. if (pMsg)
  470. {
  471. SubObj.add(CCOS_PACK_MSG, pMsg);
  472. }
  473. pObj->update(CCOS_PACK_RETURN, SubObj);
  474. }
  475. bool PacketAnalizer::CloneResponse(ResDataObject& Obj, ResDataObject* pReq)
  476. {
  477. Obj.clear();
  478. // 复制索引
  479. uint32_t Idx = PacketAnalizer::GetPacketIdx(pReq);
  480. if (Idx)
  481. {
  482. Obj.add(CCOS_PACK_IDX, Idx);
  483. Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_RES));
  484. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pReq);
  485. if (cmd != PACKET_CMD_NONE)
  486. {
  487. Obj.add(CCOS_PACK_CMD, static_cast<int>(cmd));
  488. Obj.add(CCOS_PACK_HANDLE, (*pReq)[CCOS_PACK_HANDLE]);
  489. string keystr = PacketAnalizer::GetPacketKey(pReq);
  490. Obj.add(CCOS_PACK_KEY, keystr.c_str());
  491. Obj.add(CCOS_PACK_CONTEXT, "");
  492. return true;
  493. }
  494. }
  495. return false;
  496. }
  497. bool PacketAnalizer::UpdateOpenRequest(ResDataObject& Req, ResDataObject& MachineId, ResDataObject& busId, uint64_t ProcId, uint64_t Addr)
  498. {
  499. try {
  500. Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_ADDR] = Addr;
  501. Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_PROCID] = ProcId;
  502. Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_BUSID] = busId;
  503. Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID][CCOS_PACK_TARGET_MACHINEID] = MachineId;
  504. string the_crc = "";
  505. the_crc += Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_OWNERID].encode();
  506. the_crc += static_cast<const char*>(Req[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_DEVID].encode());
  507. uint64_t crc = GetCrc64(the_crc.c_str(), static_cast<uint32_t>(the_crc.size()));
  508. Req[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY] = crc;
  509. return true;
  510. }
  511. catch (...)
  512. {
  513. }
  514. return false;
  515. }
  516. bool PacketAnalizer::UpdateHandleId(ResDataObject* Obj, uint64_t id)
  517. {
  518. (*Obj)[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY] = id;
  519. return true;
  520. }
  521. bool PacketAnalizer::GetHandleId(ResDataObject* Obj, uint64_t& Id)
  522. {
  523. bool ret = true;
  524. try {
  525. Id = static_cast<uint64_t>((*Obj)[CCOS_PACK_HANDLE][CCOS_PACKET_HANDLE_KEY]);
  526. }
  527. catch (...)
  528. {
  529. Id = 0;
  530. ret = false;
  531. }
  532. return ret;
  533. }
  534. bool PacketAnalizer::UpdateDeviceNotifyResponse(ResDataObject& Notify, ResDataObject& MachineId, ResDataObject& busId, uint64_t ProcId, uint64_t Addr)
  535. {
  536. try {
  537. CcosDevFileHandle handle;
  538. handle.GetTarget(false)[CCOS_PACK_TARGET_MACHINEID] = static_cast<const char*>(MachineId);
  539. handle.GetTarget(false)[CCOS_PACK_TARGET_BUSID] = static_cast<const char*>(busId);
  540. handle.GetTarget(false)[CCOS_PACK_TARGET_PROCID] = ProcId;
  541. handle.GetTarget(false)[CCOS_PACK_TARGET_ADDR] = Addr;
  542. ResDataObject handleObj;
  543. handle.GetResDataObject(handleObj);
  544. Notify.update(CCOS_PACK_HANDLE, handleObj);
  545. return true;
  546. }
  547. catch (...)
  548. {
  549. }
  550. return false;
  551. }
  552. bool PacketAnalizer::UpdatePacketContext(ResDataObject& packet, ResDataObject& Context)
  553. {
  554. try {
  555. packet[CCOS_PACK_CONTEXT] = Context;
  556. return true;
  557. }
  558. catch (...)
  559. {
  560. }
  561. return false;
  562. }
  563. bool PacketAnalizer::UpdatePacketTransaction(ResDataObject& packet, string strTransaction)
  564. {
  565. try {
  566. packet.update(CCOS_TRANSACTION, strTransaction.c_str());
  567. return true;
  568. }
  569. catch (...)
  570. {
  571. }
  572. return false;
  573. }
  574. bool PacketAnalizer::MakeOpenResponse(ResDataObject& Req, ResDataObject& Res, ResDataObject& DevResource)
  575. {
  576. PacketAnalizer::CloneResponse(Res, &Req);
  577. try {
  578. Res.update(CCOS_PACK_CONTEXT, DevResource);
  579. PacketAnalizer::MakeRetCode(RET_SUCCEED, &Res);
  580. return true;
  581. }
  582. catch (...)
  583. {
  584. }
  585. return false;
  586. }
  587. void PacketAnalizer::MakeNotifyP2P(ResDataObject& Obj, PACKET_CMD cmd, ResDataObject* pReq, const char* pKey, const char* pContext)
  588. {
  589. Obj.clear();
  590. Obj.update(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  591. Obj.update(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
  592. Obj.update(CCOS_PACK_CMD, static_cast<int>(cmd));
  593. Obj.update(CCOS_PACK_HANDLE, (*pReq)[CCOS_PACK_HANDLE]);
  594. Obj.update(CCOS_PACK_KEY, pKey);
  595. Obj.update(CCOS_PACK_CONTEXT, pContext);
  596. Obj.update(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  597. }
  598. bool PacketAnalizer::UpdatePacketRoute(ResDataObject& Obj, CCOS_PACKET_ROUTE Route)
  599. {
  600. Obj[CCOS_PACK_HANDLE][CCOS_PACK_HANDLE_ROUTE] = static_cast<int>(Route);
  601. return true;
  602. }
  603. bool PacketAnalizer::UpdateNotifyHandle(ResDataObject& Obj, CcosDevFileHandle& handle)
  604. {
  605. ResDataObject handleObj;
  606. handle.GetResDataObject(handleObj);
  607. Obj.update(CCOS_PACK_HANDLE, handleObj);
  608. return true;
  609. }
  610. void PacketAnalizer::MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, const char* pKey, const char* pContext)
  611. {
  612. Obj.clear();
  613. Obj.update(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  614. Obj.update(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
  615. Obj.update(CCOS_PACK_CMD, static_cast<int>(cmd));
  616. Obj.update(CCOS_PACK_KEY, pKey);
  617. Obj.update(CCOS_PACK_CONTEXT, pContext);
  618. Obj.update(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  619. }
  620. void PacketAnalizer::MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, ResDataObject& Key, const ResDataObject& Context)
  621. {
  622. Obj.clear();
  623. Obj.add(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  624. Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
  625. Obj.add(CCOS_PACK_CMD, static_cast<int>(cmd));
  626. Obj.add(CCOS_PACK_KEY, Key);
  627. Obj.add(CCOS_PACK_CONTEXT, const_cast<ResDataObject&>(Context));
  628. Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  629. }
  630. void PacketAnalizer::MakeNotify(ResDataObject& Obj, PACKET_CMD cmd, const char* pKey, const ResDataObject& Context)
  631. {
  632. Obj.clear();
  633. Obj.add(CCOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  634. Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
  635. Obj.add(CCOS_PACK_CMD, static_cast<int>(cmd));
  636. Obj.add(CCOS_PACK_KEY, pKey);
  637. Obj.add(CCOS_PACK_CONTEXT, const_cast<ResDataObject&>(Context));
  638. Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  639. }
  640. uint32_t PacketAnalizer::MakeActionRequest(ResDataObject& Obj, CcosDevFileHandle& handle, const char* pActionName, ResDataObject& ReqParams, ACTION_SYNC_MODE mode)
  641. {
  642. uint32_t tick = PacketAnalizer::MakePacketIdx();
  643. Obj.clear();
  644. Obj.add(CCOS_PACK_IDX, tick);
  645. Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_REQ));
  646. Obj.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_EXE));
  647. Obj.add(CCOS_PACKET_SYNC, static_cast<int>(mode));
  648. Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  649. ResDataObject handleObj;
  650. handle.GetResDataObject(handleObj);
  651. Obj.add(CCOS_PACK_HANDLE, handleObj);
  652. Obj.add(CCOS_PACK_KEY, pActionName);
  653. Obj.add(CCOS_PACK_CONTEXT, ReqParams);
  654. return tick;
  655. }
  656. uint32_t PacketAnalizer::MakeRequest(ResDataObject& Obj, const char* pszReqName, PACKET_CMD cmd, ResDataObject* reqParams)
  657. {
  658. DWORD tick = PacketAnalizer::MakePacketIdx();
  659. Obj.clear();
  660. Obj.add(CCOS_PACK_IDX, tick);
  661. Obj.add(CCOS_PACK_TYPE, (int)PACKET_TYPE_REQ);
  662. Obj.add(CCOS_PACK_CMD, (int)cmd);
  663. Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  664. Obj.add(CCOS_PACK_KEY, pszReqName);
  665. Obj.add(CCOS_PACK_CONTEXT, *reqParams);
  666. return tick;
  667. }
  668. uint32_t PacketAnalizer::MakeOpenRequest(ResDataObject& Obj, CcosDevFileHandle& handle, const char* pFilePath)
  669. {
  670. uint32_t tick = PacketAnalizer::MakePacketIdx();
  671. Obj.clear();
  672. Obj.add(CCOS_PACK_IDX, tick);
  673. Obj.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_REQ));
  674. Obj.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_OPEN));
  675. Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  676. ResDataObject handleObj;
  677. handle.GetResDataObject(handleObj);
  678. Obj.add(CCOS_PACK_HANDLE, handleObj);
  679. Obj.add(CCOS_PACK_KEY, pFilePath);
  680. ResDataObject context;
  681. context.add(CCOS_RESP_TOPIC, "");
  682. Obj.add(CCOS_PACK_CONTEXT, context);
  683. return tick;
  684. }
  685. bool PacketAnalizer::MakeResponseByReq(ResDataObject& Response, ResDataObject& Req, RET_STATUS ret, const char* pInfo)
  686. {
  687. PacketAnalizer::CloneResponse(Response, &Req);
  688. PacketAnalizer::MakeRetCode(ret, &Response, pInfo);
  689. return true;
  690. }
  691. bool PacketAnalizer::MakeCloseNotifyByRes(ResDataObject& Response, ResDataObject& Req)
  692. {
  693. uint32_t tick = PacketAnalizer::MakePacketIdx();
  694. Req.clear();
  695. Req.add(CCOS_PACK_IDX, tick);
  696. Req.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_NOTIFY));
  697. Req.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_CLOSE));
  698. Req.add(CCOS_PACK_HANDLE, Response[CCOS_PACK_HANDLE]);
  699. Req.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  700. return true;
  701. }
  702. bool PacketAnalizer::MakeCloseRequestByRes(ResDataObject& Response, ResDataObject& Req)
  703. {
  704. uint32_t tick = PacketAnalizer::MakePacketIdx();
  705. Req.clear();
  706. Req.add(CCOS_PACK_IDX, tick);
  707. Req.add(CCOS_PACK_TYPE, static_cast<int>(PACKET_TYPE_REQ));
  708. Req.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_CLOSE));
  709. Req.add(CCOS_PACK_HANDLE, Response[CCOS_PACK_HANDLE]);
  710. return true;
  711. }
  712. bool PacketAnalizer::MakeCloseRequest(ResDataObject& Obj, CcosDevFileHandle& handle, PACKET_TYPE Type)
  713. {
  714. uint32_t tick = PacketAnalizer::MakePacketIdx();
  715. Obj.clear();
  716. Obj.add(CCOS_PACK_IDX, tick);
  717. Obj.add(CCOS_PACK_TYPE, static_cast<int>(Type));
  718. Obj.add(CCOS_PACK_CMD, static_cast<int>(PACKET_CMD_CLOSE));
  719. Obj.add(CCOS_PACKET_VER, CCOS_PACKET_VER_NOW);
  720. ResDataObject handleObj;
  721. handle.GetResDataObject(handleObj);
  722. Obj.add(CCOS_PACK_HANDLE, handleObj);
  723. return true;
  724. }
  725. bool PacketAnalizer::MakeCloseResponse(ResDataObject& Req, ResDataObject& Res)
  726. {
  727. PacketAnalizer::CloneResponse(Res, &Req);
  728. PacketAnalizer::MakeRetCode(RET_SUCCEED, &Res);
  729. return true;
  730. }
  731. bool PacketAnalizer::GetParam(ResDataObject* pReq, unsigned int ParamIdx, ResDataObject& value)
  732. {
  733. bool ret = false;
  734. string parami = "P" + to_string(ParamIdx); // 使用标准库函数生成参数名
  735. try {
  736. if ((*pReq)[CCOS_PACK_CONTEXT].GetFirstOf(parami.c_str()) >= 0)
  737. {
  738. value = (*pReq)[CCOS_PACK_CONTEXT][parami.c_str()];
  739. return true;
  740. }
  741. }
  742. catch (...)
  743. {
  744. ret = false;
  745. }
  746. return ret;
  747. }
  748. bool PacketAnalizer::AddParam(ResDataObject* pRes, unsigned int ParamIdx, ResDataObject& value)
  749. {
  750. bool ret = true;
  751. string parami = "P" + to_string(ParamIdx); // 使用标准库函数生成参数名
  752. try {
  753. ret = (*pRes)[CCOS_PACK_CONTEXT].add(parami.c_str(), value);
  754. }
  755. catch (...)
  756. {
  757. ret = false;
  758. }
  759. return ret;
  760. }
  761. bool PacketAnalizer::UpdateParam(ResDataObject* pRes, unsigned int ParamIdx, ResDataObject& value)
  762. {
  763. bool ret = true;
  764. string parami = "P" + to_string(ParamIdx); // 使用标准库函数生成参数名
  765. try {
  766. ret = (*pRes)[CCOS_PACK_CONTEXT].update(parami.c_str(), value);
  767. }
  768. catch (...)
  769. {
  770. ret = false;
  771. }
  772. return ret;
  773. }
  774. bool PacketAnalizer::UpdatePacketTopic(ResDataObject* Obj, const char* pszTopic, const char* pszClientID)
  775. {
  776. Obj->update(CCOS_TOPIC, pszTopic);
  777. Obj->update(CCOS_PUBLISH, pszClientID);
  778. return true;
  779. }
  780. bool PacketAnalizer::UpdatePacketKey(ResDataObject* Obj, const char* keystr)
  781. {
  782. Obj->update(CCOS_PACK_KEY, keystr);
  783. return true;
  784. }
  785. bool PacketAnalizer::UpdateContextTopic(ResDataObject* Obj, const char* pszRespTopic)
  786. {
  787. (*Obj)[CCOS_PACK_CONTEXT].update(CCOS_RESP_TOPIC, pszRespTopic);
  788. return true;
  789. }
  790. bool PacketAnalizer::GetContextTopic(ResDataObject* Obj, ResDataObject& topic)
  791. {
  792. if ((*Obj).GetFirstOf("ResponseTopic") > 0)
  793. topic = (*Obj)["ResponseTopic"];
  794. else
  795. topic = (*Obj)[CCOS_PACK_CONTEXT][CCOS_RESP_TOPIC];
  796. return true;
  797. }
  798. bool PacketAnalizer::GetPacketTopic(ResDataObject* Obj, ResDataObject& topic)
  799. {
  800. if ((*Obj).GetFirstOf(CCOS_TOPIC) > 0)
  801. topic = (*Obj)[CCOS_TOPIC];
  802. else
  803. topic = (*Obj)[CCOS_PACK_CONTEXT][CCOS_RESP_TOPIC];
  804. return true;
  805. }
  806. bool PacketAnalizer::CloneTransaction(ResDataObject* req, ResDataObject* res)
  807. {
  808. if ((*req).GetFirstOf("Transaction") > 0)
  809. res->update("Transaction", (*req)["Transaction"]);
  810. return true;
  811. }
  812. string PacketAnalizer::GetActionTopic(const char* szDevicePath, const char* szAction)
  813. {
  814. const char* pPath = szDevicePath;
  815. if (szDevicePath[0] == '/')
  816. pPath++;
  817. stringstream strea;
  818. strea << pPath << "/Action/" << szAction;
  819. return strea.str();
  820. }