D-Bus
1.6.8
Main Page
Related Pages
Modules
Data Structures
Files
File List
dbus
dbus-timeout.c
1
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2
/* dbus-timeout.c DBusTimeout implementation
3
*
4
* Copyright (C) 2003 CodeFactory AB
5
*
6
* Licensed under the Academic Free License version 2.1
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*
22
*/
23
24
#include <config.h>
25
#include "dbus-internals.h"
26
#include "dbus-timeout.h"
27
#include "dbus-list.h"
28
40
struct
DBusTimeout
41
{
42
int
refcount
;
43
int
interval
;
45
DBusTimeoutHandler
handler
;
46
void
*
handler_data
;
47
DBusFreeFunction
free_handler_data_function
;
49
void
*
data
;
50
DBusFreeFunction
free_data_function
;
51
unsigned
int
enabled
: 1;
52
};
53
62
DBusTimeout
*
63
_dbus_timeout_new
(
int
interval,
64
DBusTimeoutHandler
handler,
65
void
*data,
66
DBusFreeFunction
free_data_function)
67
{
68
DBusTimeout
*timeout;
69
70
timeout =
dbus_new0
(
DBusTimeout
, 1);
71
if
(timeout ==
NULL
)
72
return
NULL
;
73
74
timeout->
refcount
= 1;
75
timeout->
interval
= interval;
76
77
timeout->
handler
= handler;
78
timeout->
handler_data
= data;
79
timeout->
free_handler_data_function
= free_data_function;
80
81
timeout->
enabled
=
TRUE
;
82
83
return
timeout;
84
}
85
92
DBusTimeout
*
93
_dbus_timeout_ref
(
DBusTimeout
*timeout)
94
{
95
timeout->
refcount
+= 1;
96
97
return
timeout;
98
}
99
106
void
107
_dbus_timeout_unref
(
DBusTimeout
*timeout)
108
{
109
_dbus_assert
(timeout !=
NULL
);
110
_dbus_assert
(timeout->
refcount
> 0);
111
112
timeout->
refcount
-= 1;
113
if
(timeout->
refcount
== 0)
114
{
115
dbus_timeout_set_data
(timeout,
NULL
,
NULL
);
/* call free_data_function */
116
117
if
(timeout->
free_handler_data_function
)
118
(* timeout->
free_handler_data_function
) (timeout->
handler_data
);
119
120
dbus_free
(timeout);
121
}
122
}
123
133
void
134
_dbus_timeout_set_interval
(
DBusTimeout
*timeout,
135
int
interval)
136
{
137
_dbus_assert
(interval >= 0);
138
139
timeout->
interval
= interval;
140
}
141
152
void
153
_dbus_timeout_set_enabled
(
DBusTimeout
*timeout,
154
dbus_bool_t
enabled)
155
{
156
timeout->
enabled
= enabled !=
FALSE
;
157
}
158
159
176
struct
DBusTimeoutList
177
{
178
DBusList
*
timeouts
;
180
DBusAddTimeoutFunction
add_timeout_function
;
181
DBusRemoveTimeoutFunction
remove_timeout_function
;
182
DBusTimeoutToggledFunction
timeout_toggled_function
;
183
void
*
timeout_data
;
184
DBusFreeFunction
timeout_free_data_function
;
185
};
186
193
DBusTimeoutList
*
194
_dbus_timeout_list_new
(
void
)
195
{
196
DBusTimeoutList
*timeout_list;
197
198
timeout_list =
dbus_new0
(
DBusTimeoutList
, 1);
199
if
(timeout_list ==
NULL
)
200
return
NULL
;
201
202
return
timeout_list;
203
}
204
210
void
211
_dbus_timeout_list_free
(
DBusTimeoutList
*timeout_list)
212
{
213
/* free timeout_data and remove timeouts as a side effect */
214
_dbus_timeout_list_set_functions
(timeout_list,
215
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
216
217
_dbus_list_foreach
(&timeout_list->
timeouts
,
218
(
DBusForeachFunction
)
_dbus_timeout_unref
,
219
NULL
);
220
_dbus_list_clear
(&timeout_list->
timeouts
);
221
222
dbus_free
(timeout_list);
223
}
224
238
dbus_bool_t
239
_dbus_timeout_list_set_functions
(
DBusTimeoutList
*timeout_list,
240
DBusAddTimeoutFunction
add_function,
241
DBusRemoveTimeoutFunction
remove_function,
242
DBusTimeoutToggledFunction
toggled_function,
243
void
*data,
244
DBusFreeFunction
free_data_function)
245
{
246
/* Add timeouts with the new function, failing on OOM */
247
if
(add_function !=
NULL
)
248
{
249
DBusList
*link;
250
251
link =
_dbus_list_get_first_link
(&timeout_list->
timeouts
);
252
while
(link !=
NULL
)
253
{
254
DBusList
*next =
_dbus_list_get_next_link
(&timeout_list->
timeouts
,
255
link);
256
257
if
(!(* add_function) (link->
data
, data))
258
{
259
/* remove it all again and return FALSE */
260
DBusList
*link2;
261
262
link2 =
_dbus_list_get_first_link
(&timeout_list->
timeouts
);
263
while
(link2 != link)
264
{
265
DBusList
*next =
_dbus_list_get_next_link
(&timeout_list->
timeouts
,
266
link2);
267
268
(* remove_function) (link2->
data
, data);
269
270
link2 = next;
271
}
272
273
return
FALSE
;
274
}
275
276
link = next;
277
}
278
}
279
280
/* Remove all current timeouts from previous timeout handlers */
281
282
if
(timeout_list->
remove_timeout_function
!=
NULL
)
283
{
284
_dbus_list_foreach
(&timeout_list->
timeouts
,
285
(
DBusForeachFunction
) timeout_list->
remove_timeout_function
,
286
timeout_list->
timeout_data
);
287
}
288
289
if
(timeout_list->
timeout_free_data_function
!=
NULL
)
290
(* timeout_list->
timeout_free_data_function
) (timeout_list->
timeout_data
);
291
292
timeout_list->
add_timeout_function
= add_function;
293
timeout_list->
remove_timeout_function
= remove_function;
294
timeout_list->
timeout_toggled_function
= toggled_function;
295
timeout_list->
timeout_data
= data;
296
timeout_list->
timeout_free_data_function
= free_data_function;
297
298
return
TRUE
;
299
}
300
309
dbus_bool_t
310
_dbus_timeout_list_add_timeout
(
DBusTimeoutList
*timeout_list,
311
DBusTimeout
*timeout)
312
{
313
if
(!
_dbus_list_append
(&timeout_list->
timeouts
, timeout))
314
return
FALSE
;
315
316
_dbus_timeout_ref
(timeout);
317
318
if
(timeout_list->
add_timeout_function
!=
NULL
)
319
{
320
if
(!(* timeout_list->
add_timeout_function
) (timeout,
321
timeout_list->
timeout_data
))
322
{
323
_dbus_list_remove_last
(&timeout_list->
timeouts
, timeout);
324
_dbus_timeout_unref
(timeout);
325
return
FALSE
;
326
}
327
}
328
329
return
TRUE
;
330
}
331
339
void
340
_dbus_timeout_list_remove_timeout
(
DBusTimeoutList
*timeout_list,
341
DBusTimeout
*timeout)
342
{
343
if
(!
_dbus_list_remove
(&timeout_list->
timeouts
, timeout))
344
_dbus_assert_not_reached
(
"Nonexistent timeout was removed"
);
345
346
if
(timeout_list->
remove_timeout_function
!=
NULL
)
347
(* timeout_list->
remove_timeout_function
) (timeout,
348
timeout_list->
timeout_data
);
349
350
_dbus_timeout_unref
(timeout);
351
}
352
361
void
362
_dbus_timeout_list_toggle_timeout
(
DBusTimeoutList
*timeout_list,
363
DBusTimeout
*timeout,
364
dbus_bool_t
enabled)
365
{
366
enabled = !!enabled;
367
368
if
(enabled == timeout->
enabled
)
369
return
;
370
371
timeout->
enabled
= enabled;
372
373
if
(timeout_list->
timeout_toggled_function
!=
NULL
)
374
(* timeout_list->
timeout_toggled_function
) (timeout,
375
timeout_list->
timeout_data
);
376
}
377
415
int
416
dbus_timeout_get_interval
(
DBusTimeout
*timeout)
417
{
418
return
timeout->
interval
;
419
}
420
428
void
*
429
dbus_timeout_get_data
(
DBusTimeout
*timeout)
430
{
431
return
timeout->
data
;
432
}
433
445
void
446
dbus_timeout_set_data
(
DBusTimeout
*timeout,
447
void
*data,
448
DBusFreeFunction
free_data_function)
449
{
450
if
(timeout->
free_data_function
!=
NULL
)
451
(* timeout->
free_data_function
) (timeout->
data
);
452
453
timeout->
data
= data;
454
timeout->
free_data_function
= free_data_function;
455
}
456
471
dbus_bool_t
472
dbus_timeout_handle
(
DBusTimeout
*timeout)
473
{
474
return
(* timeout->
handler
) (timeout->
handler_data
);
475
}
476
477
485
dbus_bool_t
486
dbus_timeout_get_enabled
(
DBusTimeout
*timeout)
487
{
488
return
timeout->
enabled
;
489
}
490
Generated on Mon Jun 30 2014 14:32:57 for D-Bus by
1.8.1.2