EntitySessionManager.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. #include "stdafx.h"
  2. #include "MessageType.h"
  3. #include "EntitySessionManager.h"
  4. #include "baseEx.h"
  5. #include<ctime>
  6. #include <string>
  7. #include "../../Other/libpublicFun/publicFunExport.h"
  8. #include "boost/lexical_cast.hpp"
  9. namespace Chromium {
  10. static unsigned int m_global_transid = 0x0F000001; //用于替换来自web的transId,用来和框架进行交互
  11. static unsigned int m_createSession_transId = 0x00F00001; //用于建立本地session,为避免创建的sessionId重复
  12. auto createMapFun = []()->std::map<std::string, int> {
  13. std::map<std::string, int> nullMap;
  14. return nullMap;
  15. };
  16. std::map<std::string, int> EntitySessionManager::m_session_map = createMapFun();
  17. EntitySessionManager::EntitySessionManager() {
  18. m_global_transid = 0x0F000001;
  19. m_createSession_transId = 0x00F00001;
  20. }
  21. EntitySessionManager::~EntitySessionManager() {}
  22. std::pair<bool, int> EntitySessionManager::GetSessionIDByEntityName(std::string entityname) {
  23. auto it = m_session_map.find(entityname);
  24. if (it == m_session_map.end())
  25. return std::make_pair(false, -1); // 发出 StartSession request
  26. return std::make_pair(true, it->second);
  27. }
  28. int EntitySessionManager::MakeNewTransID(CMessage* msg, unsigned int hdlID) {
  29. WSClientReqInfo info;
  30. info.transID = msg->getTransID();
  31. info.hdlID = hdlID;
  32. info.next = NULL;
  33. m_trans_map.insert(std::pair<int, WSClientReqInfo>(m_global_transid, info));
  34. return m_global_transid++;
  35. }
  36. std::pair<bool, int> EntitySessionManager::getSrcTransID(int newTransID)
  37. {
  38. auto tmp = m_trans_map.find(newTransID);
  39. if (tmp != m_trans_map.end())
  40. return std::make_pair(true, tmp->second.transID);
  41. else
  42. {
  43. if ((newTransID & 0xF00000) == false)
  44. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("can not find transId:%d, may be fault", newTransID);
  45. //DbgEx("can not find transId:%d, may be true:%s", newTransID, newTransID & 0xF00000 ? "true" : "false");
  46. return std::make_pair(false, 0);
  47. }
  48. }
  49. void EntitySessionManager::StoreSessionReq(int transID, std::string entityName) {
  50. if(entityName.length() > 0)
  51. m_session_ack_map.insert(std::pair<int, std::string>(transID, entityName));
  52. }
  53. std::vector<std::string> EntitySessionManager::queryUnLinkSession()
  54. {
  55. std::vector<std::string> ret;
  56. #if (defined _WIN32 || defined _WIN64)
  57. for each (auto it in m_session_map)
  58. #else
  59. for (auto it : m_session_map)
  60. #endif
  61. {
  62. if (it.second == -1)
  63. ret.emplace_back(it.first);
  64. }
  65. return ret;
  66. }
  67. std::map<std::string, int> EntitySessionManager::queryAllSessionInfo()
  68. {
  69. return m_session_map;
  70. }
  71. WSClientReqInfo* EntitySessionManager::ReduceOriginTransID(CMessage* msg) {//获取transId对应的连接
  72. int tansId = msg->getTransID();
  73. std::map<int, WSClientReqInfo>::iterator it = m_trans_map.find(tansId);
  74. if (it == m_trans_map.end())
  75. return NULL;
  76. return &(it->second);
  77. }
  78. void EntitySessionManager::RemoveAckListNode(int transid) {
  79. std::map<int, WSClientReqInfo>::iterator it = m_trans_map.find(transid);
  80. if (it == m_trans_map.end())
  81. return;
  82. m_trans_map.erase(it);
  83. return;
  84. }
  85. RequestProcessType EntitySessionManager::RequestProcess(CMessage* msg, std::string entityName, unsigned int hdlID) {
  86. if (msg == NULL)
  87. return PROCESS_NOTHING;
  88. RequestProcessType ret = PROCESS_NOTHING;
  89. switch (msg->getMessageType() & 0x0000FFFF) {
  90. case MessageType::Info:
  91. ret = ProcessWithInfo(msg, entityName, hdlID);
  92. break;
  93. case MessageType::BeginSession:
  94. ret = ProcessWithBeginSession(msg, entityName, hdlID);
  95. break;
  96. case MessageType::EndSession:
  97. ret = ProcessWithEndSession(msg, entityName, hdlID);
  98. break;
  99. case MessageType::Request:
  100. ret = ProcessWithRequest(msg, entityName, hdlID);
  101. break;
  102. case MessageType::Register:
  103. ret = ProcessWithRegister(msg, entityName, hdlID);
  104. break;
  105. case MessageType::Unregister:
  106. ret = ProcessWithUnregister(msg, entityName, hdlID);
  107. break;
  108. case MessageType::Event:
  109. ret = PROCESS_SEND;
  110. break;
  111. case MessageType::LogEventMsgType:
  112. ret = PROCESS_SEND;
  113. break;
  114. case MessageType::LogWarnMsgType:
  115. return PROCESS_SEND;
  116. case MessageType::SetVarReq:
  117. ret = ProcessWithSetVarReq(msg, entityName, hdlID);
  118. break;
  119. case MessageType::GetVarReq:
  120. ret = ProcessWithGetVarReq(msg, entityName, hdlID);
  121. break;
  122. case MessageType::Broadcast:
  123. return PROCESS_NOTHING;
  124. default:
  125. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::RequestProcess switch default!");
  126. ret = PROCESS_NOTHING;
  127. }
  128. int srcTransId = msg->getTransID();
  129. StoreSessionReq(srcTransId, entityName);
  130. if (MessageType::Request == (msg->getMessageType() & 0x0000FFFF))
  131. msg->exchangeSessionIdAndTransId();
  132. return ret;
  133. }
  134. RequestProcessType EntitySessionManager::ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID) {
  135. auto it = m_session_map.find(entityName);
  136. if (it == m_session_map.end() || -1 == it->second)
  137. {
  138. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no session found for entity : %s", UtfToGbk(entityName.c_str()).c_str());
  139. return PROCESS_STARTSESSION;
  140. }
  141. msg->setSessionID(it->second, false);
  142. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithInfo, replace sessionID:%d", it->second);
  143. return PROCESS_SEND;
  144. }
  145. void EntitySessionManager::updateBeginSessionTime(std::string entityName, bool doCleanSessionTime)
  146. {
  147. time_t now_time = doCleanSessionTime ? 0 : time(NULL); //doCleanSessionTime 会重置记录时间为0,5s内重复发起的beginSession能被接受
  148. auto curSession = t_BeginSessionTime.find(entityName);
  149. if (curSession == t_BeginSessionTime.end())
  150. t_BeginSessionTime.insert(std::make_pair(entityName, now_time));
  151. else
  152. curSession->second = now_time;
  153. //DbgEx("save BeginSession Time:%s, %d", entityName.c_str(), now_time);
  154. }
  155. bool EntitySessionManager::checkBeginSession(std::string entityName)
  156. {
  157. time_t now_time = time(NULL);
  158. auto curSession = t_BeginSessionTime.find(entityName);
  159. if (curSession == t_BeginSessionTime.end() || curSession->second < now_time - 5)
  160. {
  161. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("checkBeginSession record begin session msg, oldTime:%lld, newTime:%lld", curSession != t_BeginSessionTime.end() ? curSession->second : -1, now_time);
  162. return true;//5s内不重复发起session
  163. }
  164. else
  165. return false;
  166. }
  167. RequestProcessType EntitySessionManager::ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID) {
  168. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithBeginSession");
  169. auto s = GetSessionIDByEntityName(entityName);
  170. if (s.first && -1 != s.second)
  171. return PROCESS_FINDSESSION;
  172. if (checkBeginSession(entityName))
  173. {
  174. // 换transID 发送beginsession
  175. int transID = MakeNewTransID(msg, hdlID);
  176. msg->setTransID(transID);
  177. updateBeginSessionTime(entityName);
  178. return PROCESS_SEND;
  179. }
  180. else
  181. return PROCESS_RECORDMSG;//5s内发起过session
  182. }
  183. RequestProcessType EntitySessionManager::ProcessWithEndSession(CMessage* msg, std::string entityName,
  184. unsigned int hdlID) {
  185. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithEndSession");
  186. return PROCESS_NOTHING;
  187. }
  188. RequestProcessType EntitySessionManager::ProcessWithRequest(CMessage* msg, std::string entityName,
  189. unsigned int hdlID) {
  190. auto it = m_session_map.find(entityName);
  191. if (it == m_session_map.end() || -1 == it->second)
  192. {
  193. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("no session found for entity : %s", UtfToGbk(entityName.c_str()).c_str());
  194. return PROCESS_STARTSESSION;
  195. }
  196. msg->setSessionID(it->second, true);
  197. auto transId = MakeNewTransID(msg, hdlID);
  198. msg->setTransID(transId);
  199. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRequest, replace sessionID:%d, replace transId:%d", it->second, transId);
  200. return PROCESS_SEND;
  201. }
  202. RequestProcessType EntitySessionManager::ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID) {
  203. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister");
  204. auto _broadcast_it = m_broadcast_map.find(entityName);
  205. if (_broadcast_it == m_broadcast_map.end())
  206. {
  207. // 尚未有客户端订阅过
  208. int transid = MakeNewTransID(msg, hdlID);
  209. msg->setTransID(transid);
  210. m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
  211. return PROCESS_SEND;
  212. }
  213. std::map<int, WSClientReqInfo>::iterator _trans_it = m_trans_map.find(_broadcast_it->second);
  214. if (_trans_it == m_trans_map.end())
  215. {
  216. // 尚未有客户端订阅过
  217. int transid = MakeNewTransID(msg, hdlID);
  218. msg->setTransID(transid);
  219. m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
  220. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister %s first register, send", entityName.c_str());
  221. return PROCESS_SEND;
  222. }
  223. // 已经有过订阅 在链表后加
  224. WSClientReqInfo* pNode = &_trans_it->second;
  225. if (pNode->hdlID == hdlID)
  226. {
  227. // 该客户端订阅过,避免重复订阅
  228. return PROCESS_NOTHING;
  229. }
  230. while (pNode->next != NULL) {
  231. if (pNode->hdlID == hdlID)
  232. {
  233. // 该客户端订阅过,避免重复订阅
  234. return PROCESS_NOTHING;
  235. }
  236. pNode = pNode->next;
  237. }
  238. // 该客户端从未订阅过
  239. pNode->next = new WSClientReqInfo();
  240. pNode->next->next = NULL;
  241. pNode->next->hdlID = hdlID;
  242. pNode->next->transID = msg->getTransID();
  243. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)
  244. ("EntitySessionManager::ProcessWithRegister %s already register, add hdl %d", entityName.c_str(), hdlID);
  245. return PROCESS_NOTHING;
  246. }
  247. RequestProcessType EntitySessionManager::ProcessWithUnregister(CMessage* msg, std::string entityName,
  248. unsigned int hdlID) {
  249. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithUnregister");
  250. std::map<std::string, int>::iterator _broadcast_it = m_broadcast_map.find(entityName);
  251. if (_broadcast_it == m_broadcast_map.end())
  252. {
  253. // 没订阅过 不用反注册
  254. return PROCESS_NOTHING;
  255. }
  256. // 订阅过 找到对应的客户端节点 删掉
  257. std::map<int, WSClientReqInfo>::iterator _trans_it = m_trans_map.find(_broadcast_it->second);
  258. if (_trans_it == m_trans_map.end())
  259. {
  260. // 没找到对应transid 理论上不可能
  261. m_broadcast_map.erase(_broadcast_it);
  262. return PROCESS_NOTHING;
  263. }
  264. // 查找节点删掉
  265. WSClientReqInfo* pNode = &_trans_it->second;
  266. if (pNode->hdlID == hdlID)
  267. {
  268. // 找到了就删掉
  269. if (pNode->next == NULL)
  270. {
  271. // 只有一个节点 就全都删掉
  272. m_trans_map.erase(_trans_it);
  273. m_broadcast_map.erase(_broadcast_it);
  274. return PROCESS_SEND;
  275. }
  276. // 后面有其他节点
  277. WSClientReqInfo* tp = pNode->next;
  278. pNode->transID = tp->transID;
  279. pNode->hdlID = tp->hdlID;
  280. pNode->next = tp->next;
  281. free(tp);
  282. return PROCESS_NOTHING;
  283. }
  284. // 首个节点不匹配时
  285. WSClientReqInfo* pHead = pNode;
  286. pNode = pNode->next;
  287. while (pNode != NULL) {
  288. if (pNode->hdlID == hdlID)
  289. {
  290. pHead->next = pNode->next;
  291. free(pNode);
  292. return PROCESS_NOTHING;
  293. }
  294. pHead = pNode;
  295. pNode = pNode->next;
  296. }
  297. return PROCESS_NOTHING;
  298. }
  299. RequestProcessType EntitySessionManager::ProcessWithSetVarReq(CMessage* msg, std::string entityName,
  300. unsigned int hdlID) {
  301. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithSetVarReq");
  302. msg->setTransID(MakeNewTransID(msg, hdlID));
  303. return PROCESS_SEND;
  304. }
  305. RequestProcessType EntitySessionManager::ProcessWithGetVarReq(CMessage* msg, std::string entityName,
  306. unsigned int hdlID) {
  307. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithGetVarReq");
  308. msg->setTransID(MakeNewTransID(msg, hdlID));
  309. return PROCESS_SEND;
  310. }
  311. std::pair<int, std::string> EntitySessionManager::GetStartSessionRequest(std::string entityname, std::string className) {
  312. auto curSession = m_createSession_transId++;
  313. std::string js = "{\"messageType\":1,\"transID\":" + std::to_string((LONGLONG)curSession) + ",\"functionName\":\"\",\"entity\":\"";
  314. js.append(entityname.append("\",\"class\":\""));
  315. js.append(className.append("\"}"));
  316. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start sessionRequest: %s", UtfToGbk(js.c_str()).c_str());
  317. return std::make_pair(curSession, js);
  318. }
  319. std::pair<int, std::string> EntitySessionManager::GetAllSessionRequest(int transId, bool isInitCfg)
  320. {
  321. std::map<std::string, std::string> sessionInfo;
  322. #if (defined _WIN32 || defined _WIN64)
  323. for each (auto it in m_session_map)
  324. #else
  325. for (auto it : m_session_map)
  326. #endif
  327. {
  328. if (it.second > 0)
  329. sessionInfo.insert(std::make_pair(it.first, boost::lexical_cast<std::string>(it.second)));
  330. }
  331. auto sessionJson = generateJsonStr(sessionInfo);
  332. if (sessionJson.first)
  333. {
  334. char sessionJs[10240] = "";
  335. sprintf(sessionJs, "{\"messageType\":%d,\"transID\":%d,\"InitCfg\":%d,\"%s\":%s}", 16, transId, isInitCfg, PARAMLIST_HEAD, sessionJson.second.c_str());
  336. return std::make_pair(true, sessionJs);
  337. }
  338. return std::make_pair(false, "error generateJsonStr");
  339. }
  340. std::string EntitySessionManager::GetStartSessionAck(CMessage* msg, std::string entityname) {
  341. auto s = GetSessionIDByEntityName(entityname);
  342. std::string sessionId = std::to_string((LONGLONG)s.second);
  343. std::string transid = std::to_string((LONGLONG)msg->getTransID());
  344. std::string js = "{\"messageType\":5,\"errorCode\":\"\",\"errorMsg\":\"\",\"sessionID\":";
  345. js.append(sessionId.c_str());
  346. js.append(",\"transID\":");
  347. js.append(transid.c_str());
  348. js.append("}");
  349. return js;
  350. }
  351. std::string EntitySessionManager::UpdateSessionMap(int transid, int sessionId)
  352. {
  353. auto it = m_session_ack_map.find(transid);
  354. if (it == m_session_ack_map.end())
  355. return "";
  356. DoSessionUpdate(it->second, sessionId);
  357. return it->second;
  358. }
  359. EntitySessionManager& EntitySessionManager::DoSessionUpdate(std::string entityname, int session)
  360. {
  361. auto sessionIt = m_session_map.find(entityname);
  362. if(m_session_map.end() != sessionIt)
  363. {
  364. if (sessionIt->second == session)
  365. return *this;//相等不处理
  366. else if(sessionIt->second == -1 || session == -1)
  367. {
  368. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("update sessionId(regenerate):<%s><%d>", entityname.c_str(), session);
  369. m_session_map.erase(sessionIt);
  370. m_session_map.insert(std::make_pair(entityname, session));
  371. }
  372. else
  373. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("session Error(src:%d), do not update sessionId:<%s><%d>", sessionIt->second, entityname.c_str(), session);
  374. }
  375. else
  376. m_session_map.insert(std::make_pair(entityname, session));//not exist
  377. return *this;
  378. }
  379. AckProcessType EntitySessionManager::ProcessWithAck(CMessage* msg, unsigned int& hdlID) {
  380. int globalID = msg->getTransID();
  381. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  382. if (NULL == p)
  383. return ACKPROCESS_NOTHING;// 异常 应该不会有这种情况出现
  384. hdlID = p->hdlID;
  385. UpdateSessionMap(globalID, msg->getSessionID());
  386. if (hdlID == 0) {
  387. return ACKPROCESS_NOTHING;
  388. }
  389. return ACKPROCESS_SEND;
  390. }
  391. std::pair<bool, std::string> EntitySessionManager::DoSessionRemove(unsigned int session)
  392. {
  393. #if (defined _WIN32 || defined _WIN64)
  394. for each (auto it in m_session_map)
  395. #else
  396. for (auto it : m_session_map)
  397. #endif
  398. {
  399. if (it.second == session)
  400. {
  401. DoSessionUpdate(it.first, -1);
  402. return std::make_pair(true, it.first);
  403. }
  404. }
  405. return std::make_pair(false, "");
  406. }
  407. std::pair<AckProcessType, std::string> EntitySessionManager::AskProcessSession(CMessage* msg, unsigned int& hdlID) {
  408. int globalID = msg->getTransID();
  409. /*
  410. 替换真实的transId
  411. */
  412. if (globalID & 0xF00000)
  413. hdlID = 0; ////本地transId,无记录的链接
  414. else
  415. {
  416. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  417. if (NULL == p)
  418. return std::make_pair(ACKPROCESS_NOTHING, "can not find WSClient!");// 异常 应该不会有这种情况出现
  419. msg->setTransID(p->transID);
  420. hdlID = p->hdlID;
  421. }
  422. auto sessionId = msg->getSessionID();
  423. auto entityName = UpdateSessionMap(globalID, sessionId);
  424. if ("" == entityName)
  425. return std::make_pair(ACKPROCESS_NOTHING, "Update SessionMap error!");
  426. updateBeginSessionTime(entityName, -1 == sessionId); //clean the begin Sessiontime
  427. return std::make_pair(ACKPROCESS_SEND, entityName);
  428. }
  429. void EntitySessionManager::doWithErrorCode(int errorCode, int transId)
  430. {
  431. switch (errorCode)
  432. {
  433. case Error_Break:
  434. case Error_MethodNotFound:
  435. case Error_MethodSignatureFailed:
  436. UpdateSessionMap(transId, -1);
  437. break;
  438. default:
  439. break;
  440. }
  441. }
  442. AckProcessType EntitySessionManager::ProcessWithRecvEvent(CMessage* msg, unsigned int& hdlID) {
  443. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  444. if (NULL == p)
  445. return ACKPROCESS_NOTHING;// 异常 应该不会有这种情况出现
  446. msg->setTransID(p->transID);
  447. hdlID = p->hdlID;
  448. if (hdlID == 0) {
  449. return ACKPROCESS_NOTHING;
  450. }
  451. return ACKPROCESS_SEND;
  452. }
  453. AckProcessType EntitySessionManager::AskProcessEvent(CMessage* msg, std::vector<std::pair<int, int>>& transIdandHdlIDArr)
  454. {
  455. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  456. if (NULL == p)
  457. return ACKPROCESS_NOTHING;
  458. transIdandHdlIDArr.clear();
  459. while (NULL != p)
  460. {
  461. if (0 != p->transID)
  462. transIdandHdlIDArr.emplace_back(std::make_pair(p->transID, p->hdlID));
  463. p = p->next;
  464. }
  465. if (transIdandHdlIDArr.size() > 0)
  466. return ACKPROCESS_SEND;
  467. else
  468. return ACKPROCESS_NOTHING;
  469. }
  470. AckProcessType EntitySessionManager::AckProcess(CMessage* msg, unsigned int& hdlID) {
  471. AckProcessType ret = ACKPROCESS_NOTHING;
  472. switch (msg->getMessageType()) {
  473. case MessageType::Event:
  474. ProcessWithRecvEvent(msg, hdlID);
  475. break;
  476. case MessageType::SessionAck:
  477. case MessageType::RequestAck:
  478. case MessageType::GetVarAck:
  479. case MessageType::SetVarAck:
  480. ProcessWithAck(msg, hdlID);
  481. break;
  482. default:
  483. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("AckProcess default!");
  484. ret = ACKPROCESS_NOTHING;
  485. }
  486. return ret;
  487. }
  488. }