old files clean
[lttv.git] / ltt / branches / poly / lttv / main / hook.c
CommitLineData
ffd54a90 1
3d218f2a 2#include <lttv/hook.h>
eccb5352 3
4
dc877563 5typedef struct _LttvHookClosure {
ffd54a90 6 LttvHook hook;
eccb5352 7 void *hook_data;
dc877563 8} LttvHookClosure;
eccb5352 9
10
dc877563 11LttvHooks *lttv_hooks_new()
12{
13 return g_array_new(FALSE, FALSE, sizeof(LttvHookClosure));
eccb5352 14}
15
dc877563 16
17void lttv_hooks_destroy(LttvHooks *h)
18{
f7afe191 19 g_critical("lttv_hooks_destroy()");
eccb5352 20 g_array_free(h, TRUE);
21}
22
eccb5352 23
dc877563 24void lttv_hooks_add(LttvHooks *h, LttvHook f, void *hook_data)
25{
26 LttvHookClosure c;
27
28 if(h == NULL)g_error("Null hook added");
eccb5352 29
30 c.hook = f;
31 c.hook_data = hook_data;
32 g_array_append_val(h,c);
33}
34
35
dc877563 36void lttv_hooks_add_list(LttvHooks *h, LttvHooks *list)
37{
38 guint i;
39
ffd54a90 40 if(list == NULL) return;
dc877563 41 for(i = 0 ; i < list->len; i++) {
42 g_array_append_val(h,g_array_index(list, LttvHookClosure, i));
43 }
44}
45
46
47void *lttv_hooks_remove(LttvHooks *h, LttvHook f)
48{
49 unsigned i;
50
51 void *hook_data;
52
53 LttvHookClosure *c;
54
55 for(i = 0 ; i < h->len ; i++) {
56 c = &g_array_index(h, LttvHookClosure, i);
57 if(c->hook == f) {
58 hook_data = c->hook_data;
59 lttv_hooks_remove_by_position(h, i);
60 return hook_data;
61 }
62 }
63 return NULL;
64}
65
66
67void lttv_hooks_remove_data(LttvHooks *h, LttvHook f, void *hook_data)
eccb5352 68{
dc877563 69 unsigned i;
70
71 LttvHookClosure *c;
eccb5352 72
73 for(i = 0 ; i < h->len ; i++) {
dc877563 74 c = &g_array_index(h, LttvHookClosure, i);
75 if(c->hook == f && c->hook_data == hook_data) {
76 lttv_hooks_remove_by_position(h, i);
77 return;
78 }
79 }
80}
81
82
83void lttv_hooks_remove_list(LttvHooks *h, LttvHooks *list)
84{
85 guint i, j;
86
87 LttvHookClosure *c, *c_list;
88
ffd54a90 89 if(list == NULL) return;
dc877563 90 for(i = 0, j = 0 ; i < h->len && j < list->len ;) {
91 c = &g_array_index(h, LttvHookClosure, i);
92 c_list = &g_array_index(list, LttvHookClosure, j);
93 if(c->hook == c_list->hook && c->hook_data == c_list->hook_data) {
94 lttv_hooks_remove_by_position(h, i);
95 j++;
96 }
97 else i++;
98 }
99
100 /* Normally the hooks in h are ordered as in list. If this is not the case,
101 try harder here. */
102
103 if(j < list->len) {
104 for(; j < list->len ; j++) {
105 c_list = &g_array_index(list, LttvHookClosure, j);
106 lttv_hooks_remove_data(h, c_list->hook, c_list->hook_data);
107 }
eccb5352 108 }
109}
110
111
dc877563 112unsigned lttv_hooks_number(LttvHooks *h)
113{
114 return h->len;
115}
eccb5352 116
dc877563 117
118void lttv_hooks_get(LttvHooks *h, unsigned i, LttvHook *f, void **hook_data)
119{
120 LttvHookClosure *c;
121
122 c = &g_array_index(h, LttvHookClosure, i);
123 *f = c->hook;
124 *hook_data = c->hook_data;
125}
126
127
ffd54a90 128void lttv_hooks_remove_by_position(LttvHooks *h, unsigned i)
dc877563 129{
ffd54a90 130 g_array_remove_index(h, i);
dc877563 131}
132
133
134gboolean lttv_hooks_call(LttvHooks *h, void *call_data)
135{
b445142a 136 gboolean ret, sum_ret = FALSE;
dc877563 137
138 LttvHookClosure *c;
139
ffd54a90 140 guint i;
141
dc877563 142 if(h != NULL) {
143 for(i = 0 ; i < h->len ; i++) {
144 c = &g_array_index(h, LttvHookClosure, i);
b445142a 145 ret = c->hook(c->hook_data,call_data);
146 sum_ret = sum_ret || ret;
dc877563 147 }
148 }
b445142a 149 return sum_ret;
dc877563 150}
151
152
153gboolean lttv_hooks_call_check(LttvHooks *h, void *call_data)
154{
155 LttvHookClosure *c;
156
ffd54a90 157 guint i;
158
dc877563 159 for(i = 0 ; i < h->len ; i++) {
160 c = &g_array_index(h, LttvHookClosure, i);
161 if(c->hook(c->hook_data,call_data)) return TRUE;
162 }
163 return FALSE;
164}
165
166
167LttvHooksById *lttv_hooks_by_id_new()
168{
eccb5352 169 return g_ptr_array_new();
170}
171
172
dc877563 173void lttv_hooks_by_id_destroy(LttvHooksById *h)
174{
175 guint i;
176
177 for(i = 0 ; i < h->len ; i++) {
178 if(h->pdata[i] != NULL) lttv_hooks_destroy((LttvHooks *)(h->pdata[i]));
179 }
eccb5352 180 g_ptr_array_free(h, TRUE);
181}
182
183
ffd54a90 184LttvHooks *lttv_hooks_by_id_find(LttvHooksById *h, unsigned id)
eccb5352 185{
dc877563 186 if(h->len <= id) g_ptr_array_set_size(h, id + 1);
eccb5352 187 if(h->pdata[id] == NULL) h->pdata[id] = lttv_hooks_new();
dc877563 188 return h->pdata[id];
eccb5352 189}
190
dc877563 191
192unsigned lttv_hooks_by_id_max_id(LttvHooksById *h)
eccb5352 193{
dc877563 194 return h->len;
195}
196
197
198LttvHooks *lttv_hooks_by_id_get(LttvHooksById *h, unsigned id)
199{
200 if(id < h->len) return h->pdata[id];
201 return NULL;
202}
203
204
205void lttv_hooks_by_id_remove(LttvHooksById *h, unsigned id)
206{
207 if(id < h->len && h->pdata[id] != NULL) {
208 lttv_hooks_destroy((LttvHooks *)h->pdata[id]);
209 h->pdata[id] = NULL;
210 }
eccb5352 211}
212
This page took 0.034547 seconds and 4 git commands to generate.