evtengine.cpp 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702
  1. #include "stdafx.h"
  2. #include "evtengine.h"
  3. #include "list.h"
  4. #include "array.h"
  5. #include "spinlock.h"
  6. #include "hashset.h"
  7. #include "hash.h"
  8. #include "jhash.h"
  9. #include "strutil.h"
  10. #include "fileutil.h"
  11. #include "scew.h"
  12. #include "SipphoneEvent.hpp"
  13. #include "CustomerApproachEvent.hpp"
  14. #if 0
  15. <?xml version="1.0" encoding="utf-8"?>
  16. <Transfer xmlns="test">
  17. <SlotList>
  18. <Slot Code="A" Timeout="1:00" OnceTrigger="true">
  19. <Filter></Filter>
  20. <Reset Source="B"/>
  21. <Reset Source="C"/>
  22. </Slot>
  23. <Slot Code="B" Timeout="" OnceTrigger="false">
  24. </Slot>
  25. </SlotList>
  26. <TriggerList>
  27. <Trigger LogType="Log_Warning" UserCode="2001" SeverityLevel="Severity_High" SysError="Error_Close" Message="">
  28. <Slot Code="Test2.TestSlot1" Positive="true"/>
  29. <Slot Code="TestSlot2"/>
  30. <SysVar Code="RunState">
  31. <State>O</State>
  32. <State>M</State>
  33. </SysVar>
  34. <SysVar Code="NetState" Positive="false">
  35. <State>D</State>
  36. </SysVar>
  37. </Trigger>
  38. </TriggerList>
  39. </Transfer>
  40. #endif
  41. #define BIT_MASK(bit) (1 << (bit))
  42. #ifndef MAX_PATH
  43. #define MAX_PATH 260
  44. #endif
  45. typedef struct evt_filter_key_t evt_filter_key_t;
  46. typedef struct evt_filter_t evt_filter_t;
  47. typedef struct evt_expire_t evt_expire_t;
  48. typedef struct evt_slot_key_t evt_slot_key_t;
  49. typedef struct evt_slot_t evt_slot_t;
  50. typedef struct evt_sysvar_rule_t evt_sysvar_rule_t;
  51. typedef struct evt_sysvar_key_t evt_sysvar_key_t;
  52. typedef struct evt_sysvar_t evt_sysvar_t;
  53. typedef struct evt_slot_rule_t evt_slot_rule_t;
  54. typedef struct evt_trigger_t evt_trigger_t;
  55. typedef struct evt_slotvar_t evt_slotvar_t;
  56. static int nIslog = 0;
  57. struct evt_filter_key_t
  58. {
  59. unsigned long long listen_id; // id
  60. };
  61. struct evt_filter_t
  62. {
  63. evt_filter_key_t key;
  64. int log_type;
  65. int ent_id;
  66. int severity;
  67. int sys_code;
  68. int user_code;
  69. char *entity;
  70. evt_slotvar_t *content_to_var;
  71. evt_slot_t *owner;
  72. struct hlist_node hentry;
  73. };
  74. struct evt_expire_t
  75. {
  76. int timer_id;
  77. int timeout;
  78. evt_slot_t *parent;
  79. };
  80. struct evt_slot_key_t
  81. {
  82. char *code;
  83. unsigned int index_hash_code;
  84. };
  85. struct evt_slotvar_t
  86. {
  87. char *name;
  88. char *init_value;
  89. char *current_value;
  90. };
  91. struct evt_slot_t
  92. {
  93. struct hlist_node hentry;
  94. evt_slot_key_t key;
  95. evt_expire_t *timer;
  96. evt_engine_t *parent;
  97. int once;
  98. array_header_t *arr_filter;
  99. array_header_t *arr_rref_reset;
  100. array_header_t *arr_ref_reset;
  101. array_header_t *arr_reset;
  102. array_header_t *arr_ref_trigger;
  103. array_header_t *arr_slotvar;
  104. int signal_state;
  105. struct list_head use_entry;
  106. struct list_head *use_list_ptr;
  107. };
  108. struct evt_sysvar_rule_t
  109. {
  110. struct list_head entry;
  111. evt_trigger_t *parent;
  112. int positive;
  113. array_header_t *arr_state;
  114. evt_sysvar_t *ref_sysvar;
  115. };
  116. struct evt_sysvar_key_t
  117. {
  118. char *code;
  119. unsigned int index_hash_code;
  120. };
  121. struct evt_sysvar_t
  122. {
  123. struct hlist_node hentry;
  124. evt_sysvar_key_t key;
  125. array_header_t *arr_ref_rule;
  126. struct evt_engine_t *parent;
  127. };
  128. struct evt_slot_rule_t
  129. {
  130. struct list_head entry;
  131. evt_trigger_t *parent;
  132. int positive;
  133. char *code;
  134. char *message;
  135. evt_slot_t *ref_slot;
  136. };
  137. struct evt_trigger_t
  138. {
  139. struct list_head entry;
  140. evt_engine_t *parent;
  141. struct list_head sysvar_list;
  142. struct list_head slot_rule_list;
  143. int log_type;
  144. int severity_level;
  145. int sys_code;
  146. int user_code;
  147. int delay_ms;
  148. int delay_timer_id; // if delay_ms != 0
  149. char *msg;
  150. struct list_head use_entry;
  151. };
  152. struct evt_engine_t
  153. {
  154. evt_engine_callback_t cb;
  155. struct list_head trigger_list;
  156. htable_t *filter_ht;
  157. htable_t *sysvar_ht;
  158. htable_t *slot_ht;
  159. spinlock_t lock;
  160. };
  161. static __inline void env_engine_lock(evt_engine_t *engine)
  162. {
  163. spinlock_enter(&engine->lock, -1);
  164. }
  165. static __inline void env_engine_unlock(evt_engine_t *engine)
  166. {
  167. spinlock_leave(&engine->lock);
  168. }
  169. static __inline unsigned int filter_key_hasher(const evt_filter_key_t *key)
  170. {
  171. return (unsigned int)key->listen_id;
  172. }
  173. static __inline int filter_key_cmp(const evt_filter_key_t *key1, const evt_filter_key_t *key2)
  174. {
  175. return key1->listen_id - key2->listen_id;
  176. }
  177. IMPLEMENT_HTABLE_STATIC(filter, evt_filter_key_t, evt_filter_t, key, hentry, filter_key_hasher, filter_key_cmp)
  178. static __inline unsigned int sysevt_key_hasher(const evt_sysvar_key_t *key)
  179. {
  180. return key->index_hash_code;
  181. }
  182. static __inline int sysevt_key_cmp(const evt_sysvar_key_t *key1, const evt_sysvar_key_t *key2)
  183. {
  184. return strcmp(key1->code, key2->code);
  185. }
  186. IMPLEMENT_HTABLE_STATIC(sysvar, evt_sysvar_key_t, evt_sysvar_t, key, hentry, sysevt_key_hasher, sysevt_key_cmp)
  187. static __inline unsigned int slot_key_hasher(const evt_slot_key_t *key)
  188. {
  189. return key->index_hash_code;
  190. }
  191. static __inline int sysevt_key_cmp(const evt_slot_key_t *key1, const evt_slot_key_t *key2)
  192. {
  193. return strcmp(key1->code, key2->code);
  194. }
  195. IMPLEMENT_HTABLE_STATIC(slot, evt_slot_key_t, evt_slot_t, key, hentry, slot_key_hasher, sysevt_key_cmp)
  196. static int process_trigger_list(evt_engine_t *engine, struct list_head *trigger_list);
  197. static int postprocess_slot_list(evt_engine_t *engine, struct list_head *affect_list);
  198. static void clear_slot_list(struct list_head *affect_list);
  199. static void clear_trigger_list(struct list_head *matched_trigger_list);
  200. static int generate_trigger_log(evt_engine_t *engine, evt_trigger_t *trigger);
  201. static void filter_free(evt_filter_t *filter)
  202. {
  203. if (filter) {
  204. if (filter->entity){
  205. free(filter->entity);
  206. }
  207. free(filter);
  208. }
  209. }
  210. static void slot_free(evt_slot_t *slot)
  211. {
  212. if (slot) {
  213. if (slot->key.code) {
  214. toolkit_free(slot->key.code);
  215. }
  216. if (slot->arr_filter) {
  217. int i;
  218. for (i = 0; i < slot->arr_filter->nelts; ++i) {
  219. evt_filter_t *filter = ARRAY_IDX(slot->arr_filter, i, evt_filter_t*);
  220. filter_free(filter);
  221. }
  222. array_free(slot->arr_filter);
  223. }
  224. if (slot->arr_reset) {
  225. int i;
  226. for (i = 0; i < slot->arr_reset->nelts; ++i) {
  227. toolkit_free(ARRAY_IDX(slot->arr_reset, i, char*));
  228. }
  229. array_free(slot->arr_reset);
  230. }
  231. if (slot->arr_ref_trigger) {
  232. array_free(slot->arr_ref_trigger);
  233. }
  234. if (slot->arr_rref_reset) {
  235. array_free(slot->arr_rref_reset);
  236. }
  237. if (slot->arr_ref_reset) {
  238. array_free(slot->arr_ref_reset);
  239. }
  240. if (slot->arr_slotvar) {
  241. int i;
  242. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  243. evt_slotvar_t *slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  244. if (slotvar->name){
  245. free(slotvar->name);
  246. }
  247. if (slotvar->init_value) {
  248. free(slotvar->init_value);
  249. }
  250. if (slotvar->current_value){
  251. free(slotvar->current_value);
  252. }
  253. free(slotvar);
  254. }
  255. array_free(slot->arr_slotvar);
  256. }
  257. if (slot->timer) {
  258. if (slot->signal_state) {
  259. int rc;
  260. evt_engine_t *engine = slot->parent;
  261. rc = engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  262. if (rc != 0)
  263. if (nIslog){
  264. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("kill timer %d failed!", slot->timer->timer_id);
  265. }
  266. slot->timer->timer_id = -1;
  267. }
  268. free(slot->timer);
  269. }
  270. free(slot);
  271. }
  272. }
  273. static void sysvar_free(evt_sysvar_t *sysvar)
  274. {
  275. if (sysvar) {
  276. if (sysvar->arr_ref_rule) {
  277. array_free(sysvar->arr_ref_rule);
  278. }
  279. if (sysvar->key.code){
  280. free(sysvar->key.code);
  281. }
  282. free(sysvar);
  283. }
  284. }
  285. static void trigger_free(evt_trigger_t *trigger)
  286. {
  287. if (trigger) {
  288. evt_slot_rule_t *slot_rule, *n1;
  289. evt_sysvar_rule_t *sysvar_rule, *n2;
  290. if (trigger->msg) {
  291. free(trigger->msg);
  292. }
  293. list_for_each_entry_safe(slot_rule, n1, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  294. list_del(&slot_rule->entry);
  295. //if (slot_rule->code)
  296. //free(slot_rule->code);
  297. free(slot_rule);
  298. }
  299. list_for_each_entry_safe(sysvar_rule, n2, &trigger->sysvar_list, evt_sysvar_rule_t, entry) {
  300. list_del(&sysvar_rule->entry);
  301. if (sysvar_rule->arr_state) {
  302. int i;
  303. for (i = 0; i < sysvar_rule->arr_state->nelts; ++i) {
  304. free(ARRAY_IDX(sysvar_rule->arr_state, i, char*));
  305. }
  306. array_free(sysvar_rule->arr_state);
  307. }
  308. free(sysvar_rule);
  309. }
  310. free(trigger);
  311. }
  312. }
  313. static void slot_rule_free(evt_slot_rule_t *rule)
  314. {
  315. if (rule) {
  316. if (rule->code){
  317. free(rule->code);
  318. }
  319. if (rule->message) {
  320. free(rule->message);
  321. }
  322. free(rule);
  323. }
  324. }
  325. static void sysvar_rule_free(evt_sysvar_rule_t *rule)
  326. {
  327. if (rule) {
  328. if (rule->arr_state) {
  329. int i;
  330. for (i = 0; i < rule->arr_state->nelts; ++i) {
  331. free(ARRAY_IDX(rule->arr_state, i, char*));
  332. }
  333. array_free(rule->arr_state);
  334. }
  335. free(rule);
  336. }
  337. }
  338. static void output_char(char **po, int *poi, int *pon, char *s, int sn)
  339. {
  340. char *o = *po;
  341. int on = *pon;
  342. int oi = *poi;
  343. if (sn == -1)
  344. sn = strlen(s);
  345. while (on-oi <= sn) {
  346. on = on * 2;
  347. o = (char*)realloc(o, on);
  348. }
  349. memcpy(o+oi, s, sn);
  350. oi += sn;
  351. *po = o;
  352. *poi = oi;
  353. *pon = on;
  354. }
  355. static evt_slotvar_t *slot_find_var(evt_slot_t *slot, char *s)
  356. {
  357. int i;
  358. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  359. evt_slotvar_t *slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  360. if (_stricmp(slotvar->name, s) == 0)
  361. return slotvar;
  362. }
  363. return NULL;
  364. }
  365. static char *expand_slot_rule_message(evt_slot_rule_t *slot_rule)
  366. {
  367. int oi = 0;
  368. int on = 32;
  369. char *o = (char*)malloc(on);
  370. int m = 0;
  371. char *s = NULL;
  372. char *p = slot_rule->message;
  373. while (*p) {
  374. if (m == 0) {
  375. if (p[0] == '$' && p[1] == '(') {
  376. m = 1;
  377. p++;
  378. }
  379. else {
  380. output_char(&o, &oi, &on, p, 1);
  381. }
  382. }
  383. else {
  384. if (p[0] == ')') {
  385. if (s) {
  386. char *t = (char*)malloc(p - s + 1);
  387. memcpy(t, s, p-s);
  388. t[p-s] = 0;
  389. evt_slotvar_t *slotvar = slot_find_var(slot_rule->ref_slot, t);
  390. free(t);
  391. if (slotvar) {
  392. output_char(&o, &oi, &on, slotvar->current_value, -1);
  393. }
  394. s = NULL;
  395. m = 0;
  396. }
  397. } else {
  398. if (!s) {
  399. s = p;
  400. }
  401. }
  402. }
  403. p++;
  404. }
  405. o[oi] = 0;
  406. return o;
  407. }
  408. static char *expand_trigger_message(evt_trigger_t *trigger)
  409. {
  410. int oi = 0;
  411. int on = 32;
  412. char *o = (char*)malloc(on);
  413. evt_slot_rule_t *tpos;
  414. list_for_each_entry(tpos, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  415. if (tpos->message) {
  416. char *t = expand_slot_rule_message(tpos);
  417. if (t) {
  418. output_char(&o, &oi, &on, t, -1);
  419. free(t);
  420. }
  421. }
  422. }
  423. if (trigger->msg) {
  424. output_char(&o, &oi, &on, trigger->msg, -1);
  425. }
  426. o[oi] = 0;
  427. return o;
  428. }
  429. static void get_matched_slot_list(evt_engine_t *engine, const CAutoArray<CUUID> &SubIDs, int log_type, int ent_id, int severity, int sys_code, int usr_code, const char *message, struct list_head *use_list)
  430. {
  431. #if 0
  432. evt_filter_key_t k;
  433. int i, j;
  434. for (j = 0; j < 3; ++j) {
  435. if (j == 0) {
  436. k.user_code = usr_code; // strict match
  437. } else if (j == 1) {
  438. k.user_code = -2; // accept any
  439. } else {
  440. if (usr_code) {
  441. k.user_code = -1; // reject ones that has no user code
  442. } else {
  443. continue;
  444. }
  445. }
  446. for (i = 0; i < engine->masks_cnt; ++i) {
  447. evt_filter_t *filter;
  448. int t = engine->masks[i];
  449. k.log_type = (t & BIT_MASK(LOG_FILTER_BIT_LOGTYPE)) ? Log_Ignore : log_type;
  450. k.ent_id = (t & BIT_MASK(LOG_FILTER_BIT_ENTITY)) ? -1 : ent_id;
  451. k.severity = (t & BIT_MASK(LOG_FILTER_BIT_SEVERITY)) ? Severity_None : severity;
  452. k.sys_code = (t & BIT_MASK(LOG_FILTER_BIT_SYSCODE)) ? Error_IgnoreAll : sys_code;
  453. k.index_hash_code = hash_filter(k.log_type, k.ent_id, k.severity, k.sys_code, k.user_code);
  454. filter = filter_find(engine->filter_ht, &k);
  455. while (filter) {
  456. int ii;
  457. for (ii = 0; ii < filter->arr_ref_slot->nelts; ++ii) {
  458. evt_slot_t *slot = ARRAY_IDX(filter->arr_ref_slot, ii, evt_slot_t*);
  459. if (!slot->use_entry.next) {
  460. list_add_tail(&slot->use_entry, use_list);
  461. slot->use_list_ptr = use_list;
  462. }
  463. }
  464. filter = filter_find_continue(engine->filter_ht, &filter->hentry, &k);
  465. }
  466. }
  467. }
  468. #endif
  469. int i;
  470. for (i = 0; i < SubIDs.GetCount(); ++i) {
  471. evt_filter_t *filter;
  472. evt_filter_key_t k;
  473. k.listen_id = (unsigned int)SubIDs[i];
  474. filter = filter_find(engine->filter_ht, &k);
  475. if (filter) {
  476. evt_slot_t *slot = filter->owner;
  477. if (nIslog){
  478. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("filter found, usr_code:%d, listen_id:%d", usr_code, k.listen_id);
  479. }
  480. if (!slot->use_entry.next) {
  481. list_add_tail(&slot->use_entry, use_list);
  482. slot->use_list_ptr = use_list;
  483. }
  484. if (filter->content_to_var) {
  485. if (filter->content_to_var->current_value) {
  486. free(filter->content_to_var->current_value);
  487. }
  488. filter->content_to_var->current_value = _strdup(message);
  489. }
  490. }
  491. else {
  492. if (nIslog){
  493. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot find filter, listen_id:%d", k.listen_id);
  494. }
  495. }
  496. }
  497. }
  498. static void get_reset_slot_list(evt_engine_t *engine, struct list_head *matched_list, struct list_head *reset_list)
  499. {
  500. evt_slot_t *pos;
  501. list_for_each_entry(pos, matched_list, evt_slot_t, use_entry) {
  502. if (pos->arr_ref_reset) {
  503. int i;
  504. for (i = 0; i < pos->arr_ref_reset->nelts; ++i) {
  505. evt_slot_t *t = ARRAY_IDX(pos->arr_ref_reset, i, evt_slot_t*);
  506. if (!t->use_entry.next) {
  507. list_add_tail(&t->use_entry, reset_list);
  508. t->use_list_ptr = reset_list;
  509. }
  510. else {
  511. if (t->use_list_ptr == matched_list) {
  512. if (nIslog){
  513. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("warning: slot %s already set, cannot reset from slot %s ", t->key.code, pos->key.code);
  514. }
  515. }
  516. else if (t->use_list_ptr == reset_list) {
  517. // already triggers by others
  518. }
  519. else {
  520. if (nIslog){
  521. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("bug detected! %s%d", __FUNCTION__, __LINE__);
  522. }
  523. }
  524. }
  525. }
  526. }
  527. }
  528. }
  529. static void get_matched_trigger_list(evt_engine_t *engine, struct list_head *use_slot_list, struct list_head *use_trigger_list)
  530. {
  531. evt_slot_t *pos;
  532. list_for_each_entry(pos, use_slot_list, evt_slot_t, use_entry) {
  533. int i;
  534. for (i = 0; i < pos->arr_ref_trigger->nelts; ++i) {
  535. evt_trigger_t *trigger = ARRAY_IDX(pos->arr_ref_trigger, i, evt_trigger_t*);
  536. if (!trigger->use_entry.next) {
  537. list_add_tail(&trigger->use_entry, use_trigger_list);
  538. }
  539. }
  540. }
  541. }
  542. static void timer_cb(int timer_id, void *user_data)
  543. {
  544. evt_slot_t *slot = (evt_slot_t*)user_data;
  545. evt_engine_t *engine = slot->parent;
  546. if (timer_id == slot->timer->timer_id) {
  547. int rc;
  548. struct list_head affect_list = LIST_HEAD_INIT(affect_list);
  549. struct list_head trigger_list = LIST_HEAD_INIT(trigger_list);
  550. list_add_tail(&slot->use_entry, &affect_list);
  551. slot->use_list_ptr = &affect_list;
  552. slot->signal_state = !slot->signal_state;
  553. if (!slot->signal_state && slot->arr_slotvar) {
  554. int i;
  555. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  556. evt_slotvar_t *slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t *);
  557. free(slotvar->current_value);
  558. slotvar->current_value = _strdup(slotvar->init_value);
  559. }
  560. }
  561. engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  562. slot->timer->timer_id = -1;
  563. get_matched_trigger_list(engine, &affect_list, &trigger_list);
  564. rc = process_trigger_list(engine, &trigger_list);
  565. if (rc != 0) {
  566. if (nIslog){
  567. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process trigger list failed!");
  568. }
  569. return;
  570. }
  571. rc = postprocess_slot_list(engine, &affect_list);
  572. if (rc != 0) {
  573. if (nIslog){
  574. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("postprocess slotlist failed!");
  575. }
  576. return;
  577. }
  578. clear_slot_list(&affect_list);
  579. clear_trigger_list(&trigger_list);
  580. }
  581. }
  582. static void trigger_timer_cb(int timer_id, void *user_data)
  583. {
  584. evt_trigger_t *trigger = (evt_trigger_t *)user_data;
  585. evt_engine_t *engine = trigger->parent;
  586. if (timer_id == trigger->delay_timer_id) {
  587. generate_trigger_log(engine, trigger);
  588. engine->cb.kill_timer(engine, trigger->delay_timer_id, engine->cb.user_data);
  589. trigger->delay_timer_id = -1;
  590. }
  591. }
  592. static int process_matched_slot(evt_engine_t *engine, evt_slot_t *slot, int *removed)
  593. {
  594. int rc = 0;
  595. if (slot->signal_state) {
  596. // reset timer
  597. if (slot->timer) {
  598. rc = engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  599. if (rc != 0) {
  600. if (nIslog){
  601. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("kill timer failed! slot: %s, timer_id: %d", slot->key.code, slot->timer->timer_id);
  602. }
  603. }
  604. else {
  605. int new_id = engine->cb.new_timer_id(engine, engine->cb.user_data);
  606. slot->timer->timer_id = new_id;
  607. rc = engine->cb.set_timer(engine, new_id, slot->timer->timeout, &timer_cb, slot, engine->cb.user_data);
  608. if (rc != 0) {
  609. if (nIslog){
  610. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set timer failed! slot: %s, timer_id: %d", slot->key.code, new_id);
  611. }
  612. }
  613. }
  614. }
  615. if (removed){
  616. *removed = 1;
  617. }
  618. }
  619. else {
  620. slot->signal_state = !slot->signal_state;
  621. if (slot->timer) {
  622. int new_id = engine->cb.new_timer_id(engine, engine->cb.user_data);
  623. slot->timer->timer_id = new_id;
  624. rc = engine->cb.set_timer(engine, new_id, slot->timer->timeout, &timer_cb, slot, engine->cb.user_data);
  625. if (rc != 0) {
  626. if (nIslog){
  627. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set timer failed! slot: %s, timer_id: %d", slot->key.code, new_id);
  628. }
  629. }
  630. }
  631. if (removed) {
  632. *removed = 0;
  633. }
  634. }
  635. return rc;
  636. }
  637. static int process_matched_slot_list(evt_engine_t *engine, struct list_head *slot_list)
  638. {
  639. evt_slot_t *pos, *n;
  640. int rc = 0;
  641. list_for_each_entry_safe(pos, n, slot_list, evt_slot_t, use_entry) {
  642. int removed;
  643. rc = process_matched_slot(engine, pos, &removed);
  644. if (rc != 0) {
  645. if (nIslog){
  646. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process matched slot %s failed!", pos->key.code);
  647. }
  648. break;
  649. }
  650. if (removed) {
  651. list_del(&pos->use_entry);
  652. pos->use_entry.next = pos->use_entry.prev = NULL;
  653. pos->use_list_ptr = NULL;
  654. }
  655. }
  656. return rc;
  657. }
  658. static int process_reset_slot(evt_engine_t *engine, evt_slot_t *slot, int *removed)
  659. {
  660. int rc = 0;
  661. if (nIslog){
  662. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process reset slot: %s, current signal:%d", slot->key.code, slot->signal_state);
  663. }
  664. if (slot->signal_state) {
  665. slot->signal_state = !slot->signal_state;
  666. if (slot->timer) {
  667. rc = engine->cb.kill_timer(engine, slot->timer->timer_id, engine->cb.user_data);
  668. slot->timer->timer_id = -1;
  669. }
  670. if (removed){
  671. *removed = 0;
  672. }
  673. if (slot->arr_slotvar) {
  674. int i;
  675. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  676. evt_slotvar_t* slotvar = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  677. free(slotvar->current_value);
  678. slotvar->current_value = _strdup(slotvar->init_value);
  679. }
  680. }
  681. }
  682. else {
  683. if (removed){
  684. *removed = 1;
  685. }
  686. }
  687. return rc;
  688. }
  689. static int process_reset_slot_list(evt_engine_t *engine, struct list_head *reset_list)
  690. {
  691. evt_slot_t *pos, *n;
  692. int rc = 0;
  693. list_for_each_entry_safe(pos, n, reset_list, evt_slot_t, use_entry) {
  694. int removed;
  695. rc = process_reset_slot(engine, pos, &removed);
  696. if (rc != 0) {
  697. if (nIslog){
  698. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process reset slot %s failed!", pos->key.code);
  699. }
  700. break;
  701. }
  702. if (removed) {
  703. list_del(&pos->use_entry);
  704. pos->use_entry.next = pos->use_entry.prev = NULL;
  705. pos->use_list_ptr = NULL;
  706. }
  707. }
  708. return rc;
  709. }
  710. static int generate_trigger_log(evt_engine_t *engine, evt_trigger_t *trigger)
  711. {
  712. int rc = Error_Succeed;
  713. char *msg = expand_trigger_message(trigger);
  714. switch (trigger->log_type) {
  715. case Log_Warning:
  716. LogWarn((SeverityLevelEnum)trigger->severity_level,(ErrorCodeEnum)trigger->sys_code, (DWORD)trigger->user_code,msg);
  717. break;
  718. case Log_Debug:
  719. LogTrace(msg, __FILE__, __LINE__);
  720. break;
  721. case Log_Error:
  722. LogError((SeverityLevelEnum)trigger->severity_level, (ErrorCodeEnum)trigger->sys_code, trigger->user_code, msg);
  723. break;
  724. case Log_Event:
  725. LogEvent((SeverityLevelEnum)trigger->severity_level, (DWORD)trigger->user_code, msg);
  726. break;
  727. default:
  728. if (nIslog){
  729. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("bug detected! %s %d", __FUNCTION__, __LINE__);
  730. }
  731. assert(0);
  732. rc = Error_Bug;
  733. }
  734. free(msg);
  735. return rc;
  736. }
  737. static int process_trigger(evt_engine_t *engine, evt_trigger_t *trigger)
  738. {
  739. int rc = 0;
  740. int ok = 0;
  741. if (nIslog){
  742. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process_trigger %s begin!", trigger->msg);
  743. }
  744. {
  745. evt_slot_rule_t *pos;
  746. list_for_each_entry(pos, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  747. if (nIslog){
  748. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot rule, code:%s positive:%d signal:%d", pos->code, pos->positive, pos->ref_slot->signal_state);
  749. }
  750. if (pos->positive ^ pos->ref_slot->signal_state)
  751. goto on_done;
  752. }
  753. }
  754. {
  755. evt_sysvar_rule_t *pos;
  756. list_for_each_entry(pos, &trigger->sysvar_list, evt_sysvar_rule_t, entry) {
  757. int i;
  758. CSimpleStringA strState;
  759. rc = engine->cb.get_sysevent(engine, pos->ref_sysvar->key.code, strState, engine->cb.user_data);
  760. if (rc != 0) {
  761. if (nIslog){
  762. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get sysvar failed!");
  763. }
  764. goto on_done;
  765. }
  766. if (nIslog){
  767. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sysvar key=%s, value=%s", pos->ref_sysvar->key.code, (LPCSTR)strState);
  768. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sysvar rule, %s, positive:%d", pos->ref_sysvar->key.code, pos->positive);
  769. }
  770. if (pos->positive) {
  771. for (i = 0; i < pos->arr_state->nelts; ++i) {
  772. char *state = ARRAY_IDX(pos->arr_state, i, char*);
  773. if (nIslog){
  774. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sys var state:%s", state);
  775. }
  776. if (strcmp(strState, state) == 0) {
  777. break;
  778. }
  779. }
  780. if (i == pos->arr_state->nelts) {
  781. goto on_done;
  782. }
  783. }
  784. else {
  785. for (i = 0; i < pos->arr_state->nelts; ++i) {
  786. char *state = ARRAY_IDX(pos->arr_state, i, char*);
  787. if (nIslog){
  788. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sys var state:%s", state);
  789. }
  790. if (strcmp(strState, state) == 0) {
  791. goto on_done;
  792. }
  793. }
  794. }
  795. }
  796. }
  797. ok = 1;
  798. on_done:
  799. if (ok) {
  800. if (trigger->delay_ms != 0 && trigger->delay_timer_id == -1) {
  801. trigger->delay_timer_id = engine->cb.new_timer_id(engine, engine->cb.user_data);
  802. rc = engine->cb.set_timer(engine, trigger->delay_timer_id, trigger->delay_ms, &trigger_timer_cb, trigger, engine->cb.user_data);
  803. if (rc != 0) {
  804. if (nIslog){
  805. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set timer failed!");
  806. }
  807. }
  808. } else {
  809. rc = generate_trigger_log(engine, trigger);
  810. if (rc != 0) {
  811. if (nIslog){
  812. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("generate trigger log failed!");
  813. }
  814. }
  815. }
  816. }
  817. else {
  818. if (trigger->delay_timer_id != -1) {
  819. engine->cb.kill_timer(engine, trigger->delay_timer_id, engine->cb.user_data);
  820. trigger->delay_timer_id = -1;
  821. }
  822. }
  823. if (nIslog){
  824. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("process_trigger end (ok=%d)!", ok);
  825. }
  826. return rc;
  827. }
  828. static int process_trigger_list(evt_engine_t *engine, struct list_head *trigger_list)
  829. {
  830. evt_trigger_t *pos;
  831. int rc = 0;
  832. list_for_each_entry(pos, trigger_list, evt_trigger_t, use_entry) {
  833. rc = process_trigger(engine, pos);
  834. if (rc != 0){
  835. break;
  836. }
  837. }
  838. return rc;
  839. }
  840. static int postprocess_slot_list(evt_engine_t *engine, struct list_head *affect_list)
  841. {
  842. int rc = 0;
  843. evt_slot_t *pos;
  844. list_for_each_entry(pos, affect_list, evt_slot_t, use_entry) {
  845. if (pos->once && pos->signal_state) {
  846. pos->signal_state = !pos->signal_state;
  847. if (pos->timer) {
  848. rc = engine->cb.kill_timer(engine, pos->timer->timer_id, engine->cb.user_data);
  849. pos->timer->timer_id = -1;
  850. if (rc != 0) {
  851. if (nIslog){
  852. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("postprocess slot %s failed!", pos->key.code);
  853. }
  854. return rc;
  855. }
  856. }
  857. }
  858. }
  859. return rc;
  860. }
  861. static void clear_slot_list(struct list_head *affect_list)
  862. {
  863. evt_slot_t *pos, *n;
  864. list_for_each_entry_safe(pos, n, affect_list, evt_slot_t, use_entry) {
  865. list_del(&pos->use_entry);
  866. pos->use_entry.next = pos->use_entry.prev = NULL;
  867. pos->use_list_ptr = NULL;
  868. }
  869. }
  870. static void clear_trigger_list(struct list_head *matched_trigger_list)
  871. {
  872. evt_trigger_t *pos, *n;
  873. list_for_each_entry_safe(pos, n, matched_trigger_list, evt_trigger_t, use_entry) {
  874. list_del(&pos->use_entry);
  875. pos->use_entry.next = pos->use_entry.prev = NULL;
  876. }
  877. };
  878. static int process_log(evt_engine_t *engine, const CAutoArray<CUUID> &SubIDs, int log_type, int ent_id, int severity, int sys_code, int usr_code, const char *message)
  879. {
  880. int rc;
  881. struct list_head matched_list = LIST_HEAD_INIT(matched_list);
  882. struct list_head reset_list = LIST_HEAD_INIT(reset_list);
  883. struct list_head affect_list = LIST_HEAD_INIT(affect_list);
  884. struct list_head matched_trigger_list = LIST_HEAD_INIT(matched_trigger_list);
  885. get_matched_slot_list(engine, SubIDs,log_type, ent_id, severity, sys_code, usr_code, message, &matched_list);
  886. if (list_empty(&matched_list)) {
  887. if (nIslog){
  888. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("warning: no matched slot! sys_code = %d, usr_code = %d", sys_code, usr_code);
  889. }
  890. return 0;
  891. }
  892. get_reset_slot_list(engine, &matched_list, &reset_list);
  893. rc = process_matched_slot_list(engine, &matched_list);
  894. if (rc != 0) {
  895. if (nIslog){
  896. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process matched slot list failed!");
  897. }
  898. return rc;
  899. }
  900. rc = process_reset_slot_list(engine, &reset_list);
  901. if (rc != 0) {
  902. if (nIslog){
  903. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process reset slot list failed!");
  904. }
  905. return rc;
  906. }
  907. list_splice_tail(&matched_list, &affect_list);
  908. list_splice_tail(&reset_list, &affect_list);
  909. get_matched_trigger_list(engine, &affect_list, &matched_trigger_list);
  910. rc = process_trigger_list(engine, &matched_trigger_list);
  911. if (rc != 0) {
  912. if (nIslog){
  913. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process trigger list failed!");
  914. }
  915. return rc;
  916. }
  917. rc = postprocess_slot_list(engine, &affect_list);
  918. if (rc != 0) {
  919. if (nIslog){
  920. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("postprocess slot list failed!");
  921. }
  922. return rc;
  923. }
  924. clear_slot_list(&affect_list);
  925. clear_trigger_list(&matched_trigger_list);
  926. return rc;
  927. }
  928. static int process_sysvar(evt_engine_t *engine, evt_sysvar_t *sysvar, const char *old_value, const char *curr_value)
  929. {
  930. int i;
  931. int rc = 0;
  932. struct list_head trigger_list = LIST_HEAD_INIT(trigger_list);
  933. for (i = 0; i < sysvar->arr_ref_rule->nelts; ++i) {
  934. evt_sysvar_rule_t *rule = ARRAY_IDX(sysvar->arr_ref_rule, i, evt_sysvar_rule_t*);
  935. evt_trigger_t *trigger = rule->parent;
  936. if (!trigger->use_entry.next) {
  937. list_add_tail(&trigger->use_entry, &trigger_list);
  938. }
  939. }
  940. rc = process_trigger_list(engine, &trigger_list);
  941. if (rc != 0) {
  942. if (nIslog){
  943. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process trigger list failed!");
  944. }
  945. }
  946. clear_trigger_list(&trigger_list);
  947. return rc;
  948. }
  949. static int build_ref(evt_engine_t *engine)
  950. {
  951. int i;
  952. evt_trigger_t *trigger;
  953. for (i = 0; i < engine->slot_ht->size; ++i) {
  954. evt_slot_t *tpos;
  955. struct hlist_node *pos;
  956. hlist_for_each_entry(tpos, pos, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  957. int j;
  958. for (j = 0; j < tpos->arr_reset->nelts; ++j) {
  959. char *code = ARRAY_IDX(tpos->arr_reset, j, char*);
  960. evt_slot_key_t key;
  961. key.code = code;
  962. key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  963. evt_slot_t *ref_slot = slot_find(engine->slot_ht, &key);
  964. if (ref_slot) {
  965. ARRAY_PUSH(ref_slot->arr_rref_reset, evt_slot_t*) = tpos;
  966. ARRAY_PUSH(tpos->arr_ref_reset, evt_slot_t*) = ref_slot;
  967. }
  968. else {
  969. if (nIslog){
  970. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot build reset ref for slot %s->%s", tpos->key.code, code);
  971. }
  972. return Error_Unexpect;
  973. }
  974. }
  975. }
  976. }
  977. list_for_each_entry(trigger, &engine->trigger_list, evt_trigger_t, entry) {
  978. evt_slot_rule_t *rule;
  979. list_for_each_entry(rule, &trigger->slot_rule_list, evt_slot_rule_t, entry) {
  980. evt_slot_key_t key;
  981. key.code = rule->code;
  982. key.index_hash_code = hash32_str(key.code, HASH32_STR_INIT);
  983. evt_slot_t *ref_slot = slot_find(engine->slot_ht, &key);
  984. if (ref_slot) {
  985. rule->ref_slot = ref_slot;
  986. ARRAY_PUSH(ref_slot->arr_ref_trigger, evt_trigger_t*) = rule->parent;
  987. }
  988. else {
  989. if (nIslog){
  990. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger.slot %s cannot find code!", rule->code);
  991. }
  992. return Error_Unexpect;
  993. }
  994. }
  995. }
  996. return 0;
  997. }
  998. // HH:MM:SS.mmm or MM:SS.mmm or xxxms or xxx
  999. // 10:10:10 -> 10h 10m 10 second
  1000. // 1:00 -> 1min = 1000ms
  1001. // 1s -> 1 second = 1000ms
  1002. // 1000 -> 1000millisecond
  1003. // 1000ms -> 1000millisecond
  1004. // 1min -> 1000millisecond
  1005. // return millisecond
  1006. static int parse_timeout_value(const char *s)
  1007. {
  1008. int t[8] = {0};
  1009. int tc = 0;
  1010. const char *p = s;
  1011. #define PARSE_T_COLON 0x7fff0000
  1012. #define PARSE_T_DOT 0x7fff0001
  1013. #define PARSE_T_MIN 0x7fff0002
  1014. #define PARSE_T_MS 0x7fff0003
  1015. #define PARSE_T_S 0x7fff0004
  1016. #define PARSE_T_H 0x7fff0005
  1017. while (*p && tc < 8) {
  1018. switch (*p) {
  1019. case ':':
  1020. t[tc++] = PARSE_T_COLON;
  1021. p++;
  1022. break;
  1023. case '.':
  1024. t[tc++] = PARSE_T_DOT;
  1025. p++;
  1026. break;
  1027. case 's':
  1028. t[tc++] = PARSE_T_S;
  1029. p++;
  1030. break;
  1031. case 'h':
  1032. t[tc++] = PARSE_T_H;
  1033. p++;
  1034. break;
  1035. case 'm':
  1036. if (p[1] == 'i' && p[2] == 'n') {
  1037. t[tc++] = PARSE_T_MIN;
  1038. p += 3;
  1039. } else if (p[1] == 's') {
  1040. t[tc++] = PARSE_T_MS;
  1041. p += 2;
  1042. }
  1043. break;
  1044. case '0':
  1045. case '1':
  1046. case '2':
  1047. case '3':
  1048. case '4':
  1049. case '5':
  1050. case '6':
  1051. case '7':
  1052. case '8':
  1053. case '9':
  1054. {
  1055. int x = *p - '0';
  1056. ++p;
  1057. while (*p >= '0' && *p <= '9') {
  1058. x = x * 10 + (*p - '0');
  1059. p++;
  1060. }
  1061. if (x >= 0x7fff0000)
  1062. return -1;
  1063. t[tc++] = x;
  1064. }
  1065. break;
  1066. default:
  1067. return -1;
  1068. }
  1069. }
  1070. switch (tc) {
  1071. case 0:
  1072. return 0;
  1073. case 1:
  1074. if (t[0] < 0x7fff0000)
  1075. return t[0];
  1076. break;
  1077. case 2:
  1078. if (t[0] < 0x7fff0000) {
  1079. if (t[1] == PARSE_T_S) {
  1080. return t[0] * 1000;
  1081. } else if (t[1] == PARSE_T_MS) {
  1082. return t[0];
  1083. } else if (t[1] == PARSE_T_H) {
  1084. return t[0] * 60 * 60 * 1000;
  1085. } else if (t[1] == PARSE_T_MIN) {
  1086. return t[0] * 60 * 1000;
  1087. } else {
  1088. return -1;
  1089. }
  1090. } else if (t[0] == PARSE_T_DOT && t[1] < 0x7fff0000) {
  1091. return t[1];
  1092. }
  1093. break;
  1094. case 3:
  1095. if (t[0] < 0x7fff0000 && t[2] < 0x7fff0000) {
  1096. if (t[1] == PARSE_T_DOT) {
  1097. return t[0] * 1000 + t[2];
  1098. } else if (t[1] == PARSE_T_COLON) {
  1099. return (t[0] * 60 + t[2]) * 1000;
  1100. }
  1101. }
  1102. break;
  1103. case 5:
  1104. if (t[0] < 0x7fff0000 && t[2] < 0x7fff0000 && t[4] < 0x7fff0000 && t[1] == PARSE_T_COLON && t[3] == PARSE_T_COLON)
  1105. return ((t[0] * 60 + t[2]) * 60 + t[4]) * 1000;
  1106. break;
  1107. case 7:
  1108. if (t[0] < 0x7fff0000 && t[2] < 0x7fff0000 && t[4] < 0x7fff0000 && t[1] == PARSE_T_COLON && t[3] == PARSE_T_COLON && t[5] == PARSE_T_DOT && t[6] < 0x7fff0000)
  1109. return ((t[0] * 60 + t[2]) * 60 + t[4]) * 1000 + t[6];
  1110. default:
  1111. break;
  1112. }
  1113. return -1;
  1114. }
  1115. static int parse_bool(const char *s)
  1116. {
  1117. if (_stricmp(s, "true") == 0 || _stricmp(s, "1") == 0) {
  1118. return 1;
  1119. }
  1120. else if (_stricmp(s, "false") == 0 || _stricmp(s, "0") == 0) {
  1121. return 0;
  1122. }
  1123. else {
  1124. if (nIslog){
  1125. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse bool failed! s : %s", s);
  1126. }
  1127. return -1;
  1128. }
  1129. }
  1130. static int parse_log_type(const char *s)
  1131. {
  1132. static const char *keys[] = {"Log_Ignore", "Log_Event", "Log_Warning", "Log_Error", "Log_Debug"};
  1133. int i;
  1134. for (i = 0; i < array_size(keys); ++i) {
  1135. if (_stricmp(s, keys[i]) == 0)
  1136. return i;
  1137. }
  1138. return -1;
  1139. }
  1140. static int parse_ent_id(evt_engine_t *engine, const char *s)
  1141. {
  1142. // get entity devel id
  1143. return engine->cb.get_entity_id(engine, s, engine->cb.user_data);
  1144. }
  1145. static int parse_severity(const char *s)
  1146. {
  1147. static const struct {
  1148. char *key;
  1149. int level;
  1150. } ts[] = {
  1151. {"Severity_None", 0},
  1152. {"Severity_Low", 1},
  1153. {"Severity_Middle", 2},
  1154. {"Severity_High", 3},
  1155. {"0", 0},
  1156. {"1", 1},
  1157. {"2", 2},
  1158. {"3", 3},
  1159. };
  1160. for (int i = 0; i < array_size(ts); ++i) {
  1161. if (_stricmp(s, ts[i].key) == 0) {
  1162. return ts[i].level;
  1163. }
  1164. }
  1165. return -1;
  1166. }
  1167. #define DEF_CODE(x) {#x, x},
  1168. static int parse_sys_code(const char *s)
  1169. {
  1170. static const struct {
  1171. const char *code;
  1172. int code_value;
  1173. }keys[] = {
  1174. DEF_CODE(Error_Succeed)
  1175. DEF_CODE(Error_DataCheck)
  1176. DEF_CODE(Error_Null)
  1177. DEF_CODE(Error_Param)
  1178. DEF_CODE(Error_Overflow)
  1179. DEF_CODE(Error_TooSmallBuffer)
  1180. DEF_CODE(Error_NotIntegrated)
  1181. DEF_CODE(Error_TargetBeing)
  1182. DEF_CODE(Error_NoTarget)
  1183. DEF_CODE(Error_NoDefine)
  1184. DEF_CODE(Error_NotImpl)
  1185. DEF_CODE(Error_NotExist)
  1186. DEF_CODE(Error_Duplication)
  1187. DEF_CODE(Error_Unregisted)
  1188. DEF_CODE(Error_AlreadyExist)
  1189. DEF_CODE(Error_MethodNotFound)
  1190. DEF_CODE(Error_Redirect)
  1191. DEF_CODE(Error_InvalidState)
  1192. DEF_CODE(Error_NotInit)
  1193. DEF_CODE(Error_Paused)
  1194. DEF_CODE(Error_Stoped)
  1195. DEF_CODE(Error_Losted)
  1196. DEF_CODE(Error_Closed)
  1197. DEF_CODE(Error_TaskControl)
  1198. DEF_CODE(Error_Pending)
  1199. DEF_CODE(Error_Cancel)
  1200. DEF_CODE(Error_Break)
  1201. DEF_CODE(Error_NotMeetCondition)
  1202. DEF_CODE(Error_NoPrivilege)
  1203. DEF_CODE(Error_MethodSignatureFailed)
  1204. DEF_CODE(Error_PeerAction)
  1205. DEF_CODE(Error_PeerClose)
  1206. DEF_CODE(Error_PeerIgnore)
  1207. DEF_CODE(Error_PeerReject)
  1208. DEF_CODE(Error_PeerDelay)
  1209. DEF_CODE(Error_Process)
  1210. DEF_CODE(Error_NetBroken)
  1211. DEF_CODE(Error_UpdateFailed)
  1212. DEF_CODE(Error_RegistryFailed)
  1213. DEF_CODE(Error_IO)
  1214. DEF_CODE(Error_Readonly)
  1215. DEF_CODE(Error_TimeOut)
  1216. DEF_CODE(Error_BlockTimeOut)
  1217. DEF_CODE(Error_ThreadTimeOut)
  1218. DEF_CODE(Error_QueueTimeOut)
  1219. DEF_CODE(Error_ReplyTimeOut)
  1220. DEF_CODE(Error_Hardware)
  1221. DEF_CODE(Error_DevLoadFileFailed)
  1222. DEF_CODE(Error_DevNotAvailable)
  1223. DEF_CODE(Error_DevAlreadyConnected)
  1224. DEF_CODE(Error_DevConnFailed)
  1225. DEF_CODE(Error_DevCommFailed)
  1226. DEF_CODE(Error_DevMedia)
  1227. DEF_CODE(Error_Debug)
  1228. DEF_CODE(Error_Assert)
  1229. DEF_CODE(Error_Trace)
  1230. DEF_CODE(Error_Bug)
  1231. DEF_CODE(Error_Unrecover)
  1232. DEF_CODE(Error_Resource)
  1233. DEF_CODE(Error_NewProcess)
  1234. DEF_CODE(Error_FailVerify)
  1235. DEF_CODE(Error_Block)
  1236. DEF_CODE(Error_Exception)
  1237. DEF_CODE(Error_Unexpect)
  1238. };
  1239. if (s) {
  1240. if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
  1241. char *p;
  1242. return (int)strtol(&s[2], &p, 16);
  1243. } else if (s[0] <= '9' && s[0] >= '1') {
  1244. return atoi(s);
  1245. } else {
  1246. int i;
  1247. for (i = 0; i < array_size(keys); ++i) {
  1248. if (_stricmp(s, keys[i].code) == 0) {
  1249. return keys[i].code_value;
  1250. }
  1251. }
  1252. }
  1253. }
  1254. return -1;
  1255. }
  1256. static int parse_usr_code(const char *s)
  1257. {
  1258. if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')) {
  1259. char *p;
  1260. return (int)strtol(&s[2], &p, 16);
  1261. }
  1262. else if (s[0] <= '9' && s[0] >= '1') {
  1263. return atoi(s);
  1264. }
  1265. else {
  1266. return -1;
  1267. }
  1268. }
  1269. static char *parse_code(const char *ns, const char *s)
  1270. {
  1271. if (strchr(s, '.')) {
  1272. return toolkit_strdup(s);
  1273. }
  1274. else {
  1275. return strdup_printf("%s.%s", ns, s);
  1276. }
  1277. }
  1278. static int extract_filter_element(evt_engine_t* engine, rvc_slotfilter_t* filter_elem, int* p_log_type, int* p_ent_id, const char** p_entity, int* p_severity, int* p_sys_code, int* p_usr_code, const char** p_slotvar)
  1279. {
  1280. int log_type, ent_id, severity, sys_code, usr_code;
  1281. const char* entity = NULL;
  1282. const char* slotvar = NULL;
  1283. if (filter_elem->strLogType) {
  1284. log_type = parse_log_type(filter_elem->strLogType);
  1285. if (log_type == -1) {
  1286. if (nIslog) {
  1287. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse log type failed!");
  1288. }
  1289. return Error_Unexpect;
  1290. }
  1291. }
  1292. else {
  1293. log_type = Log_Ignore;
  1294. }
  1295. if (filter_elem->strEntity) {
  1296. ent_id = parse_ent_id(engine, filter_elem->strEntity);
  1297. if (ent_id == -1) {
  1298. if (nIslog) {
  1299. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse entity id failed!");
  1300. }
  1301. return Error_Unexpect;
  1302. }
  1303. else {
  1304. entity = filter_elem->strEntity;
  1305. }
  1306. }
  1307. else {
  1308. ent_id = -1;
  1309. }
  1310. if (filter_elem->strSeverityLevel) {
  1311. severity = parse_severity(filter_elem->strSeverityLevel);
  1312. if (severity == -1) {
  1313. if (nIslog) {
  1314. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse severity level failed!");
  1315. }
  1316. return Error_Unexpect;
  1317. }
  1318. }
  1319. else {
  1320. severity = Severity_None;
  1321. }
  1322. if (filter_elem->strSysError) {
  1323. sys_code = parse_sys_code(filter_elem->strSysError);
  1324. if (sys_code == -1) {
  1325. if (nIslog) {
  1326. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse sys code failed! sys_code: %s", filter_elem->strSysError);
  1327. }
  1328. return Error_Unexpect;
  1329. }
  1330. }
  1331. else {
  1332. sys_code = Error_IgnoreAll;
  1333. }
  1334. if (filter_elem->strUserCode) {
  1335. usr_code = parse_usr_code(filter_elem->strUserCode);
  1336. }
  1337. else {
  1338. usr_code = -2;
  1339. }
  1340. if (filter_elem->strContentToVar) {
  1341. slotvar = filter_elem->strContentToVar;
  1342. }
  1343. else {
  1344. slotvar = NULL;
  1345. }
  1346. *p_log_type = log_type;
  1347. *p_ent_id = ent_id;
  1348. *p_severity = severity;
  1349. *p_sys_code = sys_code;
  1350. *p_usr_code = usr_code;
  1351. *p_entity = entity;
  1352. *p_slotvar = slotvar;
  1353. return 0;
  1354. }
  1355. static int extract_filter(evt_engine_t *engine, scew_element *filter_elem, int *p_log_type, int *p_ent_id, const char **p_entity, int *p_severity, int *p_sys_code, int *p_usr_code, const char **p_slotvar)
  1356. {
  1357. int log_type, ent_id, severity, sys_code, usr_code;
  1358. const char *entity = NULL;
  1359. const char *slotvar = NULL;
  1360. scew_attribute *attr;
  1361. attr = scew_element_attribute_by_name(filter_elem, "LogType");
  1362. if (attr) {
  1363. log_type = parse_log_type(scew_attribute_value(attr));
  1364. if (log_type == -1) {
  1365. if (nIslog){
  1366. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse log type failed!");
  1367. }
  1368. return Error_Unexpect;
  1369. }
  1370. }
  1371. else {
  1372. log_type = Log_Ignore;
  1373. }
  1374. attr = scew_element_attribute_by_name(filter_elem, "Entity");
  1375. if (attr) {
  1376. ent_id = parse_ent_id(engine, scew_attribute_value(attr));
  1377. if (ent_id == -1) {
  1378. if (nIslog){
  1379. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse entity id failed!");
  1380. }
  1381. return Error_Unexpect;
  1382. }
  1383. else {
  1384. entity = scew_attribute_value(attr);
  1385. }
  1386. }
  1387. else {
  1388. ent_id = -1;
  1389. }
  1390. attr = scew_element_attribute_by_name(filter_elem, "SeverityLevel");
  1391. if (attr) {
  1392. severity = parse_severity(scew_attribute_value(attr));
  1393. if (severity == -1) {
  1394. if (nIslog){
  1395. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse severity level failed!");
  1396. }
  1397. return Error_Unexpect;
  1398. }
  1399. }
  1400. else {
  1401. severity = Severity_None;
  1402. }
  1403. attr = scew_element_attribute_by_name(filter_elem, "SysError");
  1404. if (attr) {
  1405. sys_code = parse_sys_code(scew_attribute_value(attr));
  1406. if (sys_code == -1) {
  1407. if (nIslog){
  1408. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse sys code failed! sys_code: %s", scew_attribute_value(attr));
  1409. }
  1410. return Error_Unexpect;
  1411. }
  1412. }
  1413. else {
  1414. sys_code = Error_IgnoreAll;
  1415. }
  1416. attr = scew_element_attribute_by_name(filter_elem, "UserCode");
  1417. if (attr) {
  1418. usr_code = parse_usr_code(scew_attribute_value(attr));
  1419. }
  1420. else {
  1421. usr_code = -2;
  1422. }
  1423. attr = scew_element_attribute_by_name(filter_elem, "ContentToVar");
  1424. if (attr) {
  1425. slotvar = scew_attribute_value(attr);
  1426. }
  1427. else {
  1428. slotvar = NULL;
  1429. }
  1430. *p_log_type = log_type;
  1431. *p_ent_id = ent_id;
  1432. *p_severity = severity;
  1433. *p_sys_code = sys_code;
  1434. *p_usr_code = usr_code;
  1435. *p_entity = entity;
  1436. *p_slotvar = slotvar;
  1437. return 0;
  1438. }
  1439. static int load_filter_element(evt_engine_t* engine, evt_slot_t* slot, rvc_slotfilter_t* filter_elem)
  1440. {
  1441. evt_filter_t* filter = ZALLOC_T(evt_filter_t);
  1442. const char* entity = NULL;
  1443. const char* slotvar = NULL;
  1444. int rc = extract_filter_element(engine, filter_elem, &filter->log_type, &filter->ent_id, (const char**)&entity, &filter->severity, &filter->sys_code, &filter->user_code, &slotvar);
  1445. if (rc != 0) {
  1446. if (nIslog) {
  1447. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("extract filter failed!");
  1448. }
  1449. return rc;
  1450. }
  1451. if (slotvar) {
  1452. int i;
  1453. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  1454. evt_slotvar_t* var = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t*);
  1455. if (_stricmp(var->name, slotvar) == 0) {
  1456. filter->content_to_var = var;
  1457. break;
  1458. }
  1459. }
  1460. if (!filter->content_to_var) {
  1461. if (nIslog) {
  1462. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot find %s slotvar!", slotvar);
  1463. }
  1464. return -1;
  1465. }
  1466. }
  1467. filter->entity = entity ? _strdup(entity) : NULL;
  1468. filter->key.listen_id = 0;
  1469. filter->owner = slot;
  1470. ARRAY_PUSH(slot->arr_filter, evt_filter_t*) = filter;
  1471. return 0;
  1472. }
  1473. static int load_filter(evt_engine_t *engine, evt_slot_t *slot, scew_element *filter_elem)
  1474. {
  1475. evt_filter_t *filter = ZALLOC_T(evt_filter_t);
  1476. const char *entity = NULL;
  1477. const char *slotvar = NULL;
  1478. int rc = extract_filter(engine, filter_elem, &filter->log_type, &filter->ent_id, (const char**)&entity, &filter->severity, &filter->sys_code, &filter->user_code, &slotvar);
  1479. if (rc != 0) {
  1480. if (nIslog){
  1481. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("extract filter failed!");
  1482. }
  1483. return rc;
  1484. }
  1485. if (slotvar) {
  1486. int i;
  1487. for (i = 0; i < slot->arr_slotvar->nelts; ++i) {
  1488. evt_slotvar_t *var = ARRAY_IDX(slot->arr_slotvar, i, evt_slotvar_t *);
  1489. if (_stricmp(var->name, slotvar) == 0) {
  1490. filter->content_to_var = var;
  1491. break;
  1492. }
  1493. }
  1494. if (!filter->content_to_var) {
  1495. if (nIslog){
  1496. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("cannot find %s slotvar!", slotvar);
  1497. }
  1498. return -1;
  1499. }
  1500. }
  1501. filter->entity = entity ? _strdup(entity) : NULL;
  1502. filter->key.listen_id = 0;
  1503. filter->owner = slot;
  1504. ARRAY_PUSH(slot->arr_filter, evt_filter_t*) = filter;
  1505. return 0;
  1506. }
  1507. static int load_slotvar(evt_engine_t *engine, evt_slot_t *slot, scew_element *slotvar_elem)
  1508. {
  1509. evt_slotvar_t *slotvar = ZALLOC_T(evt_slotvar_t);
  1510. scew_attribute *attr;
  1511. attr = scew_element_attribute_by_name(slotvar_elem, "Name");
  1512. if (attr) {
  1513. slotvar->name = _strdup(scew_attribute_value(attr));
  1514. }
  1515. else {
  1516. if (nIslog){
  1517. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("not found slot var Name property!");
  1518. }
  1519. return -1;
  1520. }
  1521. attr = scew_element_attribute_by_name(slotvar_elem, "Value");
  1522. if (attr) {
  1523. slotvar->init_value = _strdup(scew_attribute_value(attr));
  1524. slotvar->current_value = _strdup(slotvar->init_value);
  1525. }
  1526. else {
  1527. if (nIslog){
  1528. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("not found slot var Value property!");
  1529. }
  1530. return -1;
  1531. }
  1532. ARRAY_PUSH(slot->arr_slotvar, evt_slotvar_t*) = slotvar;
  1533. return 0;
  1534. }
  1535. static int load_slotvar_element(evt_engine_t* engine, evt_slot_t* slot, rvc_slotvar_t* slotvar_elem)
  1536. {
  1537. evt_slotvar_t* slotvar = ZALLOC_T(evt_slotvar_t);
  1538. if (slotvar_elem->strName) {
  1539. slotvar->name = _strdup(slotvar_elem->strName);
  1540. }
  1541. else {
  1542. if (nIslog) {
  1543. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("not found slot var Name property!");
  1544. }
  1545. return -1;
  1546. }
  1547. if (slotvar_elem->strValue) {
  1548. slotvar->init_value = _strdup(slotvar_elem->strValue);
  1549. slotvar->current_value = _strdup(slotvar->init_value);
  1550. }
  1551. else {
  1552. if (nIslog) {
  1553. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("not found slot var Value property!");
  1554. }
  1555. return -1;
  1556. }
  1557. ARRAY_PUSH(slot->arr_slotvar, evt_slotvar_t*) = slotvar;
  1558. return 0;
  1559. }
  1560. static int load_slot_arrays(evt_engine_t* engine, const char* ns, rvc_slot_t* tnode)
  1561. {
  1562. evt_slot_t* slot = ZALLOC_T(evt_slot_t);
  1563. if (!slot) {
  1564. return Error_Resource;
  1565. }
  1566. INIT_HLIST_NODE(&slot->hentry);
  1567. slot->arr_filter = array_make(-1, sizeof(evt_filter_t*));
  1568. slot->arr_reset = array_make(-1, sizeof(char*));
  1569. slot->arr_rref_reset = array_make(-1, sizeof(evt_slot_t*));
  1570. slot->arr_ref_reset = array_make(-1, sizeof(evt_slot_t*));
  1571. slot->arr_ref_trigger = array_make(-1, sizeof(evt_trigger_t*));
  1572. slot->arr_slotvar = array_make(-1, sizeof(evt_slotvar_t*));
  1573. slot->parent = engine;
  1574. char* code = NULL;
  1575. if (!tnode->strCode) {
  1576. if (nIslog) {
  1577. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot miss attribute code!");
  1578. }
  1579. goto on_error;
  1580. }
  1581. else {
  1582. code = parse_code(ns, tnode->strCode);
  1583. if (!code) {
  1584. if (nIslog) {
  1585. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code failed!");
  1586. }
  1587. goto on_error;
  1588. }
  1589. else {
  1590. slot->key.code = code;
  1591. slot->key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  1592. }
  1593. }
  1594. if (tnode->strTimeout) {
  1595. evt_expire_t* expire = ZALLOC_T(evt_expire_t);
  1596. if (!expire) {
  1597. goto on_error;
  1598. }
  1599. expire->timeout = parse_timeout_value(tnode->strTimeout);
  1600. if (expire->timeout < 0) {
  1601. FREE(expire);
  1602. goto on_error;
  1603. }
  1604. if (expire->timeout == 0) {
  1605. FREE(expire);
  1606. }
  1607. else {
  1608. expire->parent = slot;
  1609. expire->timer_id = 0;
  1610. slot->timer = expire;
  1611. }
  1612. }
  1613. if (tnode->strOneTrigger) {
  1614. slot->once = parse_bool(tnode->strOneTrigger);
  1615. }
  1616. else {
  1617. slot->once = 0;
  1618. }
  1619. int vars_arr_length = sizeof(tnode->Vars) / sizeof(rvc_slotvar_t);
  1620. if (vars_arr_length > 0) {
  1621. for (int ivar = 0; ivar < vars_arr_length; ivar++) {
  1622. int rc = load_slotvar_element(engine, slot, &tnode->Vars[ivar]);
  1623. if (rc != 0) {
  1624. if (nIslog) {
  1625. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot var failed!%s", slot->key.code);
  1626. }
  1627. goto on_error;
  1628. }
  1629. }
  1630. }
  1631. int filters_arr_length = sizeof(tnode->Filters) / sizeof(rvc_slotfilter_t);
  1632. if (filters_arr_length > 0) {
  1633. for (int ifilter = 0; ifilter < filters_arr_length; ifilter++) {
  1634. int rc = load_filter_element(engine, slot, &tnode->Filters[ifilter]);
  1635. if (rc != 0) {
  1636. if (nIslog) {
  1637. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load filter failed!");
  1638. }
  1639. goto on_error;
  1640. }
  1641. }
  1642. }
  1643. int reset_arr_length = sizeof(tnode->Reset) / sizeof(rvc_slotreset_t);
  1644. if (reset_arr_length > 0) {
  1645. for (int ireset = 0; ireset < reset_arr_length; ireset++) {
  1646. if (tnode->Reset[ireset].strSource) {
  1647. char* source = parse_code(ns, tnode->Reset[ireset].strSource);
  1648. if (!source) {
  1649. if (nIslog) {
  1650. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code of Reset tag Source attribute failed!");
  1651. }
  1652. goto on_error;
  1653. }
  1654. else {
  1655. ARRAY_PUSH(slot->arr_reset, char*) = source;
  1656. }
  1657. }
  1658. else {
  1659. if (nIslog) {
  1660. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Reset tag miss source attribute!");
  1661. }
  1662. goto on_error;
  1663. }
  1664. }
  1665. }
  1666. if (!slot->timer) {
  1667. slot->once = 1;
  1668. }
  1669. if (slot_find(engine->slot_ht, &slot->key)) {
  1670. if (nIslog) {
  1671. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("duplicate slot %s", slot->key.code);
  1672. }
  1673. goto on_error;
  1674. }
  1675. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->slot_ht->size = %d, engine->slot_ht count = %d.", __FUNCTION__, __LINE__, engine->slot_ht->size, htable_get_count(engine->slot_ht));
  1676. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("slot->key.code = %s, slot->key.index_hash_code = %d.", slot->key.code, slot->key.index_hash_code);
  1677. slot_add(engine->slot_ht, slot);
  1678. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d engine->slot_ht->size = %d, engine->slot_ht count = %d.", __FUNCTION__, __LINE__, engine->slot_ht->size, htable_get_count(engine->slot_ht));
  1679. return 0;
  1680. on_error:
  1681. slot_free(slot);
  1682. return Error_Unexpect;
  1683. }
  1684. static int load_slot(evt_engine_t *engine, const char *ns, scew_element *slot_elem)
  1685. {
  1686. evt_slot_t *slot = ZALLOC_T(evt_slot_t);
  1687. if (!slot){
  1688. return Error_Resource;
  1689. }
  1690. INIT_HLIST_NODE(&slot->hentry);
  1691. slot->arr_filter = array_make(-1, sizeof(evt_filter_t*));
  1692. slot->arr_reset = array_make(-1, sizeof(char*));
  1693. slot->arr_rref_reset = array_make(-1, sizeof(evt_slot_t*));
  1694. slot->arr_ref_reset = array_make(-1, sizeof(evt_slot_t*));
  1695. slot->arr_ref_trigger = array_make(-1, sizeof(evt_trigger_t*));
  1696. slot->arr_slotvar = array_make(-1, sizeof(evt_slotvar_t*));
  1697. slot->parent = engine;
  1698. char* code = NULL;
  1699. scew_list* slotval_list = NULL;
  1700. scew_list* filter_list = NULL;
  1701. scew_list* reset_list = NULL;
  1702. scew_attribute *attr = scew_element_attribute_by_name(slot_elem, "Code");
  1703. if (!attr) {
  1704. if (nIslog){
  1705. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot miss attribute code!");
  1706. }
  1707. goto on_error;
  1708. }
  1709. else {
  1710. code = parse_code(ns, scew_attribute_value(attr));
  1711. if (!code) {
  1712. if (nIslog){
  1713. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code failed!");
  1714. }
  1715. goto on_error;
  1716. }
  1717. else {
  1718. slot->key.code = code;
  1719. slot->key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  1720. }
  1721. }
  1722. attr = scew_element_attribute_by_name(slot_elem, "Timeout");
  1723. if (attr) {
  1724. evt_expire_t *expire = ZALLOC_T(evt_expire_t);
  1725. if (!expire){
  1726. goto on_error;
  1727. }
  1728. expire->timeout = parse_timeout_value(scew_attribute_value(attr));
  1729. if (expire->timeout < 0) {
  1730. FREE(expire);
  1731. goto on_error;
  1732. }
  1733. if (expire->timeout == 0) {
  1734. FREE(expire);
  1735. }
  1736. else {
  1737. expire->parent = slot;
  1738. expire->timer_id = 0;
  1739. slot->timer = expire;
  1740. }
  1741. }
  1742. attr = scew_element_attribute_by_name(slot_elem, "OnceTrigger");
  1743. if (attr) {
  1744. slot->once = parse_bool(scew_attribute_value(attr));
  1745. }
  1746. else {
  1747. slot->once = 0;
  1748. }
  1749. slotval_list = scew_element_list_by_name(slot_elem, "Var");
  1750. if (slotval_list) {
  1751. for (scew_list *it = scew_list_first(slotval_list); it; it = scew_list_next(it)) {
  1752. scew_element *elem = (scew_element *)scew_list_data(it);
  1753. int rc = load_slotvar(engine, slot, elem);
  1754. if (rc != 0) {
  1755. if (nIslog){
  1756. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot var failed!%s", slot->key.code);
  1757. }
  1758. goto on_error;
  1759. }
  1760. }
  1761. scew_list_free(slotval_list);
  1762. }
  1763. filter_list = scew_element_list_by_name(slot_elem, "Filter");
  1764. if (filter_list) {
  1765. for (scew_list *it = scew_list_first(filter_list); it; it = scew_list_next(it)) {
  1766. scew_element *elem = (scew_element *)scew_list_data(it);
  1767. int rc = load_filter(engine, slot, elem);
  1768. if (rc != 0) {
  1769. if (nIslog){
  1770. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load filter failed!");
  1771. }
  1772. goto on_error;
  1773. }
  1774. }
  1775. scew_list_free(filter_list);
  1776. }
  1777. reset_list = scew_element_list_by_name(slot_elem, "Reset");
  1778. if (reset_list) {
  1779. for (scew_list *it = scew_list_first(reset_list); it; it = scew_list_next(it)) {
  1780. scew_element *elem = (scew_element *)scew_list_data(it);
  1781. attr = scew_element_attribute_by_name(elem, "Source");
  1782. if (attr) {
  1783. char *source = parse_code(ns, scew_attribute_value(attr));
  1784. if (!source) {
  1785. if (nIslog){
  1786. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("parse code of Reset tag Source attribute failed!");
  1787. }
  1788. goto on_error;
  1789. }
  1790. else {
  1791. ARRAY_PUSH(slot->arr_reset, char*) = source;
  1792. }
  1793. }
  1794. else {
  1795. if (nIslog){
  1796. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Reset tag miss source attribute!");
  1797. }
  1798. goto on_error;
  1799. }
  1800. }
  1801. scew_list_free(reset_list);
  1802. }
  1803. if (!slot->timer){
  1804. slot->once = 1;
  1805. }
  1806. if (slot_find(engine->slot_ht, &slot->key)) {
  1807. if (nIslog){
  1808. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("duplicate slot %s", slot->key.code);
  1809. }
  1810. goto on_error;
  1811. }
  1812. slot_add(engine->slot_ht, slot);
  1813. return 0;
  1814. on_error:
  1815. slot_free(slot);
  1816. return Error_Unexpect;
  1817. }
  1818. static int load_slot_rule(evt_trigger_t *trigger, const char *ns, scew_element *slot_elem)
  1819. {
  1820. evt_slot_rule_t *rule = ZALLOC_T(evt_slot_rule_t);
  1821. scew_attribute *attr = scew_element_attribute_by_name(slot_elem, "Code");
  1822. if (attr) {
  1823. rule->code = parse_code(ns, scew_attribute_value(attr));
  1824. }
  1825. else {
  1826. if (nIslog){
  1827. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot rule parse code attribute failed!");
  1828. }
  1829. goto on_error;
  1830. }
  1831. attr = scew_element_attribute_by_name(slot_elem, "Positive");
  1832. if (attr) {
  1833. rule->positive = parse_bool(scew_attribute_value(attr));
  1834. if (rule->positive == -1) {
  1835. if (nIslog){
  1836. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("slot rule parse positive attr failed!");
  1837. }
  1838. goto on_error;
  1839. }
  1840. }
  1841. else {
  1842. rule->positive = 1;
  1843. }
  1844. attr = scew_element_attribute_by_name(slot_elem, "Message");
  1845. if (attr) {
  1846. rule->message = _strdup(scew_attribute_value(attr));
  1847. }
  1848. rule->parent = trigger;
  1849. list_add_tail(&rule->entry, &trigger->slot_rule_list);
  1850. return 0;
  1851. on_error:
  1852. slot_rule_free(rule);
  1853. return Error_Unexpect;
  1854. }
  1855. static int load_sysvar_rule(evt_engine_t *engine, evt_trigger_t *trigger, scew_element *sysvar_elem)
  1856. {
  1857. evt_sysvar_rule_t *rule = ZALLOC_T(evt_sysvar_rule_t);
  1858. scew_list* state_list = NULL;
  1859. scew_attribute *attr = scew_element_attribute_by_name(sysvar_elem, "Code");
  1860. if (attr) {
  1861. char *code = (char*)scew_attribute_value(attr);
  1862. evt_sysvar_key_t key;
  1863. key.code = code;
  1864. key.index_hash_code = hash32_str(code, HASH32_STR_INIT);
  1865. evt_sysvar_t *sysvar = sysvar_find(engine->sysvar_ht, &key);
  1866. if (!sysvar) {
  1867. sysvar = ZALLOC_T(evt_sysvar_t);
  1868. INIT_HLIST_NODE(&sysvar->hentry);
  1869. sysvar->arr_ref_rule = array_make(-1, sizeof(evt_sysvar_rule_t*));
  1870. sysvar->parent = engine;
  1871. sysvar->key.code = _strdup(code);
  1872. sysvar->key.index_hash_code = key.index_hash_code;
  1873. sysvar_add(engine->sysvar_ht, sysvar);
  1874. }
  1875. ARRAY_PUSH(sysvar->arr_ref_rule, evt_sysvar_rule_t*) = rule;
  1876. rule->ref_sysvar = sysvar;
  1877. }
  1878. else {
  1879. if (nIslog){
  1880. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load sysvar rule, undefine code attr!");
  1881. }
  1882. goto on_error;
  1883. }
  1884. attr = scew_element_attribute_by_name(sysvar_elem, "Positive");
  1885. if (attr) {
  1886. rule->positive = parse_bool((char*)scew_attribute_value(attr));
  1887. }
  1888. else {
  1889. rule->positive = 1;
  1890. }
  1891. rule->parent = trigger;
  1892. rule->arr_state = array_make(0, sizeof(char*));
  1893. state_list = scew_element_children(sysvar_elem);
  1894. if (state_list) {
  1895. for (scew_list *it = scew_list_first(state_list); it; it = scew_list_next(it)) {
  1896. scew_element *state_elem = (scew_element *)scew_list_data(it);
  1897. const char *state = scew_element_contents(state_elem);
  1898. if (state) {
  1899. ARRAY_PUSH(rule->arr_state, char*) = _strdup(state);
  1900. }
  1901. else {
  1902. ARRAY_PUSH(rule->arr_state, char*) = NULL;
  1903. }
  1904. }
  1905. scew_list_first(state_list);
  1906. }
  1907. else {
  1908. if (nIslog){
  1909. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger sysvar does not have state children!");
  1910. }
  1911. goto on_error;
  1912. }
  1913. list_add_tail(&rule->entry, &trigger->sysvar_list);
  1914. return 0;
  1915. on_error:
  1916. sysvar_rule_free(rule);
  1917. return Error_Unexpect;
  1918. }
  1919. void SetLogType(int nIslog)
  1920. {
  1921. nIslog = nIslog;
  1922. }
  1923. static int load_trigger_arrays(evt_engine_t* engine, const char* ns, rvc_trigger_t* trigger_elem)
  1924. {
  1925. evt_trigger_t* trigger = ZALLOC_T(evt_trigger_t);
  1926. INIT_LIST_HEAD(&trigger->slot_rule_list);
  1927. INIT_LIST_HEAD(&trigger->sysvar_list);
  1928. if (trigger_elem->strLogType) {
  1929. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("LogType value is %s.", trigger_elem->strLogType);
  1930. trigger->log_type = parse_log_type(trigger_elem->strLogType);
  1931. if (trigger->log_type == -1) {
  1932. if (nIslog) {
  1933. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger log type parse failed!");
  1934. }
  1935. goto on_error;
  1936. }
  1937. }
  1938. else {
  1939. if (nIslog) {
  1940. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  1941. }
  1942. goto on_error;
  1943. }
  1944. if (trigger_elem->strSeverityLevel) {
  1945. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SeverityLevel value is %s.", trigger_elem->strSeverityLevel);
  1946. trigger->severity_level = parse_severity(trigger_elem->strSeverityLevel);
  1947. if (trigger->severity_level == -1) {
  1948. if (nIslog) {
  1949. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse severity level failed!");
  1950. }
  1951. goto on_error;
  1952. }
  1953. }
  1954. else {
  1955. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error) {
  1956. if (nIslog) {
  1957. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  1958. }
  1959. goto on_error;
  1960. }
  1961. }
  1962. if (trigger_elem->strSysError) {
  1963. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SysError value is %s.", trigger_elem->strSysError);
  1964. trigger->sys_code = parse_sys_code(trigger_elem->strSysError);
  1965. if (trigger->sys_code == -1) {
  1966. if (nIslog) {
  1967. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code failed! sys_code: %s", trigger_elem->strSysError);
  1968. }
  1969. goto on_error;
  1970. }
  1971. }
  1972. else {
  1973. if (trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  1974. if (nIslog) {
  1975. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code undefined!");
  1976. }
  1977. goto on_error;
  1978. }
  1979. }
  1980. if (trigger_elem->strUserCode) {
  1981. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UserCode value is %s.", trigger_elem->strUserCode);
  1982. trigger->user_code = parse_usr_code(trigger_elem->strUserCode);
  1983. }
  1984. else {
  1985. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  1986. if (nIslog) {
  1987. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse user code undefined!");
  1988. }
  1989. goto on_error;
  1990. }
  1991. }
  1992. if (trigger_elem->strMessage) {
  1993. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Message value is %s.", trigger_elem->strMessage);
  1994. trigger->msg = _strdup(trigger_elem->strMessage);
  1995. }
  1996. slot_list = scew_element_list_by_name(trigger_elem, "Slot");
  1997. if (slot_list) {
  1998. for (scew_list* it = scew_list_first(slot_list); it; it = scew_list_next(it)) {
  1999. scew_element* slot_elem = (scew_element*)scew_list_data(it);
  2000. int rc = load_slot_rule(trigger, ns, slot_elem);
  2001. if (rc != 0) {
  2002. if (nIslog) {
  2003. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot rule failed!");
  2004. }
  2005. scew_list_free(slot_list);
  2006. goto on_error;
  2007. }
  2008. }
  2009. scew_list_free(slot_list);
  2010. }
  2011. sysvar_list = scew_element_list_by_name(trigger_elem, "SysVar");
  2012. if (sysvar_list) {
  2013. for (scew_list* it = scew_list_first(sysvar_list); it; it = scew_list_next(it)) {
  2014. scew_element* sysvar_elem = (scew_element*)scew_list_data(it);
  2015. int rc = load_sysvar_rule(engine, trigger, sysvar_elem);
  2016. if (rc != 0) {
  2017. if (nIslog) {
  2018. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load sysvar rule failed!");
  2019. }
  2020. scew_list_free(sysvar_list);
  2021. goto on_error;
  2022. }
  2023. }
  2024. scew_list_free(sysvar_list);
  2025. }
  2026. if (trigger_elem->strDelayer) {
  2027. trigger->delay_ms = parse_timeout_value(trigger_elem->strDelayer);
  2028. trigger->delay_timer_id = -1;
  2029. }
  2030. else {
  2031. trigger->delay_ms = 0;
  2032. trigger->delay_timer_id = -1;
  2033. }
  2034. trigger->parent = engine;
  2035. list_add_tail(&trigger->entry, &engine->trigger_list);
  2036. return 0;
  2037. on_error:
  2038. trigger_free(trigger);
  2039. return Error_Unexpect;
  2040. }
  2041. static int load_trigger(evt_engine_t *engine, const char *ns, scew_element *trigger_elem)
  2042. {
  2043. evt_trigger_t *trigger = ZALLOC_T(evt_trigger_t);
  2044. scew_attribute *attr;
  2045. scew_list *slot_list, *sysvar_list;
  2046. scew_element *delayer;
  2047. INIT_LIST_HEAD(&trigger->slot_rule_list);
  2048. INIT_LIST_HEAD(&trigger->sysvar_list);
  2049. attr = scew_element_attribute_by_name(trigger_elem, "LogType");
  2050. if (attr) {
  2051. trigger->log_type = parse_log_type(scew_attribute_value(attr));
  2052. if (trigger->log_type == -1) {
  2053. if (nIslog){
  2054. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger log type parse failed!");
  2055. }
  2056. goto on_error;
  2057. }
  2058. }
  2059. else {
  2060. if (nIslog){
  2061. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  2062. }
  2063. goto on_error;
  2064. }
  2065. attr = scew_element_attribute_by_name(trigger_elem, "SeverityLevel");
  2066. if (attr) {
  2067. trigger->severity_level = parse_severity(scew_attribute_value(attr));
  2068. if (trigger->severity_level == -1) {
  2069. if (nIslog){
  2070. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse severity level failed!");
  2071. }
  2072. goto on_error;
  2073. }
  2074. }
  2075. else {
  2076. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error) {
  2077. if (nIslog){
  2078. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger LogType undefined!");
  2079. }
  2080. goto on_error;
  2081. }
  2082. }
  2083. attr = scew_element_attribute_by_name(trigger_elem, "SysError");
  2084. if (attr) {
  2085. trigger->sys_code = parse_sys_code(scew_attribute_value(attr));
  2086. if (trigger->sys_code == -1) {
  2087. if (nIslog){
  2088. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code failed! sys_code: %s", scew_attribute_value(attr));
  2089. }
  2090. goto on_error;
  2091. }
  2092. }
  2093. else {
  2094. if (trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  2095. if (nIslog){
  2096. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse sys code undefined!");
  2097. }
  2098. goto on_error;
  2099. }
  2100. }
  2101. attr = scew_element_attribute_by_name(trigger_elem, "UserCode");
  2102. if (attr) {
  2103. trigger->user_code = parse_usr_code(scew_attribute_value(attr));
  2104. }
  2105. else {
  2106. if (trigger->log_type == Log_Event || trigger->log_type == Log_Error || trigger->log_type == Log_Warning) {
  2107. if (nIslog){
  2108. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("trigger parse user code undefined!");
  2109. }
  2110. goto on_error;
  2111. }
  2112. }
  2113. attr = scew_element_attribute_by_name(trigger_elem, "Message");
  2114. if (attr) {
  2115. trigger->msg = _strdup(scew_attribute_value(attr));
  2116. }
  2117. slot_list = scew_element_list_by_name(trigger_elem, "Slot");
  2118. if (slot_list) {
  2119. for (scew_list *it = scew_list_first(slot_list); it; it = scew_list_next(it)) {
  2120. scew_element *slot_elem = (scew_element*)scew_list_data(it);
  2121. int rc = load_slot_rule(trigger, ns, slot_elem);
  2122. if (rc != 0) {
  2123. if (nIslog){
  2124. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot rule failed!");
  2125. }
  2126. scew_list_free(slot_list);
  2127. goto on_error;
  2128. }
  2129. }
  2130. scew_list_free(slot_list);
  2131. }
  2132. sysvar_list = scew_element_list_by_name(trigger_elem, "SysVar");
  2133. if (sysvar_list) {
  2134. for (scew_list *it = scew_list_first(sysvar_list); it; it = scew_list_next(it)) {
  2135. scew_element *sysvar_elem = (scew_element*)scew_list_data(it);
  2136. int rc = load_sysvar_rule(engine, trigger, sysvar_elem);
  2137. if (rc != 0) {
  2138. if (nIslog){
  2139. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load sysvar rule failed!");
  2140. }
  2141. scew_list_free(sysvar_list);
  2142. goto on_error;
  2143. }
  2144. }
  2145. scew_list_free(sysvar_list);
  2146. }
  2147. delayer = scew_element_by_name(trigger_elem, "Delayer");
  2148. if (delayer) {
  2149. trigger->delay_ms = parse_timeout_value(scew_element_contents(delayer));
  2150. trigger->delay_timer_id = -1;
  2151. }
  2152. else {
  2153. trigger->delay_ms = 0;
  2154. trigger->delay_timer_id = -1;
  2155. }
  2156. trigger->parent = engine;
  2157. list_add_tail(&trigger->entry, &engine->trigger_list);
  2158. return 0;
  2159. on_error:
  2160. trigger_free(trigger);
  2161. return Error_Unexpect;
  2162. }
  2163. static int load_file(evt_engine_t *engine, const char *filename)
  2164. {
  2165. scew_reader *reader = NULL;
  2166. scew_parser *parser = NULL;
  2167. scew_tree *tree = NULL;
  2168. scew_element *root;
  2169. const char *ns;
  2170. char tmp_ns[MAX_PATH];
  2171. int rc = Error_Param;
  2172. scew_attribute* attr = NULL;
  2173. scew_element* elem = NULL;
  2174. reader = scew_reader_file_create(filename);
  2175. if (!reader) {
  2176. if (nIslog){
  2177. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open file %s failed!", filename);
  2178. }
  2179. goto on_error;
  2180. }
  2181. parser = scew_parser_create();
  2182. tree = scew_parser_load(parser, reader);
  2183. if (!tree) {
  2184. if (nIslog){
  2185. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("read file %s failed! parser xml failed", filename);
  2186. }
  2187. goto on_error;
  2188. }
  2189. root = scew_tree_root(tree);
  2190. if (!root) {
  2191. if (nIslog){
  2192. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s file does not have root element!", filename);
  2193. }
  2194. goto on_error;
  2195. }
  2196. attr = scew_element_attribute_by_name(root, "xmlns");
  2197. if (attr) {
  2198. ns = (const char*)scew_attribute_value(attr);
  2199. }
  2200. else {
  2201. const char *s = strrchr(filename, SPLIT_SLASH)+1;
  2202. const char *e = strrchr(filename, '.');
  2203. memcpy(tmp_ns, s, e-s);
  2204. tmp_ns[e-s] = 0;
  2205. ns = tmp_ns;
  2206. }
  2207. elem = scew_element_by_name(root, "SlotList");
  2208. if (elem) {
  2209. scew_list *slot_list = scew_element_children(elem);
  2210. if (slot_list) {
  2211. for (scew_list *it = scew_list_first(slot_list); it; it = scew_list_next(it)) {
  2212. scew_element *slot_elem = (scew_element *)scew_list_data(it);
  2213. if (load_slot(engine, ns, slot_elem) != 0) {
  2214. if (nIslog){
  2215. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load slot failed!");
  2216. }
  2217. goto on_error;
  2218. }
  2219. }
  2220. }
  2221. }
  2222. elem = scew_element_by_name(root, "TriggerList");
  2223. if (elem) {
  2224. scew_list *trigger_list = scew_element_children(elem);
  2225. if (trigger_list) {
  2226. for (scew_list *it = scew_list_first(trigger_list); it; it = scew_list_next(it)) {
  2227. scew_element *trigger_elem = (scew_element*)scew_list_data(it);
  2228. if (load_trigger(engine, ns, trigger_elem) != 0) {
  2229. if (nIslog){
  2230. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load trigger failed!");
  2231. }
  2232. goto on_error;
  2233. }
  2234. }
  2235. }
  2236. }
  2237. rc = 0;
  2238. on_error:
  2239. if (tree) {
  2240. scew_tree_free(tree);
  2241. }
  2242. if (parser) {
  2243. scew_parser_free(parser);
  2244. }
  2245. if (reader) {
  2246. scew_reader_close(reader);
  2247. }
  2248. return rc;
  2249. }
  2250. int evt_engine_create(const evt_engine_callback_t *callback, evt_engine_t **p_engine)
  2251. {
  2252. evt_engine_t *engine = MALLOC_T(evt_engine_t);
  2253. engine->filter_ht = htable_create(0);
  2254. engine->sysvar_ht = htable_create(0);
  2255. engine->slot_ht = htable_create(0);
  2256. INIT_LIST_HEAD(&engine->trigger_list);
  2257. spinlock_init(&engine->lock);
  2258. memcpy(&engine->cb, callback, sizeof(evt_engine_callback_t));
  2259. *p_engine = engine;
  2260. return 0;
  2261. }
  2262. void evt_engine_destroy(evt_engine_t *engine)
  2263. {
  2264. assert(engine->filter_ht->count == 0);
  2265. assert(engine->slot_ht->count == 0);
  2266. assert(engine->sysvar_ht->count == 0);
  2267. htable_destroy(engine->filter_ht);
  2268. htable_destroy(engine->slot_ht);
  2269. htable_destroy(engine->sysvar_ht);
  2270. FREE(engine);
  2271. }
  2272. int evt_engine_load(evt_engine_t *engine, int nfile, const char **files)
  2273. {
  2274. int i;
  2275. int rc = 0;
  2276. for (i = 0; i < nfile; ++i) {
  2277. const char *filename = files[i];
  2278. assert(filename);
  2279. rc = load_file(engine, filename);
  2280. if (rc != 0) {
  2281. if (nIslog){
  2282. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load file %s failed!", filename);
  2283. }
  2284. return rc;
  2285. }
  2286. else {
  2287. if (nIslog){
  2288. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s loaded!", filename);
  2289. }
  2290. }
  2291. }
  2292. rc = build_ref(engine);
  2293. if (rc != 0) {
  2294. if (nIslog){
  2295. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("build ref failed!");
  2296. }
  2297. return rc;
  2298. }
  2299. if (nIslog){
  2300. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("build ref ok!");
  2301. }
  2302. return rc;
  2303. }
  2304. int evt_engine_unload(evt_engine_t *engine)
  2305. {
  2306. int i;
  2307. struct hlist_node *pos, *n;
  2308. evt_trigger_t *trigger, *tmp;
  2309. for (i = 0; i < engine->slot_ht->size; ++i) {
  2310. evt_slot_t *slot;
  2311. hlist_for_each_entry_safe(slot, pos, n, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  2312. hlist_del(pos);
  2313. slot_free(slot);
  2314. engine->slot_ht->count--;
  2315. }
  2316. }
  2317. for (i = 0; i < engine->sysvar_ht->size; ++i) {
  2318. evt_sysvar_t *sysvar;
  2319. hlist_for_each_entry_safe(sysvar, pos, n, &engine->sysvar_ht->buckets[i], evt_sysvar_t, hentry) {
  2320. hlist_del(pos);
  2321. sysvar_free(sysvar);
  2322. engine->sysvar_ht->count--;
  2323. }
  2324. }
  2325. list_for_each_entry_safe(trigger, tmp, &engine->trigger_list, evt_trigger_t, entry) {
  2326. list_del(&trigger->entry);
  2327. trigger_free(trigger);
  2328. }
  2329. return 0;
  2330. }
  2331. int evt_engine_process_log(evt_engine_t *engine,
  2332. const CAutoArray<CUUID> &SubIDs,
  2333. unsigned long long nLogID,
  2334. LogTypeEnum eLogType,
  2335. SeverityLevelEnum eLevel,
  2336. DWORD dwSysError,
  2337. DWORD dwUserCode,
  2338. DWORD dwEntityId,
  2339. const char *pszEntityName,
  2340. const char *pszModuleName,
  2341. const char *pszMessage)
  2342. {
  2343. return process_log(engine, SubIDs, (int)eLogType, (int)dwEntityId, (int)eLevel, (int)dwSysError, (int)dwUserCode, pszMessage);
  2344. }
  2345. int evt_engine_process_sysvar(evt_engine_t *engine,
  2346. const char *pszKey,
  2347. const char *pszValue,
  2348. const char *pszOldValue,
  2349. const char *pszEntityName)
  2350. {
  2351. if (!pszKey){
  2352. return Error_Param;
  2353. }
  2354. evt_sysvar_key_t key;
  2355. key.code = const_cast<char*>(pszKey);
  2356. key.index_hash_code = hash32_str(pszKey, HASH32_STR_INIT);
  2357. evt_sysvar_t *sysvar = sysvar_find(engine->sysvar_ht, &key);
  2358. if (sysvar) {
  2359. return process_sysvar(engine, sysvar, pszOldValue, pszValue);
  2360. }
  2361. else {
  2362. return Error_NotExist;
  2363. }
  2364. }
  2365. int evt_engine_start(evt_engine_t *engine)
  2366. {
  2367. int i;
  2368. int rc = engine->cb.subscribe_sysevent(engine, engine->cb.user_data);
  2369. if (rc != 0) {
  2370. if (nIslog){
  2371. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("subscribe sysevent failed!");
  2372. }
  2373. return rc;
  2374. }
  2375. if (nIslog){
  2376. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe sysevent ok!");
  2377. }
  2378. for (i = 0; i < engine->sysvar_ht->size; ++i) {
  2379. evt_sysvar_t *tpos;
  2380. struct hlist_node *pos;
  2381. hlist_for_each_entry(tpos, pos, &engine->sysvar_ht->buckets[i], evt_sysvar_t, hentry) {
  2382. CSimpleStringA strValue;
  2383. rc = engine->cb.get_sysevent(engine, tpos->key.code, strValue, engine->cb.user_data);
  2384. if (rc != 0) {
  2385. if (nIslog){
  2386. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get sysvar %s failed! Error = %d", tpos->key.code, rc);
  2387. }
  2388. return rc;
  2389. }
  2390. else {
  2391. if (nIslog){
  2392. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get sysvar %s ok! value=%s", tpos->key.code, (LPCSTR)strValue);
  2393. }
  2394. rc = process_sysvar(engine, tpos, NULL, strValue);
  2395. if (rc != 0) {
  2396. if (nIslog){
  2397. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("process sysvar %s failed! value = %s", tpos->key.code, (LPCSTR)strValue);
  2398. }
  2399. return rc;
  2400. }
  2401. else {
  2402. if (nIslog){
  2403. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("process sysvar %s ok! key = %s, value = %s", tpos->key.code, tpos->key.code, (LPCSTR)strValue);
  2404. }
  2405. }
  2406. }
  2407. }
  2408. }
  2409. for (i = 0; i < engine->slot_ht->size; ++i) {
  2410. evt_slot_t *slot;
  2411. struct hlist_node *pos;
  2412. hlist_for_each_entry(slot, pos, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  2413. int kk;
  2414. for (kk = 0; kk < slot->arr_filter->nelts; ++kk) {
  2415. evt_filter_t *filter = ARRAY_IDX(slot->arr_filter, kk, evt_filter_t*);
  2416. rc = engine->cb.subscribe_log(engine, &filter->key.listen_id,
  2417. (LogTypeEnum)filter->log_type, filter->entity, (SeverityLevelEnum)filter->severity, (ErrorCodeEnum)filter->sys_code, filter->user_code, filter->content_to_var ? false : true, engine->cb.user_data);
  2418. if (rc != 0) {
  2419. if (nIslog){
  2420. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("subscribe log failed!");
  2421. }
  2422. return rc;
  2423. }
  2424. else {
  2425. if (nIslog){
  2426. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe log ok, id = %d", filter->key.listen_id);
  2427. }
  2428. }
  2429. filter_add(engine->filter_ht, filter);
  2430. }
  2431. }
  2432. }
  2433. if (nIslog){
  2434. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe started!");
  2435. }
  2436. return rc;
  2437. }
  2438. int evt_engine_stop(evt_engine_t *engine)
  2439. {
  2440. int rc;
  2441. int i;
  2442. for (i = 0; i < engine->slot_ht->size; ++i) {
  2443. evt_slot_t *slot;
  2444. struct hlist_node *pos;
  2445. hlist_for_each_entry(slot, pos, &engine->slot_ht->buckets[i], evt_slot_t, hentry) {
  2446. int kk;
  2447. for (kk = 0; kk < slot->arr_filter->nelts; ++kk) {
  2448. evt_filter_t *filter = ARRAY_IDX(slot->arr_filter, kk, evt_filter_t*);
  2449. rc = engine->cb.unsubscribe_log(engine, filter->key.listen_id, engine->cb.user_data);
  2450. if (rc != 0) {
  2451. if (nIslog){
  2452. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unsubscribe log failed, slot = %s, log listen_id = %s", slot->key.code, filter->key.listen_id);
  2453. }
  2454. return rc;
  2455. }
  2456. filter_remove(engine->filter_ht, filter);
  2457. }
  2458. }
  2459. }
  2460. rc = engine->cb.unsubscribe_sysevent(engine, engine->cb.user_data);
  2461. if (rc != 0) {
  2462. if (nIslog){
  2463. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unsubscibe sysevent failed!");
  2464. }
  2465. return rc;
  2466. }
  2467. if (nIslog){
  2468. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("unsubscibe sysevent ok!");
  2469. }
  2470. return rc;
  2471. }