/** Creates a new event. User is responsible for freeing event with oilsEventFree */
-oilsEvent* oilsNewEvent( char* file, int line, char* event );
+oilsEvent* oilsNewEvent( const char* file, int line, const char* event );
/** Creates a new event with payload.
* User is responsible for freeing event with oilsEventFree */
-oilsEvent* oilsNewEvent2( char* file, int line, char* event, jsonObject* payload );
+oilsEvent* oilsNewEvent2( const char* file, int line, const char* event,
+ const jsonObject* payload );
/** Creates a new event with permission and permission location.
* User is responsible for freeing event with oilsEventFree */
-oilsEvent* oilsNewEvent3( char* file, int line, char* event, char* perm, int permloc );
+oilsEvent* oilsNewEvent3( const char* file, int line, const char* event,
+ const char* perm, int permloc );
/** Creates a new event with permission, permission location, and payload.
* User is responsible for freeing event with oilsEventFree */
-oilsEvent* oilsNewEvent4( char* file, int line,
- char* event, char* perm, int permloc, jsonObject* payload );
+oilsEvent* oilsNewEvent4( const char* file, int line, const char* event,
+ const char* perm, int permloc, const jsonObject* payload );
/** Sets the permission info for the event */
-void oilsEventSetPermission( oilsEvent* event, char* perm, int permloc );
+void oilsEventSetPermission( oilsEvent* event, const char* perm, int permloc );
/* Sets the payload for the event
* This clones the payload, so the user is responsible
* for handling the payload object's memory
* */
-void oilsEventSetPayload( oilsEvent* event, jsonObject* payload );
+void oilsEventSetPayload( oilsEvent* event, const jsonObject* payload );
/** Creates the JSON associated with an event. The JSON should NOT be
* freed by the user. It will be freed by oilsEventFree */
jsonObject* oilsEventToJSON( oilsEvent* event );
-/* Parses the events file */
-void _oilsEventParseEvents();
-
/* Frees an event object */
void oilsEventFree( oilsEvent* event );
#include <libxml/tree.h>
#include "opensrf/osrf_settings.h"
-osrfHash* __oilsEventEvents = NULL;
-osrfHash* __oilsEventDescriptions = NULL;
+static void _oilsEventParseEvents();
-oilsEvent* oilsNewEvent( char* file, int line, char* event ) {
+// The following two osrfHashes are created when we
+// create the first osrfEvent, and are never freed.
+
+static osrfHash* _oilsEventEvents = NULL;
+static osrfHash* _oilsEventDescriptions = NULL;
+
+oilsEvent* oilsNewEvent( const char* file, int line, const char* event ) {
if(!event) return NULL;
osrfLogInfo(OSRF_LOG_MARK, "Creating new event: %s", event);
- if(!__oilsEventEvents) _oilsEventParseEvents();
- oilsEvent* evt = (oilsEvent*) safe_malloc(sizeof(oilsEvent));
+ if(!_oilsEventEvents) _oilsEventParseEvents();
+ oilsEvent* evt = safe_malloc(sizeof(oilsEvent));
evt->event = strdup(event);
+ evt->perm = NULL;
evt->permloc = -1;
+ evt->payload = NULL;
+ evt->json = NULL;
if(file) evt->file = strdup(file);
+ else evt->file = NULL;
evt->line = line;
return evt;
}
-oilsEvent* oilsNewEvent2( char* file, int line, char* event, jsonObject* payload ) {
+oilsEvent* oilsNewEvent2( const char* file, int line, const char* event,
+ const jsonObject* payload ) {
oilsEvent* evt = oilsNewEvent(file, line, event);
- oilsEventSetPayload(evt, payload);
+ if(payload) evt->payload = jsonObjectClone(payload);
return evt;
}
-oilsEvent* oilsNewEvent3( char* file, int line, char* event, char* perm, int permloc ) {
+oilsEvent* oilsNewEvent3( const char* file, int line, const char* event,
+ const char* perm, int permloc ) {
oilsEvent* evt = oilsNewEvent(file, line, event);
- oilsEventSetPermission( evt, perm, permloc );
+ if(perm) {
+ evt->perm = strdup(perm);
+ evt->permloc = permloc;
+ }
return evt;
}
-oilsEvent* oilsNewEvent4( char* file, int line,
- char* event, char* perm, int permloc, jsonObject* payload ) {
+oilsEvent* oilsNewEvent4( const char* file, int line, const char* event,
+ const char* perm, int permloc, const jsonObject* payload ) {
oilsEvent* evt = oilsNewEvent3( file, line, event, perm, permloc );
- if(evt) oilsEventSetPayload( evt, payload );
+ if(payload) evt->payload = jsonObjectClone(payload);
return evt;
}
-void oilsEventSetPermission( oilsEvent* event, char* perm, int permloc ) {
+void oilsEventSetPermission( oilsEvent* event, const char* perm, int permloc ) {
if(!(event && perm)) return;
+ if(event->perm) free(event->perm);
event->perm = strdup(perm);
event->permloc = permloc;
}
-void oilsEventSetPayload( oilsEvent* event, jsonObject* payload ) {
+void oilsEventSetPayload( oilsEvent* event, const jsonObject* payload ) {
if(!(event && payload)) return;
+ if(event->payload) jsonObjectFree(event->payload);
event->payload = jsonObjectClone(payload);
}
void oilsEventFree( oilsEvent* event ) {
if(!event) return;
+ free(event->event);
free(event->perm);
free(event->file);
if(event->json) jsonObjectFree(event->json);
- else jsonObjectFree(event->payload);
+ if(event->payload) jsonObjectFree(event->payload);
free(event);
}
jsonObject* oilsEventToJSON( oilsEvent* event ) {
if(!event) return NULL;
- char* code = osrfHashGet( __oilsEventEvents, event->event );
+ char* code = osrfHashGet( _oilsEventEvents, event->event );
if(!code) {
osrfLogError(OSRF_LOG_MARK, "No such event name: %s", event->event );
char* lang = "en-US"; /* assume this for now */
char* desc = NULL;
- osrfHash* h = osrfHashGet(__oilsEventDescriptions, lang);
+ osrfHash* h = osrfHashGet(_oilsEventDescriptions, lang);
if(h) {
osrfLogDebug(OSRF_LOG_MARK, "Loaded event lang hash for %s",lang);
desc = osrfHashGet(h, code);
if(event->perm) jsonObjectSetKey( json, "ilsperm", jsonNewObject(event->perm) );
if(event->permloc != -1) jsonObjectSetKey( json, "ilspermloc", jsonNewNumberObject(event->permloc) );
if(event->payload) jsonObjectSetKey( json, "payload", event->payload );
+
+ if(event->json) jsonObjectFree(event->json);
event->json = json;
return json;
}
-
-void _oilsEventParseEvents() {
+/* Parses the events file */
+static void _oilsEventParseEvents() {
char* xml = osrf_settings_host_value("/ils_events");
xmlDocPtr doc = xmlParseFile(xml);
free(xml);
int success = 0;
- __oilsEventEvents = osrfNewHash();
- __oilsEventDescriptions = osrfNewHash();
+ _oilsEventEvents = osrfNewHash();
+ _oilsEventDescriptions = osrfNewHash();
if( doc ) {
xmlNodePtr root = xmlDocGetRootElement(doc);
xmlChar* code = xmlGetProp( child, BAD_CAST "code");
xmlChar* textcode = xmlGetProp( child, BAD_CAST "textcode");
if( code && textcode ) {
- osrfHashSet( __oilsEventEvents, code, (char*) textcode );
+ osrfHashSet( _oilsEventEvents, code, (char*) textcode );
success = 1;
}
if(lang) {
osrfLogDebug(OSRF_LOG_MARK, "Loaded event lang: %s", (char*) lang);
osrfHash* langHash = osrfHashGet(
- __oilsEventDescriptions, (char*) lang);
+ _oilsEventDescriptions, (char*) lang);
if(!langHash) {
langHash = osrfNewHash();
- osrfHashSet(__oilsEventDescriptions, langHash, (char*) lang);
+ osrfHashSet(_oilsEventDescriptions, langHash, (char*) lang);
}
char* content;
if( desc->children && (content = (char*) desc->children->content) ) {