1 #include "openils/oils_event.h"
2 #include <libxml/parser.h>
3 #include <libxml/tree.h>
4 #include "opensrf/osrf_settings.h"
6 osrfHash* __oilsEventEvents = NULL;
7 osrfHash* __oilsEventDescriptions = NULL;
9 oilsEvent* oilsNewEvent( char* file, int line, char* event ) {
10 if(!event) return NULL;
11 osrfLogInfo(OSRF_LOG_MARK, "Creating new event: %s", event);
12 if(!__oilsEventEvents) _oilsEventParseEvents();
13 oilsEvent* evt = (oilsEvent*) safe_malloc(sizeof(oilsEvent));
14 evt->event = strdup(event);
16 if(file) evt->file = strdup(file);
21 oilsEvent* oilsNewEvent2( char* file, int line, char* event, jsonObject* payload ) {
22 oilsEvent* evt = oilsNewEvent(file, line, event);
23 oilsEventSetPayload(evt, payload);
27 oilsEvent* oilsNewEvent3( char* file, int line, char* event, char* perm, int permloc ) {
28 oilsEvent* evt = oilsNewEvent(file, line, event);
29 oilsEventSetPermission( evt, perm, permloc );
33 oilsEvent* oilsNewEvent4( char* file, int line,
34 char* event, char* perm, int permloc, jsonObject* payload ) {
35 oilsEvent* evt = oilsNewEvent3( file, line, event, perm, permloc );
36 if(evt) oilsEventSetPayload( evt, payload );
40 void oilsEventSetPermission( oilsEvent* event, char* perm, int permloc ) {
41 if(!(event && perm)) return;
42 event->perm = strdup(perm);
43 event->permloc = permloc;
46 void oilsEventSetPayload( oilsEvent* event, jsonObject* payload ) {
47 if(!(event && payload)) return;
48 event->payload = jsonObjectClone(payload);
52 void oilsEventFree( oilsEvent* event ) {
56 if(event->json) jsonObjectFree(event->json);
57 else jsonObjectFree(event->payload);
62 jsonObject* oilsEventToJSON( oilsEvent* event ) {
63 if(!event) return NULL;
64 char* code = osrfHashGet( __oilsEventEvents, event->event );
67 osrfLogError(OSRF_LOG_MARK, "No such event name: %s", event->event );
72 char* lang = "en-US"; /* assume this for now */
74 osrfHash* h = osrfHashGet(__oilsEventDescriptions, lang);
76 osrfLogDebug(OSRF_LOG_MARK, "Loaded event lang hash for %s",lang);
77 desc = osrfHashGet(h, code);
78 osrfLogDebug(OSRF_LOG_MARK, "Found event description %s", desc);
82 jsonObject* json = jsonNewObject(NULL);
83 jsonObjectSetKey( json, "ilsevent", jsonNewNumberObject(atoi(code)) );
84 jsonObjectSetKey( json, "textcode", jsonNewObject(event->event) );
85 jsonObjectSetKey( json, "desc", jsonNewObject(desc) );
86 jsonObjectSetKey( json, "pid", jsonNewNumberObject(getpid()) );
89 memset(buf, '\0', sizeof(buf));
90 snprintf(buf, sizeof(buf), "%s:%d", event->file, event->line);
91 jsonObjectSetKey( json, "stacktrace", jsonNewObject(buf) );
93 if(event->perm) jsonObjectSetKey( json, "ilsperm", jsonNewObject(event->perm) );
94 if(event->permloc != -1) jsonObjectSetKey( json, "ilspermloc", jsonNewNumberObject(event->permloc) );
95 if(event->payload) jsonObjectSetKey( json, "payload", event->payload );
101 void _oilsEventParseEvents() {
103 char* xml = osrf_settings_host_value("/ils_events");
106 osrfLogError(OSRF_LOG_MARK, "Unable to find ILS Events file: %s", xml);
110 xmlDocPtr doc = xmlParseFile(xml);
113 __oilsEventEvents = osrfNewHash();
114 __oilsEventDescriptions = osrfNewHash();
117 xmlNodePtr root = xmlDocGetRootElement(doc);
119 xmlNodePtr child = root->children;
121 if( !strcmp((char*) child->name, "event") ) {
122 xmlChar* code = xmlGetProp( child, BAD_CAST "code");
123 xmlChar* textcode = xmlGetProp( child, BAD_CAST "textcode");
124 if( code && textcode ) {
125 osrfHashSet( __oilsEventEvents, code, (char*) textcode );
129 /* here we collect all of the <desc> nodes on the event
130 * element and store them based on the xml:lang attribute
132 xmlNodePtr desc = child->children;
134 if( !strcmp((char*) desc->name, "desc") ) {
135 xmlChar* lang = xmlGetProp( desc, BAD_CAST "lang");
137 osrfLogDebug(OSRF_LOG_MARK, "Loaded event lang: %s", (char*) lang);
138 osrfHash* langHash = osrfHashGet(
139 __oilsEventDescriptions, (char*) lang);
141 langHash = osrfNewHash();
142 osrfHashSet(__oilsEventDescriptions, langHash, (char*) lang);
145 if( desc->children && (content = (char*) desc->children->content) ) {
146 osrfLogDebug(OSRF_LOG_MARK, "Loaded event desc: %s", content);
147 osrfHashSet( langHash, content, (char*) code );
159 if(!success) osrfLogError(OSRF_LOG_MARK, " ! Unable to parse events file: %s", xml );