EntitySessionManager.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  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, const ws_msgInfo& msgInfo) {
  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, msgInfo);
  92. break;
  93. case MessageType::BeginSession:
  94. ret = ProcessWithBeginSession(msg, entityName, hdlID, msgInfo);
  95. break;
  96. case MessageType::EndSession:
  97. ret = ProcessWithEndSession(msg, entityName, hdlID);
  98. break;
  99. case MessageType::Request:
  100. ret = ProcessWithRequest(msg, entityName, hdlID, msgInfo);
  101. break;
  102. case MessageType::Register:
  103. ret = ProcessWithRegister(msg, entityName, hdlID, msgInfo);
  104. break;
  105. case MessageType::Unregister:
  106. ret = ProcessWithUnregister(msg, entityName, hdlID);
  107. break;
  108. case MessageType::Event://receive
  109. ret = PROCESS_SEND;
  110. break;
  111. case MessageType::LogEventMsgType:
  112. /*
  113. do not print
  114. "eventCode": 1074790401,
  115. "message": "RvcCore MouseOperation onClick",
  116. "operate": "send",
  117. "payload": "{\"messageType\":9,\"securityLevel\":2,\"eventCode\":1074790401,\"message\":\"RvcCore MouseOperation onClick\"}",
  118. */
  119. if(msgInfo.eventCode != 0x40100001)
  120. LogManager::getInstance().logWsLogEvent(msgInfo.hdlId, msgInfo.securityLevel, msgInfo.eventCode, msgInfo.message, 0, "send", msgInfo.payLoad);
  121. ret = PROCESS_SEND;
  122. break;
  123. case MessageType::LogWarnMsgType:
  124. LogManager::getInstance().logWsLogWarn(msgInfo.hdlId, msgInfo.securityLevel, msgInfo.eventCode, msgInfo.message, 0, "send", msgInfo.payLoad);
  125. return PROCESS_SEND;
  126. case MessageType::SetVarReq:
  127. ret = ProcessWithSetVarReq(msg, entityName, hdlID, msgInfo);
  128. break;
  129. case MessageType::GetVarReq:
  130. ret = ProcessWithGetVarReq(msg, entityName, hdlID, msgInfo);
  131. break;
  132. case MessageType::Broadcast:
  133. return PROCESS_NOTHING;
  134. default:
  135. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::RequestProcess switch default!");
  136. ret = PROCESS_NOTHING;
  137. }
  138. int srcTransId = msg->getTransID();
  139. StoreSessionReq(srcTransId, entityName);
  140. if (MessageType::Request == (msg->getMessageType() & 0x0000FFFF))
  141. msg->exchangeSessionIdAndTransId();
  142. return ret;
  143. }
  144. RequestProcessType EntitySessionManager::ProcessWithInfo(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
  145. auto it = m_session_map.find(entityName);
  146. if (it == m_session_map.end() || -1 == it->second)
  147. {
  148. LogManager::getInstance().logWebSocketInfo(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.functionName, 1,
  149. "startSession", Error_NoTarget, "no session found", msgInfo.payLoad);
  150. return PROCESS_STARTSESSION;
  151. }
  152. msg->setSessionID(it->second, false);
  153. LogManager::getInstance().logWebSocketInfo(hdlID, msgInfo.transId, it->second, msgInfo.entityName, msgInfo.functionName, (msgInfo.warnMsg.length() ==0 ? 0 : 1),
  154. "send", 0, msgInfo.warnMsg, msgInfo.payLoad);
  155. return PROCESS_SEND;
  156. }
  157. void EntitySessionManager::updateBeginSessionTime(std::string entityName, bool doCleanSessionTime)
  158. {
  159. time_t now_time = doCleanSessionTime ? 0 : time(NULL); //doCleanSessionTime 会重置记录时间为0,5s内重复发起的beginSession能被接受
  160. auto curSession = t_BeginSessionTime.find(entityName);
  161. if (curSession == t_BeginSessionTime.end())
  162. t_BeginSessionTime.insert(std::make_pair(entityName, now_time));
  163. else
  164. curSession->second = now_time;
  165. //DbgEx("save BeginSession Time:%s, %d", entityName.c_str(), now_time);
  166. }
  167. bool EntitySessionManager::checkBeginSession(std::string entityName)
  168. {
  169. time_t now_time = time(NULL);
  170. auto curSession = t_BeginSessionTime.find(entityName);
  171. if (curSession == t_BeginSessionTime.end() || curSession->second < now_time - 5)
  172. {
  173. //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);
  174. return true;//5s内不重复发起session
  175. }
  176. else
  177. return false;
  178. }
  179. RequestProcessType EntitySessionManager::ProcessWithBeginSession(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
  180. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithBeginSession");
  181. auto s = GetSessionIDByEntityName(entityName);
  182. if (s.first && -1 != s.second)
  183. {
  184. LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.className, 1, "none", msgInfo.payLoad,
  185. Error_Duplication, "session already existed");
  186. return PROCESS_FINDSESSION;
  187. }
  188. if (checkBeginSession(entityName))
  189. {
  190. // 换transID 发送beginsession
  191. int transID = MakeNewTransID(msg, hdlID);
  192. msg->setTransID(transID);
  193. updateBeginSessionTime(entityName);
  194. LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, transID, msgInfo.entityName, msgInfo.className, 0, "send", msgInfo.payLoad);
  195. return PROCESS_SEND;
  196. }
  197. else
  198. {
  199. LogManager::getInstance().logWebSocketBeginSession(hdlID, msgInfo.transId, -1, msgInfo.entityName, msgInfo.className, 1, "record", msgInfo.payLoad,
  200. Error_Duplication, "already begin session in 5 seconds");
  201. return PROCESS_RECORDMSG;//5s内发起过session
  202. }
  203. }
  204. RequestProcessType EntitySessionManager::ProcessWithEndSession(CMessage* msg, std::string entityName,
  205. unsigned int hdlID) {
  206. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithEndSession");
  207. return PROCESS_NOTHING;
  208. }
  209. RequestProcessType EntitySessionManager::ProcessWithRequest(CMessage* msg, std::string entityName,
  210. unsigned int hdlID, const ws_msgInfo& msgInfo) {
  211. auto it = m_session_map.find(entityName);
  212. if (it == m_session_map.end() || -1 == it->second)
  213. {
  214. LogManager::getInstance().logWebSocketRequest(msgInfo.hdlId, msgInfo.transId, -1, -1, msgInfo.entityName, msgInfo.functionName, 1,
  215. "startSession", msgInfo.payLoad, Error_NoTarget, "no session found, try startSession");
  216. return PROCESS_STARTSESSION;
  217. }
  218. msg->setSessionID(it->second, true);
  219. auto transId = MakeNewTransID(msg, hdlID);
  220. msg->setTransID(transId);
  221. LogManager::getInstance().logWebSocketRequest(msgInfo.hdlId, msgInfo.transId, transId, it->second, msgInfo.entityName, msgInfo.functionName,
  222. (msgInfo.warnMsg.length() == 0 ? 0 : 1), "send", msgInfo.payLoad, Error_Succeed, msgInfo.warnMsg);
  223. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRequest, replace sessionID:%d, replace transId:%d", it->second, transId);
  224. return PROCESS_SEND;
  225. }
  226. RequestProcessType EntitySessionManager::ProcessWithRegister(CMessage* msg, std::string entityName, unsigned int hdlID, const ws_msgInfo& msgInfo) {
  227. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithRegister");
  228. auto _broadcast_it = m_broadcast_map.find(entityName);
  229. if (_broadcast_it == m_broadcast_map.end())
  230. {
  231. // 尚未有客户端订阅过
  232. int transid = MakeNewTransID(msg, hdlID);
  233. msg->setTransID(transid);
  234. m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
  235. LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, transid, msgInfo.entityName,
  236. msgInfo.className, 0, "send", msgInfo.payLoad, Error_Succeed, "first register");
  237. return PROCESS_SEND;
  238. }
  239. std::map<int, WSClientReqInfo>::iterator _trans_it = m_trans_map.find(_broadcast_it->second);
  240. if (_trans_it == m_trans_map.end())
  241. {
  242. // 尚未有客户端订阅过
  243. int transid = MakeNewTransID(msg, hdlID);
  244. msg->setTransID(transid);
  245. m_broadcast_map.insert(std::pair<std::string, int>(entityName, transid));
  246. LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, transid, msgInfo.entityName,
  247. msgInfo.className, 0, "send", msgInfo.payLoad, Error_Succeed, "first register");
  248. return PROCESS_SEND;
  249. }
  250. // 已经有过订阅 在链表后加
  251. WSClientReqInfo* pNode = &_trans_it->second;
  252. if (pNode->hdlID == hdlID)
  253. {
  254. // 该客户端订阅过,避免重复订阅
  255. LogManager::getInstance().logWebSocketRegister(hdlID, msgInfo.transId, -1, msgInfo.entityName,
  256. msgInfo.className, 0, "none", msgInfo.payLoad, Error_Duplication, "already register");
  257. return PROCESS_NOTHING;
  258. }
  259. while (pNode->next != NULL) {
  260. if (pNode->hdlID == hdlID)
  261. {
  262. // 该客户端订阅过,避免重复订阅
  263. return PROCESS_NOTHING;
  264. }
  265. pNode = pNode->next;
  266. }
  267. // 该客户端从未订阅过
  268. pNode->next = new WSClientReqInfo();
  269. pNode->next->next = NULL;
  270. pNode->next->hdlID = hdlID;
  271. pNode->next->transID = msg->getTransID();
  272. CSimpleString warnStr = CSimpleString::Format("EntitySessionManager::ProcessWithRegister %s already register, add hdl %d", entityName.c_str(), hdlID);
  273. LogManager::getInstance().logWebSocketRegister(hdlID, pNode->next->transID, -1, msgInfo.entityName,
  274. msgInfo.className, 1, "none", msgInfo.payLoad, Error_Duplication, warnStr.GetData());
  275. return PROCESS_NOTHING;
  276. }
  277. RequestProcessType EntitySessionManager::ProcessWithUnregister(CMessage* msg, std::string entityName,
  278. unsigned int hdlID) {
  279. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithUnregister");
  280. std::map<std::string, int>::iterator _broadcast_it = m_broadcast_map.find(entityName);
  281. if (_broadcast_it == m_broadcast_map.end())
  282. {
  283. // 没订阅过 不用反注册
  284. return PROCESS_NOTHING;
  285. }
  286. // 订阅过 找到对应的客户端节点 删掉
  287. std::map<int, WSClientReqInfo>::iterator _trans_it = m_trans_map.find(_broadcast_it->second);
  288. if (_trans_it == m_trans_map.end())
  289. {
  290. // 没找到对应transid 理论上不可能
  291. m_broadcast_map.erase(_broadcast_it);
  292. return PROCESS_NOTHING;
  293. }
  294. // 查找节点删掉
  295. WSClientReqInfo* pNode = &_trans_it->second;
  296. if (pNode->hdlID == hdlID)
  297. {
  298. // 找到了就删掉
  299. if (pNode->next == NULL)
  300. {
  301. // 只有一个节点 就全都删掉
  302. m_trans_map.erase(_trans_it);
  303. m_broadcast_map.erase(_broadcast_it);
  304. return PROCESS_SEND;
  305. }
  306. // 后面有其他节点
  307. WSClientReqInfo* tp = pNode->next;
  308. pNode->transID = tp->transID;
  309. pNode->hdlID = tp->hdlID;
  310. pNode->next = tp->next;
  311. free(tp);
  312. return PROCESS_NOTHING;
  313. }
  314. // 首个节点不匹配时
  315. WSClientReqInfo* pHead = pNode;
  316. pNode = pNode->next;
  317. while (pNode != NULL) {
  318. if (pNode->hdlID == hdlID)
  319. {
  320. pHead->next = pNode->next;
  321. free(pNode);
  322. return PROCESS_NOTHING;
  323. }
  324. pHead = pNode;
  325. pNode = pNode->next;
  326. }
  327. return PROCESS_NOTHING;
  328. }
  329. RequestProcessType EntitySessionManager::ProcessWithSetVarReq(CMessage* msg, std::string entityName,
  330. unsigned int hdlID, const ws_msgInfo& msgInfo) {
  331. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithSetVarReq");
  332. int transId = MakeNewTransID(msg, hdlID);
  333. msg->setTransID(transId);
  334. LogManager::getInstance().logWebSocketSetVar(msgInfo.hdlId, msgInfo.transId, transId, msgInfo.name, msgInfo.value, 0, "send", msgInfo.payLoad);
  335. return PROCESS_SEND;
  336. }
  337. RequestProcessType EntitySessionManager::ProcessWithGetVarReq(CMessage* msg, std::string entityName,
  338. unsigned int hdlID, const ws_msgInfo& msgInfo) {
  339. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("EntitySessionManager::ProcessWithGetVarReq");
  340. int transId = MakeNewTransID(msg, hdlID);
  341. msg->setTransID(transId);
  342. LogManager::getInstance().logWebSocketGetVar(msgInfo.hdlId, msgInfo.transId, transId, msgInfo.name, 0, "send", msgInfo.payLoad);
  343. return PROCESS_SEND;
  344. }
  345. std::pair<int, std::string> EntitySessionManager::GetStartSessionRequest(std::string entityname, std::string className) {
  346. auto curSession = m_createSession_transId++;
  347. std::string js = "{\"messageType\":1,\"transID\":" + std::to_string((LONGLONG)curSession) + ",\"functionName\":\"\",\"entity\":\"";
  348. js.append(entityname.append("\",\"class\":\""));
  349. js.append(className.append("\"}"));
  350. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("start sessionRequest: %s", UtfToGbk(js.c_str()).c_str());
  351. return std::make_pair(curSession, js);
  352. }
  353. std::pair<int, std::string> EntitySessionManager::GetAllSessionRequest(int transId, bool isInitCfg)
  354. {
  355. std::map<std::string, std::string> sessionInfo;
  356. #if (defined _WIN32 || defined _WIN64)
  357. for each (auto it in m_session_map)
  358. #else
  359. for (auto it : m_session_map)
  360. #endif
  361. {
  362. if (it.second > 0)
  363. sessionInfo.insert(std::make_pair(it.first, boost::lexical_cast<std::string>(it.second)));
  364. }
  365. auto sessionJson = generateJsonStr(sessionInfo);
  366. if (sessionJson.first)
  367. {
  368. char sessionJs[10240] = "";
  369. sprintf(sessionJs, "{\"messageType\":%d,\"transID\":%d,\"InitCfg\":%d,\"%s\":%s}", 16, transId, isInitCfg, PARAMLIST_HEAD, sessionJson.second.c_str());
  370. LogManager::getInstance().logEntityStatus(CSimpleString::Format("GetSessionRequest, InitCfg\":%d,\"entityConnect\":%s", isInitCfg, sessionJson.second.c_str()).GetData(),
  371. LOG_LEVEL_INFO, 0, "send");
  372. return std::make_pair(true, sessionJs);
  373. }
  374. return std::make_pair(false, "error generateJsonStr");
  375. }
  376. /*
  377. {
  378. "format_version": "1.1",
  379. "target_page": "",
  380. "headers": [
  381. {
  382. "url_contains": "",
  383. "action": "add",
  384. "header_name": "zzzz_terminalno",
  385. "header_value": "7555980178",
  386. "comment": "test",
  387. "apply_on": "req",
  388. "status": "on"
  389. }
  390. ],
  391. "debug_mode": True,
  392. "use_url_contains": False
  393. }
  394. */
  395. std::pair<int, std::string> EntitySessionManager::Get_getconfig_ack(std::string terminalno)
  396. {
  397. Json::Value root;
  398. root["format_version"] = "1.1";
  399. root["target_page"] = "";
  400. Json::Value headers;
  401. Json::Value header;
  402. header["url_contains"] = "";
  403. header["action"] = "add";
  404. header["header_name"] = HEADER_TERMINALNO_NAME;
  405. header["header_value"] = terminalno;
  406. header["comment"] = "test";
  407. header["apply_on"] = "req";
  408. header["status"] = "on";
  409. headers.append(header);
  410. root["headers"] = headers;
  411. root["debug_mode"] = true;
  412. root["use_url_excepts"] = true;
  413. Json::StyledWriter writer;
  414. std::string output = writer.write(root);
  415. return std::make_pair(true, output);
  416. }
  417. std::string EntitySessionManager::GetStartSessionAck(CMessage* msg, std::string entityname) {
  418. auto s = GetSessionIDByEntityName(entityname);
  419. std::string sessionId = std::to_string((LONGLONG)s.second);
  420. std::string transid = std::to_string((LONGLONG)msg->getTransID());
  421. std::string js = "{\"messageType\":5,\"errorCode\":\"\",\"errorMsg\":\"\",\"sessionID\":";
  422. js.append(sessionId.c_str());
  423. js.append(",\"transID\":");
  424. js.append(transid.c_str());
  425. js.append("}");
  426. return js;
  427. }
  428. std::string EntitySessionManager::UpdateSessionMap(int transid, int sessionId)
  429. {
  430. auto it = m_session_ack_map.find(transid);
  431. if (it == m_session_ack_map.end())
  432. return "";
  433. DoSessionUpdate(it->second, sessionId);
  434. return it->second;
  435. }
  436. EntitySessionManager& EntitySessionManager::DoSessionUpdate(std::string entityname, int session)
  437. {
  438. auto sessionIt = m_session_map.find(entityname);
  439. if(m_session_map.end() != sessionIt)
  440. {
  441. if (sessionIt->second == session)
  442. return *this;//相等不处理
  443. else if(sessionIt->second == -1 || session == -1)
  444. {
  445. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("update sessionId(regenerate):<%s><%d>", entityname.c_str(), session);
  446. m_session_map.erase(sessionIt);
  447. m_session_map.insert(std::make_pair(entityname, session));
  448. }
  449. else
  450. 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);
  451. }
  452. else
  453. m_session_map.insert(std::make_pair(entityname, session));//not exist
  454. return *this;
  455. }
  456. AckProcessType EntitySessionManager::ProcessWithAck(CMessage* msg, unsigned int& hdlID) {
  457. int globalID = msg->getTransID();
  458. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  459. if (NULL == p)
  460. return ACKPROCESS_NOTHING;// 异常 应该不会有这种情况出现
  461. hdlID = p->hdlID;
  462. UpdateSessionMap(globalID, msg->getSessionID());
  463. if (hdlID == 0) {
  464. return ACKPROCESS_NOTHING;
  465. }
  466. return ACKPROCESS_SEND;
  467. }
  468. std::pair<bool, std::string> EntitySessionManager::DoSessionRemove(unsigned int session)
  469. {
  470. #if (defined _WIN32 || defined _WIN64)
  471. for each (auto it in m_session_map)
  472. #else
  473. for (auto it : m_session_map)
  474. #endif
  475. {
  476. if (it.second == session)
  477. {
  478. DoSessionUpdate(it.first, -1);
  479. return std::make_pair(true, it.first);
  480. }
  481. }
  482. return std::make_pair(false, "");
  483. }
  484. std::pair<AckProcessType, std::string> EntitySessionManager::AskProcessSession(CMessage* msg, unsigned int& hdlID) {
  485. int globalID = msg->getTransID();
  486. /*
  487. 替换真实的transId
  488. */
  489. if (globalID & 0xF00000)
  490. hdlID = 0; ////本地transId,无记录的链接
  491. else
  492. {
  493. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  494. if (NULL == p)
  495. return std::make_pair(ACKPROCESS_NOTHING, "can not find WSClient!");// 异常 应该不会有这种情况出现
  496. msg->setTransID(p->transID);
  497. hdlID = p->hdlID;
  498. }
  499. auto sessionId = msg->getSessionID();
  500. auto entityName = UpdateSessionMap(globalID, sessionId);
  501. if ("" == entityName)
  502. return std::make_pair(ACKPROCESS_NOTHING, "Update SessionMap error!");
  503. updateBeginSessionTime(entityName, -1 == sessionId); //clean the begin Sessiontime
  504. return std::make_pair(ACKPROCESS_SEND, entityName);
  505. }
  506. void EntitySessionManager::doWithErrorCode(int errorCode, int transId)
  507. {
  508. switch (errorCode)
  509. {
  510. case Error_Break:
  511. case Error_MethodNotFound:
  512. case Error_MethodSignatureFailed:
  513. UpdateSessionMap(transId, -1);
  514. break;
  515. default:
  516. break;
  517. }
  518. }
  519. std::pair<bool, std::string> EntitySessionManager::FromSessionIdToEntityName(int sessionId)
  520. {
  521. for (auto it : m_session_map)
  522. {
  523. if (it.second == sessionId)
  524. return std::make_pair(true, it.first);
  525. }
  526. return std::make_pair(false, "");
  527. }
  528. AckProcessType EntitySessionManager::ProcessWithRecvEvent(CMessage* msg, unsigned int& hdlID) {
  529. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  530. if (NULL == p)
  531. return ACKPROCESS_NOTHING;// 异常 应该不会有这种情况出现
  532. msg->setTransID(p->transID);
  533. hdlID = p->hdlID;
  534. if (hdlID == 0) {
  535. return ACKPROCESS_NOTHING;
  536. }
  537. return ACKPROCESS_SEND;
  538. }
  539. AckProcessType EntitySessionManager::AskProcessEvent(CMessage* msg, std::vector<std::pair<int, int>>& transIdandHdlIDArr)
  540. {
  541. WSClientReqInfoStruct* p = ReduceOriginTransID(msg);
  542. if (NULL == p)
  543. return ACKPROCESS_NOTHING;
  544. transIdandHdlIDArr.clear();
  545. while (NULL != p)
  546. {
  547. if (0 != p->transID)
  548. transIdandHdlIDArr.emplace_back(std::make_pair(p->transID, p->hdlID));
  549. p = p->next;
  550. }
  551. if (transIdandHdlIDArr.size() > 0)
  552. return ACKPROCESS_SEND;
  553. else
  554. return ACKPROCESS_NOTHING;
  555. }
  556. AckProcessType EntitySessionManager::AckProcess(CMessage* msg, unsigned int& hdlID) {
  557. AckProcessType ret = ACKPROCESS_NOTHING;
  558. switch (msg->getMessageType()) {
  559. case MessageType::Event:
  560. ProcessWithRecvEvent(msg, hdlID);
  561. break;
  562. case MessageType::SessionAck:
  563. case MessageType::RequestAck:
  564. case MessageType::GetVarAck:
  565. case MessageType::SetVarAck:
  566. ProcessWithAck(msg, hdlID);
  567. break;
  568. default:
  569. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("AckProcess default!");
  570. ret = ACKPROCESS_NOTHING;
  571. }
  572. return ret;
  573. }
  574. }