ModuleDriver.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. #include "ModuleDriver.h"
  2. #include <functional>
  3. #include "ModuleConfig.h"
  4. #include "LocalConfig.h"
  5. #include "PacketAnalizer.h"
  6. #include "LogLocalHelper.h"
  7. #include "Log4CPP.h"
  8. ModuleDriver::ModuleDriver()
  9. {
  10. //if (gLogger == nullptr)
  11. //{
  12. // string strLogPath = GetProcessDirectory() + R"(\Conf\Log4CPP.Config.xml)";
  13. // string LogHost = ((string)getLogRootpath()).c_str();
  14. // //if (LogHost.length() <= 1)
  15. // //{
  16. // // char szName[256];
  17. // // sprintf(szName, "/LogicDevice_%08d", GetCurrentProcessId());
  18. // // LogHost = szName;
  19. // //}
  20. // Log4CPP::ThreadContext::Map::Set(ECOM::Utility::Hash("LogFileName"), "Platform");
  21. // //Log4CPP::GlobalContext::Map::Set("LogHost", LogHost.c_str());
  22. // Log4CPP::ThreadContext::Map::Set(ECOM::Utility::Hash("LogHost"), LogHost.c_str() + 1);
  23. // auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  24. // gLogger = Log4CPP::LogManager::GetLogger("Platform");
  25. // FINFO("Code Build datetime [{$} {$}]", __DATE__, __TIME__);
  26. //}
  27. m_config = new ModuleConfig();
  28. }
  29. ModuleDriver::~ModuleDriver()
  30. {
  31. }
  32. bool ModuleDriver::DriverEntry(ResDataObject& PARAM_IN Configuration)
  33. {
  34. LogicDriver::DriverEntry(Configuration);
  35. string strPath = GetModuleDevicePath(Configuration);
  36. FINFO("Driver Load Ccos Path : {$}", strPath);
  37. (*m_config).CheckAndInitConfig(strPath);
  38. return true;
  39. }
  40. //
  41. //RET_STATUS ModuleDriver::Request(ResDataObject PARAM_IN* pRequest, ResDataObject PARAM_OUT* pResponse)
  42. //{
  43. // INT ret = RET_NOSUPPORT;
  44. // PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pRequest);
  45. // PACKET_TYPE type = PacketAnalizer::GetPacketType(pRequest);
  46. // string keystr = PacketAnalizer::GetPacketKey(pRequest);
  47. // ResDataObject Context;
  48. // if (PacketAnalizer::GetPacketContext(pRequest, Context) == false)
  49. // {
  50. // return RET_FAILED;
  51. // }
  52. // ResDataObject resReponse;
  53. //
  54. // if (type == PACKET_TYPE_NOTIFY)
  55. // {
  56. //
  57. // //通知类,不需要答复
  58. // return RET_END;
  59. // }
  60. // else if (type == PACKET_TYPE_RES)
  61. // {
  62. //
  63. // //收到了应答包。。。
  64. // return RET_END;
  65. // }
  66. //
  67. // if (cmd == PACKET_CMD_EXE)
  68. // {
  69. // string req, res;
  70. // req = (const char*)Context.encode();
  71. // FINFO("Action[{$}].req:{$}", keystr.c_str(), req.c_str());
  72. //
  73. // ret = LogicDriver::Request(pRequest, pResponse);
  74. // if(ret == RET_NOSUPPORT)
  75. // ret = DevAction("", keystr.c_str(), req.c_str(), resReponse);
  76. //
  77. // pResponse->update("CONTEXT", resReponse);
  78. // FINFO("Action res packet done");
  79. // }
  80. // else if (cmd == PACKET_CMD_GET)
  81. // {
  82. // string res;
  83. // FINFO("get CMD_GET req:{$}", keystr.c_str());
  84. //
  85. // ret = LogicDriver::Request(pRequest, pResponse);
  86. // if (ret == RET_NOSUPPORT)
  87. // ret = DevGet(m_strCCOSDevicePath.c_str(), keystr.c_str(), resReponse);
  88. // pResponse->update("CONTEXT", resReponse);
  89. // }
  90. // else if (cmd == PACKET_CMD_UPDATE)
  91. // {
  92. // FINFO("get CMD_UPDATE req:{$}", keystr.c_str());
  93. //
  94. // ret = LogicDriver::Request(pRequest, pResponse);
  95. // if (ret == RET_NOSUPPORT)
  96. // ret = DevUpdate(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  97. // pResponse->update("CONTEXT", resReponse);
  98. //
  99. // }
  100. // else if (cmd == PACKET_CMD_SET)
  101. // {
  102. // FINFO("get CMD_UPDATE req:{$}", keystr.c_str());
  103. //
  104. // ret = LogicDriver::Request(pRequest, pResponse);
  105. // if (ret == RET_NOSUPPORT)
  106. // ret = DevSet(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  107. // pResponse->update("CONTEXT", resReponse);
  108. //
  109. // }
  110. // else if (cmd == PACKET_CMD_MSG)
  111. // {
  112. // FINFO("get CMD_UPDATE req:{$}", keystr.c_str());
  113. //
  114. // ret = LogicDriver::Request(pRequest, pResponse);
  115. // if (ret == RET_NOSUPPORT)
  116. // ret = DevMessage(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  117. // pResponse->update("CONTEXT", resReponse);
  118. //
  119. // }
  120. // else if (cmd == PACKET_CMD_ADD)
  121. // {
  122. // FINFO("get CMD_ADD req:{$}", keystr.c_str());
  123. //
  124. // ret = LogicDriver::Request(pRequest, pResponse);
  125. // if (ret == RET_NOSUPPORT)
  126. // ret = DevAdd(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  127. // pResponse->update("CONTEXT", resReponse);
  128. //
  129. // }
  130. // else if (cmd == PACKET_CMD_DEL)
  131. // {
  132. // FINFO("get CMD_DEL req:{$}", keystr.c_str());
  133. //
  134. // ret = LogicDriver::Request(pRequest, pResponse);
  135. // if (ret == RET_NOSUPPORT)
  136. // ret = DevDel(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  137. // pResponse->update("CONTEXT", resReponse);
  138. //
  139. // }
  140. // else
  141. // {
  142. // //wtf?? 忽略掉
  143. // return RET_END;
  144. // }
  145. //
  146. //
  147. // PacketAnalizer::MakeRetCode((RET_STATUS)ret, pResponse);
  148. //
  149. // return (RET_STATUS)ret;
  150. //
  151. //
  152. //}
  153. RET_STATUS ModuleDriver::CmdToLogicDev(ResDataObject PARAM_IN* pCmd)
  154. {
  155. return RET_SUCCEED;
  156. }
  157. bool ModuleDriver::GetDeviceType(GUID& DevType)
  158. {
  159. return true;
  160. }
  161. void ModuleDriver::SubscribeSelf()
  162. {
  163. LogicDevice::SubscribeSelf();
  164. }
  165. void ModuleDriver::OnSetClientID()
  166. {
  167. //这里根据 CCOS设备 路径决定加载什么配置
  168. LogicDevice::OnSetClientID();
  169. //这里要注意是 CCOS/Driver??,在DriverEntry的时候 初始化过了,这里不需要了
  170. //(*m_config).CheckAndInitConfig(m_strCCOSDevicePath);
  171. }
  172. RET_STATUS ModuleDriver::GetDeviceResource(ResDataObject PARAM_OUT* pDeviceResource)
  173. {
  174. //父类会生成Ations
  175. LogicDevice::GetDeviceResource(pDeviceResource);
  176. //ResDataObject getPerp = m_resModuleConfig["Get"];
  177. (*m_config).GetDeviceResource(pDeviceResource, DPC_DriverClient);
  178. //msgPerp = m_resModuleConfig["Message"];
  179. return RET_SUCCEED;
  180. }
  181. /// <summary>
  182. /// 枚举配置项,level == "Public" ,仅返回Pulic
  183. /// level == "E-COM" ,返回 Public 和 E-COM
  184. /// level == "Private" , 返回所有
  185. /// </summary>
  186. /// <param name="level">三个固定常量字符串 "Public"/"E-COM"/"Private"</param>
  187. /// <param name="resItems"></param>
  188. /// <returns></returns>
  189. RET_STATUS ModuleDriver::GetUpdatableItems(string level, ResDataObject& resItems)
  190. {
  191. return (*m_config).GetUpdatableItems(level, resItems);
  192. }
  193. RET_STATUS ModuleDriver::UpdateItem(const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons)
  194. {
  195. //保存到配置文件
  196. //通知模型对象,值更新了
  197. string strNewValue = (*m_config).UpdateItem(pszProperty, pszValueUpdate);
  198. return OnUpdate(pszProperty, strNewValue.c_str(), resRespons);
  199. }
  200. RET_STATUS ModuleDriver::OnMessage(const char* pszTopic, const char* pszMessageValue, ResDataObject& resResponse)
  201. {
  202. FINFO("Message to {$} with {$}", pszTopic, pszMessageValue);
  203. return RET_SUCCEED;
  204. }
  205. RET_STATUS ModuleDriver::DevGet(const char* pszDevUri, const char* pszProperty, ResDataObject& resRespons)
  206. {
  207. string property = pszProperty;
  208. if (property.length() <= 0)
  209. {
  210. auto func = std::bind(&ModuleDriver::GetItem, this, placeholders::_1, placeholders::_2);
  211. //RET_STATUS ret = func(pszProperty, resRespons);
  212. (*m_config).GetAll(resRespons, func);
  213. return RET_SUCCEED;
  214. }
  215. if (!(*m_config).CanDo(pszProperty, PACKET_CMD_GET))
  216. return RET_NOSUPPORT;
  217. if (GetItem(pszProperty, resRespons) == RET_SUCCEED)
  218. {
  219. (*m_config).GetPropties().update(pszProperty, resRespons);
  220. }
  221. resRespons = (*m_config).GetPropties()[pszProperty];
  222. return RET_SUCCEED;
  223. }
  224. RET_STATUS ModuleDriver::DevSet(const char* pszDevUri, const char* pszProperty, const char* pszValueSet, ResDataObject& resRespons)
  225. {
  226. if (!(*m_config).CanDo(pszProperty, PACKET_CMD_SET))
  227. return RET_NOSUPPORT;
  228. ResDataObject resNewValue;
  229. resNewValue.decode(pszValueSet);
  230. RET_STATUS ret = SetItem(pszProperty, resNewValue, resRespons);
  231. if (ret == RET_SUCCEED)
  232. (*m_config).GetPropties()[pszProperty].update("Value", resNewValue);
  233. //通知模型对象,值更新了
  234. return ret;
  235. }
  236. RET_STATUS ModuleDriver::DevUpdate(const char* pszDevUri, const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons)
  237. {
  238. string strProperty = pszProperty;
  239. if (strProperty.length() == 0)
  240. {
  241. //查询可以更新的属性
  242. string level = pszValueUpdate;
  243. if (level.length() <= 0)
  244. level = "Public";
  245. if (level == "Public" || level == "E-COM" || level == "Private")
  246. {
  247. //
  248. return GetUpdatableItems(level, resRespons);
  249. }
  250. level = "Public";
  251. return GetUpdatableItems(level, resRespons);
  252. }
  253. if (!(*m_config).CanDo(pszProperty, PACKET_CMD_UPDATE))
  254. return RET_NOSUPPORT;
  255. if (strProperty == "RestoreConfig")
  256. {
  257. //恢复出厂设置
  258. }
  259. RET_STATUS ret = UpdateItem(pszProperty, pszValueUpdate, resRespons);
  260. FINFO("UpdateItem to Device [{$}] ret [{$}]", pszProperty, (int)ret);
  261. //m_resModuleConfig.update("Get", m_resProperties);
  262. (*m_config).SaveToConfigFile();
  263. return RET_SUCCEED;
  264. }
  265. RET_STATUS ModuleDriver::DevAdd(const char* pszDevUri, const char* pszProperty, const char* pszValueAdd, ResDataObject& resRespons)
  266. {
  267. if (!(*m_config).CanDo(pszProperty, PACKET_CMD_ADD))
  268. return RET_NOSUPPORT;
  269. ResDataObject resNewValue;
  270. resNewValue.decode(pszValueAdd);
  271. for (int x = 0; x < resNewValue.size(); x++)
  272. {
  273. (*m_config).GetPropties()[pszProperty].update(resNewValue.GetKey(x), resNewValue[x]);
  274. }
  275. //m_resProperties.update(pszProperty, resNewValue);
  276. return OnAdd(pszProperty, resNewValue, resRespons);
  277. }
  278. RET_STATUS ModuleDriver::DevDel(const char* pszDevUri, const char* pszProperty, const char* pszValueDel, ResDataObject& resRespons)
  279. {
  280. if (!(*m_config).CanDo(pszProperty, PACKET_CMD_DEL))
  281. return RET_NOSUPPORT;
  282. ResDataObject resDelValue;
  283. string strDel = pszValueDel;
  284. if (strDel.length() < 0)
  285. {
  286. //什么参数都没有,清除所有数据
  287. (*m_config).GetPropties()[pszProperty].clear();
  288. return OnDel(pszProperty, resDelValue, resRespons);
  289. }
  290. resDelValue.decode(pszValueDel);
  291. string key = pszProperty;
  292. if (key == "ErrorList")
  293. {
  294. //如果是ErrorList,提供单独删除某类错误的能力
  295. int nIndex = resDelValue.GetFirstOf("ErrorIndex");
  296. if (nIndex >= 0)
  297. {
  298. nIndex = (int)resDelValue["ErrorIndex"];
  299. if (nIndex >= 0 && nIndex < ((*m_config).GetPropties()[key.c_str()]).size())
  300. {
  301. //m_resProperties[key.c_str()].eraseOneOf()
  302. }
  303. }
  304. }
  305. if (RET_SUCCEED == OnDel(pszProperty, resDelValue, resRespons))
  306. {
  307. (*m_config).GetPropties().update(pszProperty, resRespons);
  308. return RET_SUCCEED;
  309. }
  310. return RET_SUCCEED;
  311. }
  312. RET_STATUS ModuleDriver::DevAction(const char* pszDevUri, const char* pszActionName, const char* pszParams, ResDataObject& resRespons)
  313. {
  314. cout << "ModuleDriver::DevAction - Entering. pszDevUri: " << (pszDevUri ? pszDevUri : "nullptr")
  315. << ", pszActionName: " << (pszActionName ? pszActionName : "nullptr")
  316. << ", pszParams: " << (pszParams ? pszParams : "nullptr") << endl;
  317. RET_STATUS ret = OnAction(pszActionName, pszParams, resRespons);
  318. if (ret != RET_NOSUPPORT)
  319. return ret;
  320. //ret = LogicDevice::DevAction(pszDevUri, pszActionName, pszParams, resRespons);
  321. //if (ret != RET_NOSUPPORT)
  322. // return ret;
  323. //if (!(*m_config).CanDo(pszActionName, PACKET_CMD_EXE))
  324. // return RET_NOSUPPORT;
  325. return ret;
  326. }
  327. RET_STATUS ModuleDriver::DevMessage(const char* pszDevUri, const char* pszTopic, const char* pszMessageValue, ResDataObject& resRespons)
  328. {
  329. return OnMessage(pszTopic, pszMessageValue, resRespons);
  330. }
  331. RET_STATUS ModuleDriver::OnUpdate(const char* pszProperty, const char* pszValueUpdate, ResDataObject& resRespons)
  332. {
  333. RET_STATUS ret = RET_NOSUPPORT;
  334. return ret;
  335. }
  336. RET_STATUS ModuleDriver::OnDel(const char* pszPropery, ResDataObject& resDelValue, ResDataObject& resResponse)
  337. {
  338. RET_STATUS ret = RET_NOSUPPORT;
  339. return ret;
  340. }
  341. RET_STATUS ModuleDriver::OnAdd(const char* pszPropery, ResDataObject& reAddValue, ResDataObject& resResponse)
  342. {
  343. RET_STATUS ret = RET_NOSUPPORT;
  344. return ret;
  345. }
  346. RET_STATUS ModuleDriver::SetItem(const char* pszPropery, ResDataObject& resSetValue, ResDataObject& resResponse)
  347. {
  348. RET_STATUS ret = RET_NOSUPPORT;
  349. return ret;
  350. }
  351. RET_STATUS ModuleDriver::GetItem(const char* pszPropery, ResDataObject& resResponse)
  352. {
  353. RET_STATUS ret = RET_NOSUPPORT;
  354. return ret;
  355. }
  356. RET_STATUS ModuleDriver::OnAction(const char* pszActionName, const char* pszParams, ResDataObject& resResponse)
  357. {
  358. RET_STATUS ret = RET_NOSUPPORT;
  359. string strAction = pszActionName;
  360. if (strAction == "RestoreConfig")
  361. {
  362. //恢复出厂设置
  363. m_config->RestoreConfig();
  364. ret = RET_SUCCEED;
  365. }
  366. return ret;
  367. }
  368. RET_STATUS ModuleDriver::Request(ResDataObject PARAM_IN* pRequest, ResDataObject PARAM_OUT* pResponse)
  369. {
  370. RET_STATUS ret = LogicDriver::Request(pRequest, pResponse);
  371. if (ret != RET_NOSUPPORT)
  372. return ret;
  373. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pRequest);
  374. PACKET_TYPE type = PacketAnalizer::GetPacketType(pRequest);
  375. string keystr = PacketAnalizer::GetPacketKey(pRequest);
  376. ResDataObject Context;
  377. if (PacketAnalizer::GetPacketContext(pRequest, Context) == false)
  378. {
  379. return RET_FAILED;
  380. }
  381. ResDataObject resReponse;
  382. if (type == PACKET_TYPE_NOTIFY)
  383. {
  384. //通知类,不需要答复
  385. return RET_SUCCEED;
  386. }
  387. else if (type == PACKET_TYPE_RES)
  388. {
  389. //收到了应答包。。。
  390. return RET_SUCCEED;
  391. }
  392. if (cmd == PACKET_CMD_EXE)
  393. {
  394. string req, res;
  395. req = (const char*)Context.encode();
  396. FINFO("Action[{$}].req:{$}", keystr.c_str(), req.c_str());
  397. ret = DevAction("", keystr.c_str(), req.c_str(), resReponse);
  398. pResponse->update("CONTEXT", resReponse);
  399. FINFO("Action res packet done");
  400. }
  401. else if (cmd == PACKET_CMD_GET)
  402. {
  403. string res;
  404. FINFO("get CMD_GET req:{$}", keystr.c_str());
  405. ret = DevGet(m_strCCOSDevicePath.c_str(), keystr.c_str(), resReponse);
  406. pResponse->update("CONTEXT", resReponse);
  407. }
  408. else if (cmd == PACKET_CMD_UPDATE)
  409. {
  410. FINFO("get CMD_UPDATE req:{$}", keystr.c_str());
  411. ret = DevUpdate(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  412. pResponse->update("CONTEXT", resReponse);
  413. }
  414. else if (cmd == PACKET_CMD_SET)
  415. {
  416. FINFO("get CMD_UPDATE req:{$}", keystr.c_str());
  417. ret = DevSet(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  418. pResponse->update("CONTEXT", resReponse);
  419. }
  420. else if (cmd == PACKET_CMD_MSG)
  421. {
  422. FINFO("get CMD_UPDATE req:{$}", keystr.c_str());
  423. ret = DevMessage(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  424. pResponse->update("CONTEXT", resReponse);
  425. }
  426. else if (cmd == PACKET_CMD_ADD)
  427. {
  428. FINFO("get CMD_ADD req:{$}", keystr.c_str());
  429. ret = DevAdd(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  430. pResponse->update("CONTEXT", resReponse);
  431. }
  432. else if (cmd == PACKET_CMD_DEL)
  433. {
  434. FINFO("get CMD_DEL req:{$}", keystr.c_str());
  435. ret = DevDel(m_strCCOSDevicePath.c_str(), keystr.c_str(), Context, resReponse);
  436. pResponse->update("CONTEXT", resReponse);
  437. }
  438. else
  439. {
  440. //wtf?? 忽略掉
  441. return RET_SUCCEED;
  442. }
  443. PacketAnalizer::MakeRetCode((RET_STATUS)ret, pResponse);
  444. return (RET_STATUS)ret;
  445. }