mod_evtconverter.cpp 12 KB

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