ModuleDriver.cpp 14 KB

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