EntitySessionManager.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  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 Info:
  91. ret = ProcessWithInfo(msg, entityName, hdlID);
  92. break;
  93. case BeginSession:
  94. ret = ProcessWithBeginSession(msg, entityName, hdlID);
  95. break;
  96. case EndSession:
  97. ret = ProcessWithEndSession(msg, entityName, hdlID);
  98. break;
  99. case Request:
  100. ret = ProcessWithRequest(msg, entityName, hdlID);
  101. break;
  102. case Register:
  103. ret = ProcessWithRegister(msg, entityName, hdlID);
  104. break;
  105. case Unregister:
  106. ret = ProcessWithUnregister(msg, entityName, hdlID);
  107. break;
  108. case Event:
  109. ret = PROCESS_SEND;
  110. break;
  111. case LogEventMsgType:
  112. ret = PROCESS_SEND;
  113. break;
  114. case LogWarnMsgType:
  115. return PROCESS_SEND;
  116. case SetVarReq:
  117. ret = ProcessWithSetVarReq(msg, entityName, hdlID);
  118. break;
  119. case GetVarReq:
  120. ret = ProcessWithGetVarReq(msg, entityName, hdlID);
  121. break;
  122. case 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 (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. return PROCESS_SEND;
  221. }
  222. // 已经有过订阅 在链表后加
  223. WSClientReqInfo* pNode = &_trans_it->second;
  224. if (pNode->hdlID == hdlID)
  225. {
  226. // 该客户端订阅过,避免重复订阅
  227. return PROCESS_NOTHING;
  228. }
  229. while (pNode->next != NULL) {
  230. if (pNode->hdlID == hdlID)
  231. {
  232. // 该客户端订阅过,避免重复订阅
  233. return PROCESS_NOTHING;
  234. }
  235. pNode = pNode->next;
  236. }
  237. // 该客户端从未订阅过
  238. pNode->next = new WSClientReqInfo();
  239. pNode->next->next = NULL;
  240. pNode->next->hdlID = hdlID;
  241. pNode->next->transID = msg->getTransID();
  242. return PROCESS_NOTHING;
  243. }
  244. RequestProcessType EntitySessionManager::ProcessWithUnregister(CMessage* msg, std::string entityName,
  245. unsigned int hdlID) {
  246. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithUnregister");
  247. std::map<std::string, int>::iterator _broadcast_it = m_broadcast_map.find(entityName);
  248. if (_broadcast_it == m_broadcast_map.end())
  249. {
  250. // 没订阅过 不用反注册
  251. return PROCESS_NOTHING;
  252. }
  253. // 订阅过 找到对应的客户端节点 删掉
  254. std::map<int, WSClientReqInfo>::iterator _trans_it = m_trans_map.find(_broadcast_it->second);
  255. if (_trans_it == m_trans_map.end())
  256. {
  257. // 没找到对应transid 理论上不可能
  258. m_broadcast_map.erase(_broadcast_it);
  259. return PROCESS_NOTHING;
  260. }
  261. // 查找节点删掉
  262. WSClientReqInfo* pNode = &_trans_it->second;
  263. if (pNode->hdlID == hdlID)
  264. {
  265. // 找到了就删掉
  266. if (pNode->next == NULL)
  267. {
  268. // 只有一个节点 就全都删掉
  269. m_trans_map.erase(_trans_it);
  270. m_broadcast_map.erase(_broadcast_it);
  271. return PROCESS_SEND;
  272. }
  273. // 后面有其他节点
  274. WSClientReqInfo* tp = pNode->next;
  275. pNode->transID = tp->transID;
  276. pNode->hdlID = tp->hdlID;
  277. pNode->next = tp->next;
  278. free(tp);
  279. return PROCESS_NOTHING;
  280. }
  281. // 首个节点不匹配时
  282. WSClientReqInfo* pHead = pNode;
  283. pNode = pNode->next;
  284. while (pNode != NULL) {
  285. if (pNode->hdlID == hdlID)
  286. {
  287. pHead->next = pNode->next;
  288. free(pNode);
  289. return PROCESS_NOTHING;
  290. }
  291. pHead = pNode;
  292. pNode = pNode->next;
  293. }
  294. return PROCESS_NOTHING;
  295. }
  296. RequestProcessType EntitySessionManager::ProcessWithSetVarReq(CMessage* msg, std::string entityName,
  297. unsigned int hdlID) {
  298. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithSetVarReq");
  299. msg->setTransID(MakeNewTransID(msg, hdlID));
  300. return PROCESS_SEND;
  301. }
  302. RequestProcessType EntitySessionManager::ProcessWithGetVarReq(CMessage* msg, std::string entityName,
  303. unsigned int hdlID) {
  304. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithGetVarReq");
  305. msg->setTransID(MakeNewTransID(msg, hdlID));
  306. return PROCESS_SEND;
  307. }
  308. std::pair<int, std::string> EntitySessionManager::GetStartSessionRequest(std::string entityname, std::string className) {
  309. auto curSession = m_createSession_transId++;
  310. std::string js = "{\"messageType\":1,\"transID\":" + std::to_string((LONGLONG)curSession) + ",\"functionName\":\"\",\"entity\":\"";
  311. js.append(entityname.append("\",\"class\":\""));
  312. js.append(className.append("\"}"));
  313. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start sessionRequest: %s", UtfToGbk(js.c_str()).c_str());
  314. return std::make_pair(curSession, js);
  315. }
  316. std::pair<int, std::string> EntitySessionManager::GetAllSessionRequest(int transId)
  317. {
  318. std::map<std::string, std::string> sessionInfo;
  319. #if (defined _WIN32 || defined _WIN64)
  320. for each (auto it in m_session_map)
  321. #else
  322. for (auto it : m_session_map)
  323. #endif
  324. {
  325. if (it.second > 0)
  326. sessionInfo.insert(std::make_pair(it.first, boost::lexical_cast<std::string>(it.second)));
  327. }
  328. auto sessionJson = generateJsonStr(sessionInfo);
  329. if (sessionJson.first)
  330. {
  331. char sessionJs[10240] = "";
  332. sprintf(sessionJs, "{\"messageType\":%d,\"transID\":%d,\"InitCfg\":%d,\"%s\":%s}", 16, transId, g_hasInitCfg, PARAMLIST_HEAD, sessionJson.second.c_str());
  333. return std::make_pair(true, sessionJs);
  334. }
  335. return std::make_pair(false, "error generateJsonStr");
  336. }
  337. std::string EntitySessionManager::GetStartSessionAck(CMessage* msg, std::string entityname) {
  338. auto s = GetSessionIDByEntityName(entityname);
  339. std::string sessionId = std::to_string((LONGLONG)s.second);
  340. std::string transid = std::to_string((LONGLONG)msg->getTransID());
  341. std::string js = "{\"messageType\":5,\"errorCode\":\"\",\"errorMsg\":\"\",\"sessionID\":";
  342. js.append(sessionId.c_str());
  343. js.append(",\"transID\":");
  344. js.append(transid.c_str());
  345. js.append("}");
  346. return js;
  347. }
  348. std::string EntitySessionManager::UpdateSessionMap(int transid, int sessionId)
  349. {
  350. auto it = m_session_ack_map.find(transid);
  351. if (it == m_session_ack_map.end())
  352. return "";
  353. DoSessionUpdate(it->second, sessionId);
  354. return it->second;
  355. }
  356. EntitySessionManager& EntitySessionManager::DoSessionUpdate(std::string entityname, int session)
  357. {
  358. auto sessionIt = m_session_map.find(entityname);
  359. if(m_session_map.end() != sessionIt)
  360. {
  361. if (sessionIt->second == session)
  362. return *this;//相等不处理
  363. else if(sessionIt->second == -1 || session == -1)
  364. {
  365. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("update sessionId(regenerate):<%s><%d>", entityname.c_str(), session);
  366. m_session_map.erase(sessionIt);
  367. m_session_map.insert(std::make_pair(entityname, session));
  368. }
  369. else
  370. 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);
  371. }
  372. else
  373. m_session_map.insert(std::make_pair(entityname, session));//not exist
  374. return *this;
  375. }
  376. AckProcessType EntitySessionManager::ProcessWithAck(CMessage* msg, unsigned int& hdlID) {
  377. int globalID = msg->getTransID();
  378. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  379. if (NULL == p)
  380. return ACKPROCESS_NOTHING;// 异常 应该不会有这种情况出现
  381. hdlID = p->hdlID;
  382. UpdateSessionMap(globalID, msg->getSessionID());
  383. if (hdlID == 0) {
  384. return ACKPROCESS_NOTHING;
  385. }
  386. return ACKPROCESS_SEND;
  387. }
  388. std::pair<bool, std::string> EntitySessionManager::DoSessionRemove(unsigned int session)
  389. {
  390. #if (defined _WIN32 || defined _WIN64)
  391. for each (auto it in m_session_map)
  392. #else
  393. for (auto it : m_session_map)
  394. #endif
  395. {
  396. if (it.second == session)
  397. {
  398. DoSessionUpdate(it.first, -1);
  399. return std::make_pair(true, it.first);
  400. }
  401. }
  402. return std::make_pair(false, "");
  403. }
  404. std::pair<AckProcessType, std::string> EntitySessionManager::AskProcessSession(CMessage* msg, unsigned int& hdlID) {
  405. int globalID = msg->getTransID();
  406. /*
  407. 替换真实的transId
  408. */
  409. if (globalID & 0xF00000)
  410. hdlID = 0; ////本地transId,无记录的链接
  411. else
  412. {
  413. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  414. if (NULL == p)
  415. return std::make_pair(ACKPROCESS_NOTHING, "can not find WSClient!");// 异常 应该不会有这种情况出现
  416. msg->setTransID(p->transID);
  417. hdlID = p->hdlID;
  418. }
  419. auto sessionId = msg->getSessionID();
  420. auto entityName = UpdateSessionMap(globalID, sessionId);
  421. if ("" == entityName)
  422. return std::make_pair(ACKPROCESS_NOTHING, "Update SessionMap error!");
  423. updateBeginSessionTime(entityName, -1 == sessionId); //clean the begin Sessiontime
  424. return std::make_pair(ACKPROCESS_SEND, entityName);
  425. }
  426. void EntitySessionManager::doWithErrorCode(int errorCode, int transId)
  427. {
  428. switch (errorCode)
  429. {
  430. case Error_Break:
  431. case Error_MethodNotFound:
  432. case Error_MethodSignatureFailed:
  433. UpdateSessionMap(transId, -1);
  434. break;
  435. default:
  436. break;
  437. }
  438. }
  439. AckProcessType EntitySessionManager::ProcessWithRecvEvent(CMessage* msg, unsigned int& hdlID) {
  440. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  441. if (NULL == p)
  442. return ACKPROCESS_NOTHING;// 异常 应该不会有这种情况出现
  443. msg->setTransID(p->transID);
  444. hdlID = p->hdlID;
  445. if (hdlID == 0) {
  446. return ACKPROCESS_NOTHING;
  447. }
  448. return ACKPROCESS_SEND;
  449. }
  450. AckProcessType EntitySessionManager::AskProcessEvent(CMessage* msg, std::vector<std::pair<int, int>>& transIdandHdlIDArr)
  451. {
  452. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  453. if (NULL == p)
  454. return ACKPROCESS_NOTHING;
  455. transIdandHdlIDArr.clear();
  456. while (NULL != p)
  457. {
  458. if (0 != p->transID)
  459. transIdandHdlIDArr.emplace_back(std::make_pair(p->transID, p->hdlID));
  460. p = p->next;
  461. }
  462. if (transIdandHdlIDArr.size() > 0)
  463. return ACKPROCESS_SEND;
  464. else
  465. return ACKPROCESS_NOTHING;
  466. }
  467. AckProcessType EntitySessionManager::AckProcess(CMessage* msg, unsigned int& hdlID) {
  468. AckProcessType ret = ACKPROCESS_NOTHING;
  469. switch (msg->getMessageType()) {
  470. case Event:
  471. ProcessWithRecvEvent(msg, hdlID);
  472. break;
  473. case SessionAck:
  474. case RequestAck:
  475. case GetVarAck:
  476. case SetVarAck:
  477. ProcessWithAck(msg, hdlID);
  478. break;
  479. default:
  480. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("AckProcess default!");
  481. ret = ACKPROCESS_NOTHING;
  482. }
  483. return ret;
  484. }
  485. }