28 #include "qofevent-p.h" 31 static guint suspend_counter = 0;
32 static gint next_handler_id = 1;
33 static guint handler_run_level = 0;
34 static guint pending_deletes = 0;
35 static GList *handlers = NULL;
43 find_next_handler_id (
void)
50 handler_id = next_handler_id;
57 if (hi->handler_id == handler_id)
67 next_handler_id = handler_id + 1;
77 ENTER (
"(handler=%p, data=%p)", handler, user_data);
82 PERR (
"no handler specified");
87 handler_id = find_next_handler_id ();
92 hi->handler = handler;
93 hi->user_data = user_data;
94 hi->handler_id = handler_id;
96 handlers = g_list_prepend (handlers, hi);
97 LEAVE (
"(handler=%p, data=%p) handler_id=%d", handler, user_data,
107 ENTER (
"(handler_id=%d)", handler_id);
108 for (node = handlers; node; node = node->next)
112 if (hi->handler_id != handler_id)
121 LEAVE (
"(handler_id=%d) handler=%p data=%p", handler_id,
122 hi->handler, hi->user_data);
127 if (handler_run_level == 0)
129 handlers = g_list_remove_link (handlers, node);
130 g_list_free_1 (node);
141 PERR (
"no such handler: %d", handler_id);
149 if (suspend_counter == 0)
151 PERR (
"suspend counter overflow");
158 if (suspend_counter == 0)
160 PERR (
"suspend counter underflow");
172 GList *next_node = NULL;
173 gboolean G_GNUC_UNUSED use_old_handlers = FALSE;
175 g_return_if_fail (entity);
177 if (event_id <= QOF_EVENT__LAST)
178 use_old_handlers = TRUE;
190 for (node = handlers; node; node = next_node)
194 next_node = node->next;
197 PINFO (
"id=%d type=%s", hi->handler_id, entity->e_type);
198 hi->handler (entity, event_id, hi->user_data, event_data);
206 if (handler_run_level == 0 && pending_deletes)
208 for (node = handlers; node; node = next_node)
211 next_node = node->next;
212 if (hi->handler == NULL)
215 handlers = g_list_remove_link (handlers, node);
216 g_list_free_1 (node);
231 qof_event_generate_internal (entity, event_id, event_data);
243 qof_event_generate_internal (entity, event_id, event_data);
256 qof_event_generate_internal (&ent, event_id, NULL);
#define PERR(format, args...)
#define PINFO(format, args...)
void(* QofEventHandler)(QofEntity *ent, QofEventId event_type, gpointer handler_data, gpointer event_data)
Handler invoked when an event is generated.
#define LEAVE(format, args...)
void qof_event_gen(QofEntity *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
gint qof_event_register_handler(QofEventHandler handler, gpointer user_data)
Register a handler for events.
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
void qof_event_suspend(void)
Suspend all engine events.
void qof_event_resume(void)
#define ENTER(format, args...)
const gchar * QofLogModule