1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2000-2012 Jeffrey Stedfast
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public License
7 * as published by the Free Software Foundation; either version 2.1
8 * of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free
17 * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
26 #include "gmime-events.h"
29 typedef struct _EventListener {
30 struct _EventListener *next;
31 struct _EventListener *prev;
32 GMimeEventCallback callback;
37 static EventListener *
38 event_listener_new (GMimeEventCallback callback, gpointer user_data)
40 EventListener *listener;
42 listener = g_slice_new (EventListener);
43 listener->user_data = user_data;
44 listener->callback = callback;
45 listener->prev = NULL;
46 listener->next = NULL;
47 listener->blocked = 0;
53 event_listener_free (EventListener *listener)
55 g_slice_free (EventListener, listener);
67 * @owner: a pointer to the object owning this event
69 * Creates a new #GMimeEvent context.
71 * Returns: a newly allocated #GMimeEvent context.
74 g_mime_event_new (gpointer owner)
78 event = g_slice_new (GMimeEvent);
79 list_init (&event->list);
87 * g_mime_event_destroy:
88 * @event: a #GMimeEvent
90 * Destroys an event context.
93 g_mime_event_destroy (GMimeEvent *event)
95 EventListener *node, *next;
97 node = (EventListener *) event->list.head;
100 event_listener_free (node);
104 g_slice_free (GMimeEvent, event);
108 static EventListener *
109 g_mime_event_find_listener (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data)
113 node = (EventListener *) event->list.head;
115 if (node->callback == callback && node->user_data == user_data)
125 * g_mime_event_block:
126 * @event: a #GMimeEvent
127 * @callback: a #GMimeEventCallback
128 * @user_data: user context data
130 * Blocks the specified callback from being called when @event is emitted.
133 g_mime_event_block (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data)
135 EventListener *listener;
137 if ((listener = g_mime_event_find_listener (event, callback, user_data)))
143 * g_mime_event_unblock:
144 * @event: a #GMimeEvent
145 * @callback: a #GMimeEventCallback
146 * @user_data: user context data
148 * Unblocks the specified callback from being called when @event is
152 g_mime_event_unblock (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data)
154 EventListener *listener;
156 if ((listener = g_mime_event_find_listener (event, callback, user_data)))
163 * @event: a #GMimeEvent
164 * @callback: a #GMimeEventCallback
165 * @user_data: user context data
167 * Adds a callback function that will get called with the specified
168 * @user_data whenever @event is emitted.
171 g_mime_event_add (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data)
173 EventListener *listener;
175 listener = event_listener_new (callback, user_data);
176 list_append (&event->list, (ListNode *) listener);
181 * g_mime_event_remove:
182 * @event: a #GMimeEvent
183 * @callback: a #GMimeEventCallback
184 * @user_data: user context data
186 * Removes the specified callback function from the list of callbacks
187 * that will be called when the @event is emitted.
190 g_mime_event_remove (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data)
192 EventListener *listener;
194 if ((listener = g_mime_event_find_listener (event, callback, user_data))) {
195 list_unlink ((ListNode *) listener);
196 event_listener_free (listener);
203 * @event: a #GMimeEvent
204 * @args: an argument pointer
206 * Calls each callback registered with this @event with the specified
210 g_mime_event_emit (GMimeEvent *event, gpointer args)
214 node = (EventListener *) event->list.head;
216 if (node->blocked <= 0)
217 node->callback (event->owner, args, node->user_data);