HandleManager.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. #include "HandleManager.h"
  2. #include "LocalConfig.h"
  3. #include "PacketAnalizer.h"
  4. #include "CDI.h"
  5. #include "LogLocalHelper.h" // 模块名接口声明(共用)
  6. #include "Log4CPP.h"
  7. HandleManager g_HandleManager;
  8. HandleManager::HandleManager()
  9. {
  10. }
  11. HandleManager::~HandleManager()
  12. {
  13. Clear();
  14. }
  15. void HandleManager::Clear()
  16. {
  17. //m_HandleMap.clear();
  18. Thread_Lock();
  19. m_CrcMap.clear();
  20. Thread_UnLock();
  21. }
  22. void HandleManager::ClearLocalDrvHandles(vector<UINT64> &ServerSysIFList)
  23. {
  24. CcosTargetAddress DevID;
  25. vector<CcosDevFileHandle> HandleList;
  26. DevID[CCOS_PACK_TARGET_BUSID] = (const char*)getLocalEbusId();
  27. DevID[CCOS_PACK_TARGET_MACHINEID] = (const char*)getLocalMachineId();
  28. DevID[CCOS_PACK_TARGET_PROCID] = (UINT64)getpid();
  29. Thread_Lock();
  30. //kick all of dev's sysif
  31. for (DWORD i = 0; i < ServerSysIFList.size(); i++)
  32. {
  33. DevID[CCOS_PACK_TARGET_ADDR] = ServerSysIFList[i];
  34. //#ifdef _DEBUG
  35. // DevID.PrintOut();//for test
  36. //#endif
  37. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  38. while (crc_iter != m_CrcMap.end())
  39. {
  40. //#ifdef _DEBUG
  41. // crc_iter->second.PrintOut();//for test
  42. //#endif
  43. if (crc_iter->second.GetTarget(false) == DevID)
  44. {
  45. HandleList.push_back(crc_iter->second);
  46. //for test
  47. FERROR("ClearLocalDrvHandles Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  48. crc_iter = m_CrcMap.erase(crc_iter);
  49. continue;
  50. }
  51. ++crc_iter;
  52. }
  53. }
  54. Thread_UnLock();
  55. //notify close to owners
  56. for (DWORD i = 0; i < HandleList.size();i++)
  57. {
  58. ResDataObject Notify;
  59. PacketAnalizer::MakeCloseRequest(Notify, HandleList[i], PACKET_TYPE_NOTIFY);
  60. GetCommandDispathIF()->ReceivedFromDevice(Notify);
  61. }
  62. }
  63. void HandleManager::ClearRemoteHandles()
  64. {
  65. vector<CcosDevFileHandle> HandleList;
  66. Thread_Lock();
  67. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  68. while (crc_iter != m_CrcMap.end())
  69. {
  70. if ((int)(crc_iter->second[CCOS_PACK_HANDLE_ROUTE]) == (int)CCOS_PACKET_ROUTE_ETH)
  71. //if (crc_iter->second.m_Owner.m_MachineID.GetVal() != MachineId)
  72. {
  73. HandleList.push_back(crc_iter->second);
  74. //for test
  75. FERROR("ClearRemoteHandles Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  76. crc_iter = m_CrcMap.erase(crc_iter);
  77. continue;
  78. }
  79. ++crc_iter;
  80. }
  81. Thread_UnLock();
  82. //send notify here
  83. //send ...
  84. //notify close to owners
  85. for (DWORD i = 0; i < HandleList.size(); i++)
  86. {
  87. ResDataObject Notify;
  88. PacketAnalizer::MakeCloseRequest(Notify, HandleList[i], PACKET_TYPE_NOTIFY);
  89. GetCommandDispathIF()->ReceivedFromDevice(Notify);
  90. }
  91. }
  92. bool HandleManager::Registhandle(CcosDevFileHandle &Handle)
  93. {
  94. Thread_Lock();
  95. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find((UINT64)Handle[CCOS_PACKET_HANDLE_KEY]);
  96. if (crc_iter != m_CrcMap.end())
  97. {
  98. Thread_UnLock();
  99. return false;
  100. }
  101. //if (RegistHandle(Handle.m_Dev.m_ProcID, Handle.m_Dev.m_Addr, Handle.m_Owner, Handle.m_Flags))
  102. //{
  103. // m_CrcMap[Handle.m_HandleId] = Handle;
  104. //}
  105. m_CrcMap[(UINT64)Handle[CCOS_PACKET_HANDLE_KEY]] = Handle;
  106. #ifdef _DEBUG
  107. //for test
  108. FERROR("Registed Handle Count:{$}\n", m_CrcMap.size());
  109. crc_iter = m_CrcMap.begin();
  110. while (crc_iter != m_CrcMap.end())
  111. {
  112. FERROR("Registed Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  113. ++crc_iter;
  114. }
  115. #endif
  116. Thread_UnLock();
  117. return true;
  118. }
  119. bool HandleManager::UnRegistHandle(UINT64 CrcCode)
  120. {
  121. Thread_Lock();
  122. //for test
  123. FERROR("Before UnRegistHandle,Map Count:{$},Req Handle Id:{$}\n", m_CrcMap.size(), CrcCode);
  124. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
  125. if (crc_iter != m_CrcMap.end())
  126. {
  127. //for test
  128. FERROR("UnRegistHandle Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  129. m_CrcMap.erase(crc_iter);
  130. Thread_UnLock();
  131. return true;
  132. }
  133. //for test
  134. #ifdef _DEBUG
  135. FERROR("Left Handle Count:{$}\n", m_CrcMap.size());
  136. crc_iter = m_CrcMap.begin();
  137. while (crc_iter != m_CrcMap.end())
  138. {
  139. FERROR("LeftHandle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  140. ++crc_iter;
  141. }
  142. #endif
  143. Thread_UnLock();
  144. return false;
  145. }
  146. bool HandleManager::GetHandle(UINT64 CrcCode, CcosDevFileHandle& filehandle)
  147. {
  148. Thread_Lock();
  149. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
  150. if (crc_iter != m_CrcMap.end())
  151. {
  152. filehandle = crc_iter->second;
  153. Thread_UnLock();
  154. return true;
  155. }
  156. Thread_UnLock();
  157. return false;
  158. }
  159. bool HandleManager::GetFileFlag(UINT64 CrcCode,UINT64 DevAddr, DWORD &fileFlag)
  160. {
  161. bool ret = false;
  162. Thread_Lock();
  163. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
  164. if (crc_iter != m_CrcMap.end())
  165. {
  166. if ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == DevAddr)
  167. {
  168. fileFlag = crc_iter->second[CCOS_PACK_HANDLE_FLAGS];
  169. ret = true;
  170. }
  171. else
  172. {
  173. FERROR("Dev Addr not exist.Crc:{$}", DevAddr);
  174. }
  175. }
  176. else
  177. {
  178. FERROR("Dev Crc not exist.Crc:{$}", CrcCode);
  179. }
  180. Thread_UnLock();
  181. return ret;
  182. }
  183. void HandleManager::DeviceDetached(UINT64 ProcId, UINT64 Addr)
  184. {
  185. //NOT FINISHED YET
  186. //it didn't send the close notify
  187. Thread_Lock();
  188. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  189. while (crc_iter != m_CrcMap.end())
  190. {
  191. if ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == Addr && (UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_PROCID] == ProcId)
  192. {
  193. //send notify here
  194. //send ...
  195. //for test
  196. FERROR("DeviceDetached Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  197. crc_iter = m_CrcMap.erase(crc_iter);
  198. continue;
  199. }
  200. ++crc_iter;
  201. }
  202. Thread_UnLock();
  203. }
  204. bool HandleManager::CheckNotifyPacketAccessValidity(ResDataObject &packet, DWORD Flags)
  205. {
  206. bool ret = true;
  207. //CMD
  208. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
  209. switch (cmd)
  210. {
  211. case PACKET_CMD_EXE:
  212. if ((Flags & NOTIFY_ACTION) == 0)
  213. {
  214. ret = false;
  215. }
  216. break;
  217. case PACKET_CMD_DATA:
  218. if ((Flags & NOTIFY_DATA) == 0)
  219. {
  220. ret = false;
  221. }
  222. break;
  223. case PACKET_CMD_MSG:
  224. if ((Flags & NOTIFY_MSG) == 0)
  225. {
  226. ret = false;
  227. }
  228. break;
  229. case PACKET_CMD_PART_UPDATE:
  230. case PACKET_CMD_UPDATE:
  231. case PACKET_CMD_ADD:
  232. case PACKET_CMD_DEL:
  233. if ((Flags & NOTIFY_UPDATE) == 0)
  234. {
  235. ret = false;
  236. }
  237. break;
  238. }
  239. return ret;
  240. }
  241. bool HandleManager::CheckNormalPacketAccessValidity(ResDataObject &packet,DWORD Flags)
  242. {
  243. bool ret = true;
  244. //CMD
  245. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
  246. switch (cmd)
  247. {
  248. case PACKET_CMD_EXE:
  249. if ((Flags & ACTION) == 0)
  250. {
  251. ret = false;
  252. }
  253. break;
  254. case PACKET_CMD_DATA:
  255. case PACKET_CMD_MSG:
  256. case PACKET_CMD_UPDATE:
  257. case PACKET_CMD_ADD:
  258. case PACKET_CMD_DEL:
  259. ret = false;
  260. break;
  261. }
  262. return ret;
  263. }
  264. CMD_ECHO HandleManager::CheckReqPacketValidity(ResDataObject &packet, UINT64 &Addr)
  265. {
  266. CMD_ECHO ret = CMD_ECHO_IGNORE;//ignore
  267. UINT64 Crc;
  268. DWORD Flag;
  269. bool status = true;
  270. status &= PacketAnalizer::GetPacketHandleCrc(&packet, Crc);
  271. status &= PacketAnalizer::GetPacketHandleAddr(&packet, Addr, true);
  272. if (status)
  273. {
  274. if (GetFileFlag(Crc, Addr, Flag))
  275. {
  276. //REQ & RES
  277. status = CheckNormalPacketAccessValidity(packet, Flag);
  278. if (status)
  279. {
  280. ret = CMD_ECHO_OK;//ok
  281. }
  282. else
  283. {
  284. FERROR("Dev AccessValidity not Match.AccessFlag: {$} packet {$}", Flag, packet.encode());
  285. ret = CMD_ECHO_NG;//failed
  286. }
  287. }
  288. else
  289. {
  290. FERROR("fileFlag not right {$} ", packet.encode());
  291. ret = CMD_ECHO_NOTARGET;//no target
  292. }
  293. }
  294. return ret;
  295. }
  296. bool HandleManager::GetNotifyOwners(ResDataObject &packet, vector<CcosDevFileHandle> &OwnerList)
  297. {
  298. bool ret = true;
  299. //get device proc&address
  300. UINT64 Proc, Addr;
  301. ret &= PacketAnalizer::GetPacketHandleProcId(&packet, Proc, true);
  302. ret &= PacketAnalizer::GetPacketHandleAddr(&packet, Addr, true);
  303. if (ret == false)
  304. {
  305. return false;
  306. }
  307. OwnerList.clear();
  308. Thread_Lock();
  309. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  310. while (crc_iter != m_CrcMap.end())
  311. {
  312. if (((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == Addr)
  313. && ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_PROCID] == Proc))
  314. {
  315. //
  316. if (CheckNotifyPacketAccessValidity(packet, crc_iter->second[CCOS_PACK_HANDLE_FLAGS]))
  317. {
  318. //match one
  319. OwnerList.push_back(crc_iter->second);
  320. }
  321. }
  322. ++crc_iter;
  323. }
  324. Thread_UnLock();
  325. return (OwnerList.size() > 0);
  326. }