]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/c-apps/oils_event.c
Open-ILS/src/c-apps/oils_auth.c
[Evergreen.git] / Open-ILS / src / c-apps / oils_event.c
1 #include "oils_event.h"
2 #include <libxml/parser.h>
3 #include <libxml/tree.h>
4 #include "opensrf/osrf_settings.h"
5
6 osrfHash* __oilsEventEvents = NULL;
7
8 oilsEvent* oilsNewEvent( char* event ) {
9         if(!event) return NULL;
10         osrfLogInfo(OSRF_LOG_MARK, "Creating new event: %s", event);
11         if(!__oilsEventEvents) _oilsEventParseEvents();
12         oilsEvent* evt =  (oilsEvent*) safe_malloc(sizeof(oilsEvent));
13         evt->event = strdup(event);
14         evt->permloc = -1;
15         return evt;
16 }
17
18 oilsEvent* oilsNewEvent2( char* event, jsonObject* payload ) {
19         oilsEvent* evt = oilsNewEvent(event);
20         oilsEventSetPayload(evt, payload);
21         return evt;
22 }
23
24 oilsEvent* oilsNewEvent3( char* event, char* perm, int permloc ) {
25         oilsEvent* evt = oilsNewEvent(event);
26         oilsEventSetPermission( evt, perm, permloc );
27         return evt;
28 }
29
30 oilsEvent* oilsNewEvent4( char* event, char* perm, int permloc, jsonObject* payload ) {
31         oilsEvent* evt = oilsNewEvent3( event, perm, permloc );
32         if(evt) oilsEventSetPayload( evt, payload );
33         return evt;
34 }
35
36 void oilsEventSetPermission( oilsEvent* event, char* perm, int permloc ) {
37         if(!(event && perm)) return;
38         event->perm = strdup(perm);
39         event->permloc = permloc;
40 }
41
42 void oilsEventSetPayload( oilsEvent* event, jsonObject* payload ) {
43         if(!(event && payload)) return;
44         event->payload = jsonObjectClone(payload);
45 }
46
47
48 void oilsEventFree( oilsEvent* event ) {
49         if(!event) return;
50         free(event->perm);
51         if(event->json) jsonObjectFree(event->json);
52         else jsonObjectFree(event->payload);
53         free(event);
54 }
55
56
57 jsonObject* oilsEventToJSON( oilsEvent* event ) {
58         if(!event) return NULL;
59         char* code = osrfHashGet( __oilsEventEvents, event->event );
60
61         if(!code) {
62                 osrfLogError(OSRF_LOG_MARK,  "No such event name: %s", event->event );
63                 return NULL;
64         }
65
66         jsonObject* json = jsonNewObject(NULL);
67         jsonObjectSetKey( json, "ilsevent", jsonNewNumberObject(atoi(code)) );
68         jsonObjectSetKey( json, "textcode", jsonNewObject(event->event) );
69
70         if(event->perm) jsonObjectSetKey( json, "ilsperm", jsonNewObject(event->perm) );
71         if(event->permloc != -1) jsonObjectSetKey( json, "ilspermloc", jsonNewNumberObject(event->permloc) );
72         if(event->payload) jsonObjectSetKey( json, "payload", event->payload );
73         event->json = json;
74         return json;
75 }
76
77
78 void _oilsEventParseEvents() {
79         
80         char* xml = osrf_settings_host_value("/ils_events");
81
82         if(!xml) {
83                 osrfLogError(OSRF_LOG_MARK, "Unable to find ILS Events file: %s", xml);
84                 return;
85         }
86
87         xmlDocPtr doc = xmlParseFile(xml);
88         free(xml);
89         int success = 0;
90         __oilsEventEvents = osrfNewHash();
91
92         if( doc ) {
93                 xmlNodePtr root = xmlDocGetRootElement(doc);
94                 if( root ) {
95                         xmlNodePtr child = root->children;
96                         while( child ) {
97                                 if( !strcmp((char*) child->name, "event") ) {
98                                         xmlChar* code = xmlGetProp( child, BAD_CAST "code");
99                                         xmlChar* textcode = xmlGetProp( child, BAD_CAST "textcode");
100                                         if( code && textcode ) {
101                                                 osrfHashSet( __oilsEventEvents, code, textcode );
102                                                 success = 1;
103                                         }
104                                 }
105                                 child = child->next;
106                         }
107                 }
108         }
109
110         if(!success) osrfLogError(OSRF_LOG_MARK,  " ! Unable to parse events file: %s", xml );
111 }
112
113