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);