PacketAnalizer.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. #include "StdAfx.h"
  2. #include <assert.h>
  3. #include "Crc64.h"
  4. #include "Logger.h"
  5. #include "DiosLock.h"
  6. #include "PacketAnalizer.h"
  7. #define CRTDBG_MAP_ALLOC
  8. #include <stdlib.h>
  9. #include <crtdbg.h>
  10. PacketAnalizer::PacketAnalizer(void)
  11. {
  12. }
  13. PacketAnalizer::~PacketAnalizer(void)
  14. {
  15. }
  16. DWORD PacketAnalizer::MakePacketIdx()
  17. {
  18. //static volatile UINT64 g_IdxLock = 0;
  19. //static volatile DWORD oldTick = 1;
  20. //DWORD tick = 0;
  21. //if (Dios_ThreadLock(&g_IdxLock))
  22. //{
  23. // tick = (DWORD)GetTickCount();
  24. // while (tick == 0)
  25. // {
  26. // tick = (DWORD)GetTickCount();
  27. // }
  28. // if (tick == oldTick)
  29. // {
  30. // tick += 1;
  31. // }
  32. // oldTick = tick;
  33. // Dios_ThreadUnLock(&g_IdxLock);
  34. //}
  35. //return tick;
  36. return Thread_GetUniqTick();
  37. }
  38. DWORD PacketAnalizer::GetPacketIdx(ResDataObject *pObj)
  39. {
  40. DWORD ret = 0;
  41. try {
  42. int Idx = (*pObj).GetFirstOf(DIOS_PACK_IDX);
  43. if (Idx >= 0)
  44. {
  45. ret = (*pObj)[DIOS_PACK_IDX];
  46. }
  47. }
  48. catch (ResDataObjectExption &exp)
  49. {
  50. //exp.what()
  51. Logger *p = GetGlobalLogger();
  52. PRINTA_DEBUG(p, exp.what());
  53. }
  54. catch (...)
  55. {
  56. Logger *p = GetGlobalLogger();
  57. PRINTA_DEBUG(p, "Unknown Exp Happened\n");
  58. }
  59. return ret;
  60. }
  61. bool PacketAnalizer::GetDestinationMachineId(ResDataObject &packet, string &machineId)
  62. {
  63. bool ret = false;
  64. try {
  65. //check destination & dispatch
  66. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  67. switch (type)
  68. {
  69. //req:dev bus+proc
  70. case PACKET_TYPE_REQ:
  71. if (PacketAnalizer::GetPacketHandleMachineId(&packet, machineId, true))
  72. {
  73. return true;
  74. }
  75. break;
  76. //res&notify:owner bus+proc
  77. case PACKET_TYPE_RES:
  78. case PACKET_TYPE_NOTIFY:
  79. if (PacketAnalizer::GetPacketHandleMachineId(&packet, machineId, false))
  80. {
  81. return true;
  82. }
  83. break;
  84. default:
  85. break;
  86. }
  87. }
  88. catch (...)
  89. {
  90. }
  91. return ret;
  92. }
  93. bool PacketAnalizer::GetDestinationBusId(ResDataObject &packet, string &busId)
  94. {
  95. bool ret = false;
  96. try {
  97. //check destination & dispatch
  98. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  99. switch (type)
  100. {
  101. //req:dev bus+proc
  102. case PACKET_TYPE_REQ:
  103. if (PacketAnalizer::GetPacketHandleBusId(&packet, busId, true))
  104. {
  105. return true;
  106. }
  107. break;
  108. //res&notify:owner bus+proc
  109. case PACKET_TYPE_RES:
  110. case PACKET_TYPE_NOTIFY:
  111. if (PacketAnalizer::GetPacketHandleBusId(&packet, busId, false))
  112. {
  113. return true;
  114. }
  115. break;
  116. default:
  117. break;
  118. }
  119. }
  120. catch (...)
  121. {
  122. }
  123. return ret;
  124. }
  125. bool PacketAnalizer::GetDestinationProcId(ResDataObject &packet, UINT64 &procId)
  126. {
  127. bool ret = false;
  128. try {
  129. //check destination & dispatch
  130. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  131. switch (type)
  132. {
  133. //req:dev bus+proc
  134. case PACKET_TYPE_REQ:
  135. if (PacketAnalizer::GetPacketHandleProcId(&packet, procId, true))
  136. {
  137. return true;
  138. }
  139. break;
  140. //res&notify:owner bus+proc
  141. case PACKET_TYPE_RES:
  142. case PACKET_TYPE_NOTIFY:
  143. if (PacketAnalizer::GetPacketHandleProcId(&packet, procId, false))
  144. {
  145. return true;
  146. }
  147. break;
  148. default:
  149. break;
  150. }
  151. }
  152. catch (...)
  153. {
  154. }
  155. return ret;
  156. }
  157. PACKET_TYPE PacketAnalizer::GetPacketType(ResDataObject *pObj)
  158. {
  159. int cmd;
  160. PACKET_TYPE ret = PACKET_TYPE_NONE;
  161. try {
  162. cmd = (int)(*pObj)[DIOS_PACK_TYPE];
  163. ret = (PACKET_TYPE)cmd;
  164. if(ret >= 0 && ret < PACKET_TYPE_MAX)
  165. {
  166. return ret;
  167. }
  168. }
  169. catch(ResDataObjectExption &exp)
  170. {
  171. //exp.what()
  172. Logger *p = GetGlobalLogger();
  173. PRINTA_DEBUG(p, exp.what());
  174. }
  175. catch(...)
  176. {
  177. Logger *p = GetGlobalLogger();
  178. PRINTA_DEBUG(p, "Unknown Exp Happened\n");
  179. }
  180. return PACKET_TYPE_NONE;
  181. }
  182. PACKET_CMD PacketAnalizer::GetPacketCmd(ResDataObject *pObj)
  183. {
  184. int cmd;
  185. PACKET_CMD ret = PACKET_CMD_NONE;
  186. try {
  187. cmd = (int)((*pObj)[DIOS_PACK_CMD]);
  188. ret = (PACKET_CMD)cmd;
  189. if(ret >= 0 && ret < PACKET_CMD_MAX)
  190. {
  191. return ret;
  192. }
  193. }
  194. catch (ResDataObjectExption &exp)
  195. {
  196. //exp.what()
  197. Logger *p = GetGlobalLogger();
  198. PRINTA_DEBUG(p, exp.what());
  199. }
  200. catch (...)
  201. {
  202. Logger *p = GetGlobalLogger();
  203. PRINTA_DEBUG(p, "Unknown Exp Happened\n");
  204. }
  205. return PACKET_CMD_NONE;
  206. }
  207. ACTION_SYNC_MODE PacketAnalizer::GetPacketSyncMode(ResDataObject *pObj)
  208. {
  209. ACTION_SYNC_MODE ret = ACTION_SYNC;
  210. try {
  211. ret = (ACTION_SYNC_MODE)(int)(*pObj)[DIOS_PACKET_SYNC];
  212. }
  213. catch (...)
  214. {
  215. ret = ACTION_SYNC;
  216. }
  217. return ret;
  218. }
  219. ResDataObject* PacketAnalizer::GetPacketKeysRes(ResDataObject *pObj)
  220. {
  221. try {
  222. int Idx = (*pObj).GetFirstOf(DIOS_PACK_KEY);
  223. if (Idx >= 0)
  224. {
  225. ResDataObject &Res = (*pObj)[DIOS_PACK_KEY];
  226. return &Res;
  227. }
  228. }
  229. catch (ResDataObjectExption &exp)
  230. {
  231. //exp.what()
  232. Logger *p = GetGlobalLogger();
  233. PRINTA_DEBUG(p, exp.what());
  234. }
  235. catch (...)
  236. {
  237. Logger *p = GetGlobalLogger();
  238. PRINTA_DEBUG(p, "Unknown Exp Happened\n");
  239. }
  240. return NULL;
  241. }
  242. std::string PacketAnalizer::GetPacketKey(ResDataObject *pObj)
  243. {
  244. std::string key = "";
  245. try {
  246. int Idx = (*pObj).GetFirstOf(DIOS_PACK_KEY);
  247. if (Idx >= 0)
  248. {
  249. key = (const char*)(*pObj)[DIOS_PACK_KEY];
  250. }
  251. }
  252. catch (ResDataObjectExption &exp)
  253. {
  254. //exp.what()
  255. Logger *p = GetGlobalLogger();
  256. PRINTA_DEBUG(p, exp.what());
  257. key = "";
  258. }
  259. catch (...)
  260. {
  261. Logger *p = GetGlobalLogger();
  262. PRINTA_DEBUG(p, "Unknown Exp Happened\n");
  263. key = "";
  264. }
  265. return key;
  266. }
  267. bool PacketAnalizer::GetPacketHandleExistance(ResDataObject *pPacket)
  268. {
  269. bool ret = false;
  270. try {
  271. if ((*pPacket).GetFirstOf(DIOS_PACK_HANDLE) >= 0)
  272. {
  273. ret = true;
  274. }
  275. }
  276. catch (...)
  277. {
  278. ret = false;
  279. }
  280. return ret;
  281. }
  282. bool PacketAnalizer::GetPacketHandle(ResDataObject *pPacket,ResDataObject &Handle)
  283. {
  284. bool ret = true;
  285. try {
  286. (Handle) = (*pPacket)[DIOS_PACK_HANDLE];
  287. }
  288. catch(...)
  289. {
  290. ret = false;
  291. }
  292. return ret;
  293. }
  294. bool PacketAnalizer::GetPacketHandleBusId(ResDataObject *pPacket, string &BusId, bool dev)
  295. {
  296. bool ret = true;
  297. try {
  298. if (dev)
  299. {
  300. BusId = (const char *)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_BUSID];
  301. }
  302. else
  303. {
  304. BusId = (const char *)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_OWNERID][DIOS_PACK_TARGET_BUSID];
  305. }
  306. }
  307. catch (...)
  308. {
  309. BusId = "";
  310. ret = false;
  311. }
  312. return ret;
  313. }
  314. bool PacketAnalizer::GetPacketHandleMachineId(ResDataObject *pPacket, string &MachineId, bool dev)
  315. {
  316. bool ret = true;
  317. try {
  318. if (dev)
  319. {
  320. MachineId = (const char *)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_MACHINEID];
  321. }
  322. else
  323. {
  324. MachineId = (const char *)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_OWNERID][DIOS_PACK_TARGET_MACHINEID];
  325. }
  326. }
  327. catch (...)
  328. {
  329. MachineId = "";
  330. ret = false;
  331. }
  332. return ret;
  333. }
  334. bool PacketAnalizer::GetPacketHandleProcId(ResDataObject *pPacket, UINT64 &ProcId, bool dev)
  335. {
  336. bool ret = true;
  337. try {
  338. if (dev)
  339. {
  340. ProcId = (UINT64)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_PROCID];
  341. }
  342. else
  343. {
  344. ProcId = (UINT64)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_OWNERID][DIOS_PACK_TARGET_PROCID];
  345. }
  346. }
  347. catch (...)
  348. {
  349. ProcId = 0;
  350. ret = false;
  351. }
  352. return ret;
  353. }
  354. bool PacketAnalizer::GetPacketHandleCrc(ResDataObject *pPacket, UINT64 &Crc)
  355. {
  356. bool ret = true;
  357. try {
  358. Crc = (UINT64)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACKET_HANDLE_KEY];
  359. }
  360. catch (...)
  361. {
  362. Crc = 0;
  363. ret = false;
  364. }
  365. return ret;
  366. }
  367. bool PacketAnalizer::GetPacketHandleAddr(ResDataObject *pPacket, UINT64 &Addr, bool dev)
  368. {
  369. bool ret = true;
  370. try {
  371. if (dev)
  372. {
  373. Addr = (UINT64)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_ADDR];
  374. }
  375. else
  376. {
  377. Addr = (UINT64)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_OWNERID][DIOS_PACK_TARGET_ADDR];
  378. }
  379. }
  380. catch (...)
  381. {
  382. Addr = 0;
  383. ret = false;
  384. }
  385. return ret;
  386. }
  387. bool PacketAnalizer::MakePacketContextExistance(ResDataObject *pPacket)
  388. {
  389. bool ret = false;
  390. try {
  391. if ((*pPacket).GetFirstOf(DIOS_PACK_CONTEXT) >= 0)
  392. {
  393. ret = true;
  394. }
  395. else
  396. {
  397. (*pPacket).add(DIOS_PACK_CONTEXT, "");
  398. ret = true;
  399. }
  400. }
  401. catch (...)
  402. {
  403. ret = false;
  404. }
  405. return ret;
  406. }
  407. bool PacketAnalizer::GetPacketRoute(ResDataObject *pPacket, DIOS_PACKET_ROUTE &Route)
  408. {
  409. bool ret = true;
  410. Route = DIOS_PACKET_ROUTE_ANY;//ȱʡÉèÖÃÒ»¸öÏÈ
  411. try {
  412. (Route) = (DIOS_PACKET_ROUTE)((int)(*pPacket)[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_ROUTE]);
  413. }
  414. catch (...)
  415. {
  416. ret = false;
  417. }
  418. return ret;
  419. }
  420. bool PacketAnalizer::GetPacketContext(ResDataObject *pPacket,ResDataObject &Context)
  421. {
  422. bool ret = true;
  423. try {
  424. int Idx = (*pPacket).GetFirstOf(DIOS_PACK_CONTEXT);
  425. if (Idx >= 0)
  426. {
  427. (Context) = (*pPacket)[Idx];
  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)[DIOS_PACK_RETURN][DIOS_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)[DIOS_PACK_RETURN].GetFirstOf(DIOS_PACK_MSG);
  454. if (Idx >= 0)
  455. {
  456. (Info) = ((const char*)((*pPacket)[DIOS_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(DIOS_PACK_CODE,(int)retcode);
  469. if(pMsg)
  470. {
  471. SubObj.add(DIOS_PACK_MSG,pMsg);
  472. }
  473. pObj->update(DIOS_PACK_RETURN,SubObj);
  474. }
  475. bool PacketAnalizer::CloneResponse(ResDataObject &Obj,ResDataObject *pReq)
  476. {
  477. Obj.clear();
  478. //Idx
  479. DWORD Idx = PacketAnalizer::GetPacketIdx(pReq);
  480. if (Idx)
  481. {
  482. Obj.add(DIOS_PACK_IDX, Idx);
  483. Obj.add(DIOS_PACK_TYPE, (int)PACKET_TYPE_RES);
  484. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pReq);
  485. if (cmd != PACKET_CMD_NONE)
  486. {
  487. Obj.add(DIOS_PACK_CMD, (int)cmd);
  488. Obj.add(DIOS_PACK_HANDLE, (*pReq)[DIOS_PACK_HANDLE]);
  489. string keystr = PacketAnalizer::GetPacketKey(pReq);
  490. Obj.add(DIOS_PACK_KEY, keystr.c_str());
  491. Obj.add(DIOS_PACK_CONTEXT, "");
  492. return true;
  493. }
  494. }
  495. return false;
  496. }
  497. bool PacketAnalizer::UpdateOpenRequest(ResDataObject &Req, ResDataObject &MachineId, ResDataObject &busId, UINT64 ProcId, UINT64 Addr)
  498. {
  499. try {
  500. Req[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_ADDR] = Addr;
  501. Req[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_PROCID] = ProcId;
  502. Req[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_BUSID] = busId;
  503. Req[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID][DIOS_PACK_TARGET_MACHINEID] = MachineId;
  504. string the_crc = "";
  505. the_crc += Req[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_OWNERID].encode();
  506. the_crc += (const char *)Req[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_DEVID].encode();
  507. std::stringstream strm;
  508. std::string tickstr;
  509. unsigned int Tick = PacketAnalizer::MakePacketIdx();
  510. strm << Tick;
  511. strm >> tickstr;
  512. the_crc += tickstr;
  513. UINT64 crc = GetCrc64(the_crc.c_str(), (DWORD)the_crc.size());
  514. Req[DIOS_PACK_HANDLE][DIOS_PACKET_HANDLE_KEY] = crc;
  515. return true;
  516. }
  517. catch (...)
  518. {
  519. }
  520. return false;
  521. }
  522. bool PacketAnalizer::UpdateDeviceNotifyResponse(ResDataObject &Notify, ResDataObject &MachineId, ResDataObject &busId, UINT64 ProcId, UINT64 Addr)
  523. {
  524. try {
  525. DiosDevFileHandle handle;
  526. handle.GetTarget(false)[DIOS_PACK_TARGET_MACHINEID] = (const char*)MachineId;
  527. handle.GetTarget(false)[DIOS_PACK_TARGET_BUSID] = (const char*)busId;
  528. handle.GetTarget(false)[DIOS_PACK_TARGET_PROCID] = ProcId;
  529. handle.GetTarget(false)[DIOS_PACK_TARGET_ADDR] = Addr;
  530. ResDataObject handleObj;
  531. handle.GetResDataObject(handleObj);
  532. Notify.update(DIOS_PACK_HANDLE, handleObj);
  533. return true;
  534. }
  535. catch (...)
  536. {
  537. }
  538. return false;
  539. }
  540. bool PacketAnalizer::UpdatePacketContext(ResDataObject &packet, ResDataObject &Context)
  541. {
  542. try {
  543. packet[DIOS_PACK_CONTEXT] = Context;
  544. return true;
  545. }
  546. catch (...)
  547. {
  548. }
  549. return false;
  550. }
  551. bool PacketAnalizer::MakeOpenResponse(ResDataObject &Req,ResDataObject &Res,ResDataObject &DevResource)
  552. {
  553. PacketAnalizer::CloneResponse(Res, &Req);
  554. try {
  555. Res.update(DIOS_PACK_CONTEXT,DevResource);
  556. PacketAnalizer::MakeRetCode(RET_SUCCEED, &Res);
  557. return true;
  558. }
  559. catch (...)
  560. {
  561. }
  562. return false;
  563. }
  564. void PacketAnalizer::MakeNotifyP2P(ResDataObject &Obj, PACKET_CMD cmd,ResDataObject *pReq, const char *pKey, const char *pContext)
  565. {
  566. Obj.clear();
  567. Obj.update(DIOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  568. Obj.update(DIOS_PACK_TYPE, (int)PACKET_TYPE_NOTIFY);
  569. Obj.update(DIOS_PACK_CMD, (int)cmd);
  570. Obj.update(DIOS_PACK_HANDLE, (*pReq)[DIOS_PACK_HANDLE]);
  571. Obj.update(DIOS_PACK_KEY, pKey);
  572. Obj.update(DIOS_PACK_CONTEXT, pContext);
  573. }
  574. bool PacketAnalizer::UpdatePacketRoute(ResDataObject &Obj, DIOS_PACKET_ROUTE Route)
  575. {
  576. Obj[DIOS_PACK_HANDLE][DIOS_PACK_HANDLE_ROUTE] = (int)Route;
  577. return true;
  578. }
  579. bool PacketAnalizer::UpdateNotifyHandle(ResDataObject &Obj, DiosDevFileHandle &handle)
  580. {
  581. ResDataObject handleObj;
  582. handle.GetResDataObject(handleObj);
  583. Obj.update(DIOS_PACK_HANDLE, handleObj);
  584. //Obj.update(DIOS_PACK_HANDLE, handle.GetVal());
  585. return true;
  586. }
  587. void PacketAnalizer::MakeNotify(ResDataObject &Obj,PACKET_CMD cmd,const char *pKey,const char *pContext)
  588. {
  589. Obj.clear();
  590. Obj.update(DIOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  591. Obj.update(DIOS_PACK_TYPE, (int)PACKET_TYPE_NOTIFY);
  592. Obj.update(DIOS_PACK_CMD, (int)cmd);
  593. Obj.update(DIOS_PACK_KEY, pKey);
  594. Obj.update(DIOS_PACK_CONTEXT, pContext);
  595. }
  596. void PacketAnalizer::MakeNotify(ResDataObject &Obj, PACKET_CMD cmd, ResDataObject &Key, const ResDataObject &Context)
  597. {
  598. Obj.clear();
  599. Obj.add(DIOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  600. Obj.add(DIOS_PACK_TYPE, (int)PACKET_TYPE_NOTIFY);
  601. Obj.add(DIOS_PACK_CMD, (int)cmd);
  602. Obj.add(DIOS_PACK_KEY, Key);
  603. Obj.add(DIOS_PACK_CONTEXT, (ResDataObject&)Context);
  604. }
  605. void PacketAnalizer::MakeNotify(ResDataObject &Obj, PACKET_CMD cmd, const char *pKey, const ResDataObject &Context)
  606. {
  607. Obj.clear();
  608. Obj.add(DIOS_PACK_IDX, PacketAnalizer::MakePacketIdx());
  609. Obj.add(DIOS_PACK_TYPE, (int)PACKET_TYPE_NOTIFY);
  610. Obj.add(DIOS_PACK_CMD, (int)cmd);
  611. Obj.add(DIOS_PACK_KEY, pKey);
  612. Obj.add(DIOS_PACK_CONTEXT, (ResDataObject&)Context);
  613. }
  614. DWORD PacketAnalizer::MakeActionRequest(ResDataObject &Obj, DiosDevFileHandle &handle, const char *pActionName, ResDataObject &ReqParams, ACTION_SYNC_MODE mode)
  615. {
  616. DWORD tick = PacketAnalizer::MakePacketIdx();
  617. Obj.clear();
  618. Obj.add(DIOS_PACK_IDX, tick);
  619. Obj.add(DIOS_PACK_TYPE,(int)PACKET_TYPE_REQ);
  620. Obj.add(DIOS_PACK_CMD,(int)PACKET_CMD_EXE);
  621. Obj.add(DIOS_PACKET_SYNC, (int)mode);
  622. ResDataObject handleObj;
  623. handle.GetResDataObject(handleObj);
  624. Obj.add(DIOS_PACK_HANDLE, handleObj);
  625. Obj.add(DIOS_PACK_KEY,pActionName);
  626. Obj.add(DIOS_PACK_CONTEXT,ReqParams);
  627. return tick;
  628. }
  629. DWORD PacketAnalizer::MakeOpenRequest(ResDataObject &Obj, DiosDevFileHandle &handle, const char *pFilePath)
  630. {
  631. //ResDataObject TargetObj;
  632. DWORD tick = PacketAnalizer::MakePacketIdx();
  633. Obj.clear();
  634. Obj.add(DIOS_PACK_IDX, tick);
  635. Obj.add(DIOS_PACK_TYPE,(int)PACKET_TYPE_REQ);
  636. Obj.add(DIOS_PACK_CMD,(int)PACKET_CMD_OPEN);
  637. //printf("handle:%s\n", handle.GetVal());
  638. //TargetObj.add(handle.m_Dev.m_MachineID.GetKey(), handle.m_Dev.m_MachineID.GetVal());
  639. ResDataObject handleObj;
  640. handle.GetResDataObject(handleObj);
  641. Obj.add(DIOS_PACK_HANDLE, handleObj);
  642. Obj.add(DIOS_PACK_KEY,pFilePath);
  643. return tick;
  644. }
  645. bool PacketAnalizer::MakeResponseByReq(ResDataObject &Response, ResDataObject &Req,RET_STATUS ret,const char* pInfo)
  646. {
  647. PacketAnalizer::CloneResponse(Response, &Req);
  648. PacketAnalizer::MakeRetCode(ret, &Response, pInfo);
  649. return true;
  650. }
  651. bool PacketAnalizer::MakeCloseNotifyByRes(ResDataObject &Response, ResDataObject &Req)
  652. {
  653. DWORD tick = PacketAnalizer::MakePacketIdx();
  654. Req.clear();
  655. Req.add(DIOS_PACK_IDX, tick);
  656. Req.add(DIOS_PACK_TYPE, (int)PACKET_TYPE_NOTIFY);
  657. Req.add(DIOS_PACK_CMD, (int)PACKET_CMD_CLOSE);
  658. Req.add(DIOS_PACK_HANDLE, Response[DIOS_PACK_HANDLE]);
  659. return true;
  660. }
  661. bool PacketAnalizer::MakeCloseRequestByRes(ResDataObject &Response, ResDataObject &Req)
  662. {
  663. DWORD tick = PacketAnalizer::MakePacketIdx();
  664. Req.clear();
  665. Req.add(DIOS_PACK_IDX, tick);
  666. Req.add(DIOS_PACK_TYPE, (int)PACKET_TYPE_REQ);
  667. Req.add(DIOS_PACK_CMD, (int)PACKET_CMD_CLOSE);
  668. Req.add(DIOS_PACK_HANDLE, Response[DIOS_PACK_HANDLE]);
  669. return true;
  670. }
  671. bool PacketAnalizer::MakeCloseRequest(ResDataObject &Obj, DiosDevFileHandle &handle, PACKET_TYPE Type)
  672. {
  673. DWORD tick = PacketAnalizer::MakePacketIdx();
  674. Obj.clear();
  675. Obj.add(DIOS_PACK_IDX, tick);
  676. Obj.add(DIOS_PACK_TYPE, (int)Type);
  677. Obj.add(DIOS_PACK_CMD,(int)PACKET_CMD_CLOSE);
  678. ResDataObject handleObj;
  679. handle.GetResDataObject(handleObj);
  680. Obj.add(DIOS_PACK_HANDLE, handleObj);
  681. return true;
  682. }
  683. bool PacketAnalizer::MakeCloseResponse(ResDataObject &Req, ResDataObject &Res)
  684. {
  685. PacketAnalizer::CloneResponse(Res, &Req);
  686. PacketAnalizer::MakeRetCode(RET_SUCCEED, &Res);
  687. return true;
  688. }
  689. bool PacketAnalizer::GetParam(ResDataObject *pReq, unsigned int ParamIdx, ResDataObject &value)
  690. {
  691. bool ret = true;
  692. string parami;
  693. std::stringstream strm;
  694. try {
  695. //make p0
  696. strm << "P";
  697. strm << ParamIdx;
  698. strm >> parami;
  699. value = (*pReq)[DIOS_PACK_CONTEXT][parami.c_str()];
  700. }
  701. catch (...)
  702. {
  703. ret = false;
  704. }
  705. return ret;
  706. };
  707. bool PacketAnalizer::AddParam(ResDataObject *pRes, unsigned int ParamIdx, ResDataObject &value)
  708. {
  709. bool ret = true;
  710. string parami;
  711. std::stringstream strm;
  712. try {
  713. //make p0
  714. strm << "P";
  715. strm << ParamIdx;
  716. strm >> parami;
  717. ret = (*pRes)[DIOS_PACK_CONTEXT].add(parami.c_str(), value);
  718. }
  719. catch (...)
  720. {
  721. ret = false;
  722. }
  723. return ret;
  724. }
  725. bool PacketAnalizer::UpdateParam(ResDataObject *pRes, unsigned int ParamIdx, ResDataObject &value)
  726. {
  727. bool ret = true;
  728. string parami;
  729. std::stringstream strm;
  730. try {
  731. //make p0
  732. strm << "P";
  733. strm << ParamIdx;
  734. strm >> parami;
  735. ret = (*pRes)[DIOS_PACK_CONTEXT].update(parami.c_str(), value);
  736. }
  737. catch (...)
  738. {
  739. ret = false;
  740. }
  741. return ret;
  742. }