mod_evtconverter.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "evtengine.h"
  4. #include "EventCode.h"
  5. #include "fileutil.h"
  6. #include "modVer.h"
  7. #include "SipphoneEvent.hpp"
  8. #include "CustomerApproachEvent.hpp"
  9. //#ifndef RVC_USE_XML
  10. //#define RVC_USE_XML 1
  11. //#endif // !RVC_USE_XML
  12. static slot_trigger_elem_t slot_trigger_arr[] = {
  13. {"SipphoneEvent", SipphoneSlotList, SipphoneTriggerList},
  14. {"CustomerApproachEvent", CustomerApproachSlotList, CustomerApproachTriggerList}
  15. };
  16. class CEventConverterEntity : public CEntityBase, public ISysVarListener, public ILogListener
  17. {
  18. public:
  19. CEventConverterEntity() : m_pEngine(NULL), m_lIdSeq(0) {}
  20. virtual ~CEventConverterEntity() {}
  21. virtual const char *GetEntityName() const { return "EventConverter"; }
  22. const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
  23. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  24. {
  25. ErrorCodeEnum Error = __OnStart(Error_Succeed);
  26. pTransactionContext->SendAnswer(Error);
  27. }
  28. ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError)
  29. {
  30. if (m_nIslog){
  31. }
  32. m_eDeviceType = eStand2sType;
  33. m_nIslog = 1;
  34. ErrorCodeEnum Error;
  35. CSimpleStringA str;
  36. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  37. CSimpleStringA strConfigDir;
  38. Error = spEntityFunction->GetPath("CFG", strConfigDir);
  39. if (Error != Error_Succeed) {
  40. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get etc directory failed!");
  41. return Error;
  42. }
  43. m_eDeviceType = RvcGetDeviceType();
  44. CAutoArray<CSimpleStringA> ConfigFiles;
  45. ConfigFiles.Init(2);
  46. const int num = 2;
  47. ConfigFiles[0] = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "SipphoneEvent.xml", strConfigDir.GetData());
  48. if (eCardStore == m_eDeviceType) {
  49. ConfigFiles[1] = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "CustomerApproachEventCardStore.xml", strConfigDir.GetData());
  50. }
  51. else {
  52. ConfigFiles[1] = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "CustomerApproachEvent.xml", strConfigDir.GetData());
  53. }
  54. CSmartPointer<IConfigInfo> spConfigCenterSetting;
  55. Error = spEntityFunction->OpenConfig(Config_CenterSetting, spConfigCenterSetting);
  56. if (Error != Error_Succeed) {
  57. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open config failed!");
  58. return Error;
  59. }
  60. Error = spConfigCenterSetting->ReadConfigValue(GetEntityName(), "IsLog", str);
  61. if (Error != Error_Succeed) {
  62. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load config failed, read Log.IsLog failed!");
  63. return Error;
  64. }
  65. m_nIslog = atoi(str);
  66. SetLogType(m_nIslog);
  67. evt_engine_t *engine;
  68. evt_engine_callback_t cb;
  69. cb.get_entity_id = &__get_entity_id;
  70. cb.get_sysevent = &__get_sysevent;
  71. cb.kill_timer = &__kill_timer;
  72. cb.new_timer_id = &__new_timer_id;
  73. cb.set_sysevent = &__set_sysevent;
  74. cb.set_timer = &__set_timer;
  75. cb.subscribe_log = &__subscribe_log;
  76. cb.subscribe_sysevent = &__subscribe_sysevent;
  77. cb.unsubscribe_log = &__unsubscribe_log;
  78. cb.unsubscribe_sysevent = &__unsubscribe_sysevent;
  79. cb.user_data = this;
  80. int rc = evt_engine_create(&cb, &engine);
  81. if (rc != 0) {
  82. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create engine failed!");
  83. return (ErrorCodeEnum)rc;
  84. }
  85. if (m_nIslog) {
  86. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create engine ok!");
  87. }
  88. #ifdef RVC_USE_XML
  89. if (num > 0) {
  90. const char **files = new const char*[num];
  91. for (int i = 0; i < num; ++i) {
  92. files[i] = (const char*)ConfigFiles[i];
  93. }
  94. rc = evt_engine_load(engine, num, files);
  95. delete files;
  96. if (rc != 0) {
  97. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load config failed!");
  98. return (ErrorCodeEnum)rc;
  99. }
  100. }
  101. #else
  102. if (num > 0) {
  103. rc = evt_engine_load(engine, num, slot_trigger_arr);
  104. if (rc != 0) {
  105. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("load config failed!");
  106. return (ErrorCodeEnum)rc;
  107. }
  108. }
  109. #endif
  110. rc = evt_engine_start(engine);
  111. if (rc != 0) {
  112. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start engine failed!");
  113. return (ErrorCodeEnum)rc;
  114. }
  115. m_pEngine = engine;
  116. return preOperationError;
  117. }
  118. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  119. {
  120. ErrorCodeEnum Error = __OnClose(Error_Succeed);
  121. pTransactionContext->SendAnswer(Error);
  122. }
  123. DeviceTypeEnum RvcGetDeviceType()
  124. {
  125. DeviceTypeEnum eType = eStand2sType;
  126. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  127. CSystemStaticInfo stStaticinfo;
  128. spFunction->GetSystemStaticInfo(stStaticinfo);
  129. if (_stricmp(stStaticinfo.strMachineType.GetData(), "RVC.Stand1SPlus") == 0) {
  130. eType = eStand1SPlusType;
  131. }
  132. else if (_stricmp(stStaticinfo.strMachineType.GetData(), "RVC.CardStore") == 0 || _stricmp(stStaticinfo.strMachineType.GetData(), "RVC.CardPrinter") == 0){
  133. eType = eCardStore;
  134. }
  135. else{
  136. eType = eStand2sType;
  137. }
  138. if (eType >= 0 && eType < sizeof(Device_Type_Table)/sizeof(char*)){
  139. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("device type is %s.", Device_Type_Table[eType]);
  140. }
  141. return eType;
  142. }
  143. ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError)
  144. {
  145. int rc;
  146. rc = evt_engine_stop(m_pEngine);
  147. if (rc != 0) {
  148. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("stop engine failed!");
  149. return (ErrorCodeEnum)rc;
  150. }
  151. rc = evt_engine_unload(m_pEngine);
  152. if (rc != 0) {
  153. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unload engine failed!");
  154. return (ErrorCodeEnum)rc;
  155. }
  156. evt_engine_destroy(m_pEngine);
  157. m_pEngine = NULL;
  158. return Error_Succeed;
  159. }
  160. virtual void OnSysVarEvent(const char *pszKey,const char *pszValue,const char *pszOldValue,const char *pszEntityName)
  161. {
  162. //if (m_nIslog)
  163. {
  164. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process sysvar key=%s oldvalue=%s, value=%s", pszKey, pszOldValue, pszValue);
  165. }
  166. if (m_pEngine)
  167. {
  168. int rc = evt_engine_process_sysvar(m_pEngine, pszKey, pszValue, pszOldValue, pszEntityName);
  169. if (rc != 0)
  170. {
  171. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process sysvar failed! Error; %d, key=%s oldvalue=%s, value=%s", rc,pszKey, pszOldValue, pszValue);
  172. }
  173. else
  174. {
  175. if (m_nIslog)
  176. {
  177. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process sysvar success");
  178. }
  179. }
  180. }
  181. }
  182. virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  183. const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  184. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo)
  185. {
  186. if (m_nIslog){
  187. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process eLogTpye = %d, dwUserCode = 0x%08x, %s", eLogType, dwUserCode, pszMessage);
  188. }
  189. if (m_pEngine) {
  190. int rc = evt_engine_process_log(m_pEngine, SubIDs, nLogID, eLogType, eLevel, dwSysError, dwUserCode, wEntityDevelID, pszEntityName, pszModuleName, pszMessage);
  191. if (rc != 0) {
  192. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process log failed! Error: %d", rc);
  193. }
  194. }
  195. }
  196. private:
  197. struct CTimerWrap : public ITimerListener, public IReleasable
  198. {
  199. virtual ~CTimerWrap() {}
  200. virtual void OnTimeout(DWORD dwTimerID)
  201. {
  202. (*m_pTimerCallback)((int)dwTimerID, pUserData);
  203. }
  204. evt_engine_timer_func m_pTimerCallback;
  205. void *pUserData;
  206. };
  207. //.....
  208. int set_timer(int timer_id, int interval, evt_engine_timer_func timer_cb, void *timer_user_data)
  209. {
  210. CTimerWrap *pWarp = new CTimerWrap();
  211. pWarp->m_pTimerCallback = timer_cb;
  212. pWarp->pUserData = timer_user_data;
  213. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  214. ErrorCodeEnum Error = spEntityFunction->SetTimer((DWORD)timer_id, pWarp, (DWORD)interval);
  215. if (Error != Error_Succeed) {
  216. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set timer %d failed!", timer_id);
  217. delete pWarp;
  218. }
  219. else {
  220. spEntityFunction->SetTimerData((DWORD)timer_id, pWarp);
  221. }
  222. return (int)Error;
  223. }
  224. int kill_timer(int timer_id)
  225. {
  226. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  227. CSmartPointer<IReleasable> pWarp;
  228. spEntityFunction->GetTimerData((DWORD)timer_id, pWarp);
  229. spEntityFunction->KillTimer((DWORD)timer_id);
  230. return 0;
  231. }
  232. int subscribe_log(unsigned long long *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage)
  233. {
  234. CUUID uuid;
  235. ErrorCodeEnum Error = GetFunction()->SubscribeLog(uuid, this, eLogType, eSeverityLevel, eSysError, dwUserCode, szEntity, bIgnoreMessage);
  236. if (Error != Error_Succeed) {
  237. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe log failed! Error = %d", Error);
  238. } else {
  239. *sub_id = (unsigned long long)uuid;
  240. if (m_nIslog)
  241. {
  242. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe log ok!");
  243. }
  244. }
  245. return (int)Error;
  246. }
  247. int unsubscribe_log(unsigned long long sub_id)
  248. {
  249. ErrorCodeEnum Error = GetFunction()->UnsubscribeLog(sub_id);
  250. if (Error == Error_Succeed) {
  251. if (m_nIslog){
  252. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unsubscribe log ok!");
  253. }
  254. }
  255. else {
  256. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unsubscribe log failed! Error = %d", Error);
  257. }
  258. return (int)Error;
  259. }
  260. int subscribe_sysevent()
  261. {
  262. if (m_nIslog){
  263. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe sysevent!");
  264. }
  265. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  266. return (int)spEntityFunction->RegistSysVarEvent("*", this);
  267. }
  268. int unsubscribe_sysevent()
  269. {
  270. if (m_nIslog){
  271. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unsubscribe sysevent!");
  272. }
  273. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  274. return (int)spEntityFunction->UnregistSysVarEvent("*");
  275. }
  276. int get_sysevent(const char *key, CSimpleStringA &strValue)
  277. {
  278. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  279. return (int)spEntityFunction->GetSysVar(key, strValue);
  280. }
  281. int set_sysevent(const char *key,const char *val)
  282. {
  283. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  284. return (int)spEntityFunction->SetSysVar(key, val);
  285. }
  286. int get_entity_id(const char *entity)
  287. {
  288. CEntityStaticInfo Info;
  289. CSmartPointer<IEntityFunction> spEntityFunction = GetFunction();
  290. ErrorCodeEnum Error = spEntityFunction->GetEntityStaticInfo(entity, Info);
  291. if (Error == Error_Succeed) {
  292. return (int)Info.wEntityDevelopID;
  293. }
  294. else {
  295. return -1; // failed
  296. }
  297. }
  298. int new_timer_id()
  299. {
  300. return ++m_lIdSeq;
  301. }
  302. static int __set_timer(evt_engine_t *engine, int timer_id, int interval, evt_engine_timer_func timer_cb, void *timer_user_data, void *user_data)
  303. {
  304. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  305. return pThis->set_timer(timer_id, interval, timer_cb, timer_user_data);
  306. }
  307. static int __kill_timer(evt_engine_t *engine, int timer_id, void *user_data)
  308. {
  309. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  310. return pThis->kill_timer(timer_id);
  311. }
  312. static int __subscribe_log(evt_engine_t *engine, unsigned long long *sub_id, LogTypeEnum eLogType, const char *szEntity, SeverityLevelEnum eSeverityLevel, ErrorCodeEnum eSysError, DWORD dwUserCode, bool bIgnoreMessage, void *user_data)
  313. {
  314. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  315. return pThis->subscribe_log(sub_id, eLogType, szEntity, eSeverityLevel, eSysError, dwUserCode, bIgnoreMessage);
  316. }
  317. static int __unsubscribe_log(evt_engine_t *engine, unsigned long long sub_id, void *user_data)
  318. {
  319. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  320. return pThis->unsubscribe_log(sub_id);
  321. }
  322. static int __subscribe_sysevent(evt_engine_t *engine, void *user_data)
  323. {
  324. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  325. return pThis->subscribe_sysevent();
  326. }
  327. static int __unsubscribe_sysevent(evt_engine_t *engine, void *user_data)
  328. {
  329. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  330. return pThis->unsubscribe_sysevent();
  331. }
  332. static int __get_sysevent(evt_engine_t *engine, const char *key, CSimpleStringA &strValue, void *user_data)
  333. {
  334. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  335. return pThis->get_sysevent(key, strValue);
  336. }
  337. static int __set_sysevent(evt_engine_t *engine, const char *key,const char *val, void *user_data)
  338. {
  339. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  340. return pThis->set_sysevent(key, val);
  341. }
  342. static int __get_entity_id(evt_engine_t *engine, const char *entity, void *user_data)
  343. {
  344. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  345. return pThis->get_entity_id(entity);
  346. }
  347. static int __new_timer_id(evt_engine_t *engine, void *user_data)
  348. {
  349. CEventConverterEntity *pThis = static_cast<CEventConverterEntity *>(user_data);
  350. return pThis->new_timer_id();
  351. }
  352. private:
  353. LONG m_lIdSeq;
  354. evt_engine_t *m_pEngine;
  355. int m_nIslog;
  356. DeviceTypeEnum m_eDeviceType;
  357. };
  358. SP_BEGIN_ENTITY_MAP()
  359. SP_ENTITY(CEventConverterEntity)
  360. SP_END_ENTITY_MAP()