index.html
Main Page
|
modules.html
Modules
|
namespaces.html
Namespace List
|
hierarchy.html
Class Hierarchy
|
annotated.html
Data Structures
|
dirs.html
Directories
|
files.html
File List
|
namespacemembers.html
Namespace Members
|
functions.html
Data Fields
|
pages.html
Related Pages
dir_000004.html
dbus
dbus-watch.c
00001
/* -*- mode: C; c-file-style: "gnu" -*- */
00002
/* dbus-watch.c DBusWatch implementation
00003
*
00004
* Copyright (C) 2002, 2003  Red Hat Inc.
00005
*
00006
* Licensed under the Academic Free License version 2.1
00007
*
00008
* This program is free software; you can redistribute it and/or modify
00009
* it under the terms of the GNU General Public License as published by
00010
* the Free Software Foundation; either version 2 of the License, or
00011
* (at your option) any later version.
00012
*
00013
* This program is distributed in the hope that it will be useful,
00014
* but WITHOUT ANY WARRANTY; without even the implied warranty of
00015
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016
* GNU General Public License for more details.
00017
*
00018
* You should have received a copy of the GNU General Public License
00019
* along with this program; if not, write to the Free Software
00020
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021
*
00022
*/
00023
00024
#include "dbus-internals.h"
00025
#include "dbus-watch.h"
00026
#include "dbus-list.h"
00027
structDBusWatch.html
00039
struct
structDBusWatch.html
DBusWatch
00040 {
structDBusWatch.html#o0
00041
int
structDBusWatch.html#o0
refcount
;
structDBusWatch.html#o1
00042
int
structDBusWatch.html#o1
fd
;
structDBusWatch.html#o2
00043
unsigned
int
structDBusWatch.html#o2
flags
;
structDBusWatch.html#o3
00045
DBusWatchHandler
structDBusWatch.html#o3
handler
;
structDBusWatch.html#o4
00046
void
*
structDBusWatch.html#o4
handler_data
;
structDBusWatch.html#o5
00047
group__DBusMemory.html#ga8
DBusFreeFunction
structDBusWatch.html#o5
free_handler_data_function
;
structDBusWatch.html#o6
00049
void
*
structDBusWatch.html#o6
data
;
structDBusWatch.html#o7
00050
group__DBusMemory.html#ga8
DBusFreeFunction
structDBusWatch.html#o7
free_data_function
;
structDBusWatch.html#o8
00051
unsigned
int
structDBusWatch.html#o8
enabled
: 1;
00052 };
00053
00066
structDBusWatch.html
DBusWatch
*
group__DBusWatchInternals.html#ga0
00067
group__DBusWatchInternals.html#ga0
_dbus_watch_new
(
int
fd,
00068
unsigned
int
flags,
00069
group__DBusTypes.html#ga2
dbus_bool_t
enabled,
00070                  DBusWatchHandler  handler,
00071
void
*data,
00072
group__DBusMemory.html#ga8
DBusFreeFunction
free_data_function)
00073 {
00074
structDBusWatch.html
DBusWatch
*watch;
00075
00076
#define VALID_WATCH_FLAGS (DBUS_WATCH_WRITABLE | DBUS_WATCH_READABLE)
00077
00078
group__DBusInternalsUtils.html#ga130
_dbus_assert
((flags & VALID_WATCH_FLAGS) == flags);
00079
00080   watch =
group__DBusMemory.html#ga7
dbus_new0
(
structDBusWatch.html
DBusWatch
, 1);
00081
if
(watch ==
group__DBusMacros.html#ga4
NULL
)
00082
return
group__DBusMacros.html#ga4
NULL
;
00083
00084   watch->
structDBusWatch.html#o0
refcount
= 1;
00085   watch->
structDBusWatch.html#o1
fd
= fd;
00086   watch->
structDBusWatch.html#o2
flags
= flags;
00087   watch->
structDBusWatch.html#o8
enabled
= enabled;
00088
00089   watch->
structDBusWatch.html#o3
handler
= handler;
00090   watch->
structDBusWatch.html#o4
handler_data
= data;
00091   watch->
structDBusWatch.html#o5
free_handler_data_function
= free_data_function;
00092
00093
return
watch;
00094 }
00095
00102
structDBusWatch.html
DBusWatch
*
group__DBusWatchInternals.html#ga1
00103
group__DBusWatchInternals.html#ga1
_dbus_watch_ref
(
structDBusWatch.html
DBusWatch
*watch)
00104 {
00105   watch->
structDBusWatch.html#o0
refcount
+= 1;
00106
00107
return
watch;
00108 }
00109
00116
void
group__DBusWatchInternals.html#ga2
00117
group__DBusWatchInternals.html#ga2
_dbus_watch_unref
(
structDBusWatch.html
DBusWatch
*watch)
00118 {
00119
group__DBusInternalsUtils.html#ga130
_dbus_assert
(watch !=
group__DBusMacros.html#ga4
NULL
);
00120
group__DBusInternalsUtils.html#ga130
_dbus_assert
(watch->
structDBusWatch.html#o0
refcount
> 0);
00121
00122   watch->
structDBusWatch.html#o0
refcount
-= 1;
00123
if
(watch->
structDBusWatch.html#o0
refcount
== 0)
00124     {
00125
group__DBusWatch.html#ga3
dbus_watch_set_data
(watch,
group__DBusMacros.html#ga4
NULL
,
group__DBusMacros.html#ga4
NULL
);
/* call free_data_function */
00126
00127
if
(watch->
structDBusWatch.html#o5
free_handler_data_function
)
00128         (* watch->
structDBusWatch.html#o5
free_handler_data_function
) (watch->
structDBusWatch.html#o4
handler_data
);
00129
00130
group__DBusMemory.html#ga3
dbus_free
(watch);
00131     }
00132 }
00133
00144
void
group__DBusWatchInternals.html#ga3
00145
group__DBusWatchInternals.html#ga3
_dbus_watch_invalidate
(
structDBusWatch.html
DBusWatch
*watch)
00146 {
00147   watch->
structDBusWatch.html#o1
fd
= -1;
00148   watch->
structDBusWatch.html#o2
flags
= 0;
00149 }
00150
00160
void
group__DBusWatchInternals.html#ga4
00161
group__DBusWatchInternals.html#ga4
_dbus_watch_sanitize_condition
(
structDBusWatch.html
DBusWatch
*watch,
00162
unsigned
int
*condition)
00163 {
00164
if
(!(watch->
structDBusWatch.html#o2
flags
& DBUS_WATCH_READABLE))
00165     *condition &= ~DBUS_WATCH_READABLE;
00166
if
(!(watch->
structDBusWatch.html#o2
flags
& DBUS_WATCH_WRITABLE))
00167     *condition &= ~DBUS_WATCH_WRITABLE;
00168 }
00169
00170
structDBusWatchList.html
00190
struct
structDBusWatchList.html
DBusWatchList
00191 {
structDBusWatchList.html#o0
00192
structDBusList.html
DBusList
*
structDBusWatchList.html#o0
watches
;
structDBusWatchList.html#o1
00194
DBusAddWatchFunction
structDBusWatchList.html#o1
add_watch_function
;
structDBusWatchList.html#o2
00195
DBusRemoveWatchFunction
structDBusWatchList.html#o2
remove_watch_function
;
structDBusWatchList.html#o3
00196
DBusWatchToggledFunction
structDBusWatchList.html#o3
watch_toggled_function
;
structDBusWatchList.html#o4
00197
void
*
structDBusWatchList.html#o4
watch_data
;
structDBusWatchList.html#o5
00198
group__DBusMemory.html#ga8
DBusFreeFunction
structDBusWatchList.html#o5
watch_free_data_function
;
00199 };
00200
00207
structDBusWatchList.html
DBusWatchList
*
group__DBusWatchInternals.html#ga5
00208
group__DBusWatchInternals.html#ga5
_dbus_watch_list_new
(
void
)
00209 {
00210
structDBusWatchList.html
DBusWatchList
*watch_list;
00211
00212   watch_list =
group__DBusMemory.html#ga7
dbus_new0
(
structDBusWatchList.html
DBusWatchList
, 1);
00213
if
(watch_list ==
group__DBusMacros.html#ga4
NULL
)
00214
return
group__DBusMacros.html#ga4
NULL
;
00215
00216
return
watch_list;
00217 }
00218
00224
void
group__DBusWatchInternals.html#ga6
00225
group__DBusWatchInternals.html#ga6
_dbus_watch_list_free
(
structDBusWatchList.html
DBusWatchList
*watch_list)
00226 {
00227
/* free watch_data and removes watches as a side effect */
00228
group__DBusWatchInternals.html#ga7
_dbus_watch_list_set_functions
(watch_list,
00229
group__DBusMacros.html#ga4
NULL
,
group__DBusMacros.html#ga4
NULL
,
group__DBusMacros.html#ga4
NULL
,
group__DBusMacros.html#ga4
NULL
,
group__DBusMacros.html#ga4
NULL
);
00230
group__DBusList.html#ga22
_dbus_list_foreach
(&watch_list->
structDBusWatchList.html#o0
watches
,
00231                       (
group__DBusInternalsUtils.html#ga161
DBusForeachFunction
)
group__DBusWatchInternals.html#ga2
_dbus_watch_unref
,
00232
group__DBusMacros.html#ga4
NULL
);
00233
group__DBusList.html#ga12
_dbus_list_clear
(&watch_list->
structDBusWatchList.html#o0
watches
);
00234
00235
group__DBusMemory.html#ga3
dbus_free
(watch_list);
00236 }
00237
00252
group__DBusTypes.html#ga2
dbus_bool_t
group__DBusWatchInternals.html#ga7
00253
group__DBusWatchInternals.html#ga7
_dbus_watch_list_set_functions
(
structDBusWatchList.html
DBusWatchList
*watch_list,
00254                                 DBusAddWatchFunction     add_function,
00255                                 DBusRemoveWatchFunction  remove_function,
00256                                 DBusWatchToggledFunction toggled_function,
00257
void
*data,
00258
group__DBusMemory.html#ga8
DBusFreeFunction
free_data_function)
00259 {
00260
/* Add watches with the new watch function, failing on OOM */
00261
if
(add_function !=
group__DBusMacros.html#ga4
NULL
)
00262     {
00263
structDBusList.html
DBusList
*link;
00264
00265       link =
group__DBusList.html#ga13
_dbus_list_get_first_link
(&watch_list->
structDBusWatchList.html#o0
watches
);
00266
while
(link !=
group__DBusMacros.html#ga4
NULL
)
00267         {
00268
structDBusList.html
DBusList
*next =
group__DBusList.html#ga24
_dbus_list_get_next_link
(&watch_list->
structDBusWatchList.html#o0
watches
,
00269                                                      link);
00270
00271
#ifdef DBUS_ENABLE_VERBOSE_MODE
00272
{
00273
const
char
*watch_type;
00274
int
flags;
00275
00276             flags =
group__DBusWatch.html#ga1
dbus_watch_get_flags
(link->
structDBusList.html#o2
data
);
00277
if
((flags & DBUS_WATCH_READABLE) &&
00278                 (flags & DBUS_WATCH_WRITABLE))
00279               watch_type =
"readwrite"
;
00280
else
if
(flags & DBUS_WATCH_READABLE)
00281               watch_type =
"read"
;
00282
else
if
(flags & DBUS_WATCH_WRITABLE)
00283               watch_type =
"write"
;
00284
else
00285               watch_type =
"not read or write"
;
00286
00287             _dbus_verbose (
"Adding a %s watch on fd %d using newly-set add watch function\n"
,
00288                            watch_type,
00289
group__DBusWatch.html#ga0
dbus_watch_get_fd
(link->
structDBusList.html#o2
data
));
00290           }
00291
#endif
/* DBUS_ENABLE_VERBOSE_MODE */
00292
00293
if
(!(* add_function) (link->
structDBusList.html#o2
data
, data))
00294             {
00295
/* remove it all again and return FALSE */
00296
structDBusList.html
DBusList
*link2;
00297
00298               link2 =
group__DBusList.html#ga13
_dbus_list_get_first_link
(&watch_list->
structDBusWatchList.html#o0
watches
);
00299
while
(link2 != link)
00300                 {
00301
structDBusList.html
DBusList
*next =
group__DBusList.html#ga24
_dbus_list_get_next_link
(&watch_list->
structDBusWatchList.html#o0
watches
,
00302                                                              link2);
00303
00304                   _dbus_verbose (
"Removing watch on fd %d using newly-set remove function because initial add failed\n"
,
00305
group__DBusWatch.html#ga0
dbus_watch_get_fd
(link2->
structDBusList.html#o2
data
));
00306
00307                   (* remove_function) (link2->
structDBusList.html#o2
data
, data);
00308
00309                   link2 = next;
00310                 }
00311
00312
return
group__DBusMacros.html#ga3
FALSE
;
00313             }
00314
00315           link = next;
00316         }
00317     }
00318
00319
/* Remove all current watches from previous watch handlers */
00320
00321
if
(watch_list->
structDBusWatchList.html#o2
remove_watch_function
!=
group__DBusMacros.html#ga4
NULL
)
00322     {
00323       _dbus_verbose (
"Removing all pre-existing watches\n"
);
00324
00325
group__DBusList.html#ga22
_dbus_list_foreach
(&watch_list->
structDBusWatchList.html#o0
watches
,
00326                           (
group__DBusInternalsUtils.html#ga161
DBusForeachFunction
) watch_list->
structDBusWatchList.html#o2
remove_watch_function
,
00327                           watch_list->
structDBusWatchList.html#o4
watch_data
);
00328     }
00329
00330
if
(watch_list->
structDBusWatchList.html#o5
watch_free_data_function
!=
group__DBusMacros.html#ga4
NULL
)
00331     (* watch_list->
structDBusWatchList.html#o5
watch_free_data_function
) (watch_list->
structDBusWatchList.html#o4
watch_data
);
00332
00333   watch_list->
structDBusWatchList.html#o1
add_watch_function
= add_function;
00334   watch_list->
structDBusWatchList.html#o2
remove_watch_function
= remove_function;
00335   watch_list->
structDBusWatchList.html#o3
watch_toggled_function
= toggled_function;
00336   watch_list->
structDBusWatchList.html#o4
watch_data
= data;
00337   watch_list->
structDBusWatchList.html#o5
watch_free_data_function
= free_data_function;
00338
00339
return
group__DBusMacros.html#ga2
TRUE
;
00340 }
00341
00350
group__DBusTypes.html#ga2
dbus_bool_t
group__DBusWatchInternals.html#ga8
00351
group__DBusWatchInternals.html#ga8
_dbus_watch_list_add_watch
(
structDBusWatchList.html
DBusWatchList
*watch_list,
00352
structDBusWatch.html
DBusWatch
*watch)
00353 {
00354
if
(!
group__DBusList.html#ga2
_dbus_list_append
(&watch_list->
structDBusWatchList.html#o0
watches
, watch))
00355
return
group__DBusMacros.html#ga3
FALSE
;
00356
00357
group__DBusWatchInternals.html#ga1
_dbus_watch_ref
(watch);
00358
00359
if
(watch_list->
structDBusWatchList.html#o1
add_watch_function
!=
group__DBusMacros.html#ga4
NULL
)
00360     {
00361       _dbus_verbose (
"Adding watch on fd %d\n"
,
00362
group__DBusWatch.html#ga0
dbus_watch_get_fd
(watch));
00363
00364
if
(!(* watch_list->
structDBusWatchList.html#o1
add_watch_function
) (watch,
00365                                                watch_list->
structDBusWatchList.html#o4
watch_data
))
00366         {
00367
group__DBusList.html#ga8
_dbus_list_remove_last
(&watch_list->
structDBusWatchList.html#o0
watches
, watch);
00368
group__DBusWatchInternals.html#ga2
_dbus_watch_unref
(watch);
00369
return
group__DBusMacros.html#ga3
FALSE
;
00370         }
00371     }
00372
00373
return
group__DBusMacros.html#ga2
TRUE
;
00374 }
00375
00383
void
group__DBusWatchInternals.html#ga9
00384
group__DBusWatchInternals.html#ga9
_dbus_watch_list_remove_watch
(
structDBusWatchList.html
DBusWatchList
*watch_list,
00385
structDBusWatch.html
DBusWatch
*watch)
00386 {
00387
if
(!
group__DBusList.html#ga7
_dbus_list_remove
(&watch_list->
structDBusWatchList.html#o0
watches
, watch))
00388
group__DBusInternalsUtils.html#ga131
_dbus_assert_not_reached
(
"Nonexistent watch was removed"
);
00389
00390
if
(watch_list->
structDBusWatchList.html#o2
remove_watch_function
!=
group__DBusMacros.html#ga4
NULL
)
00391     {
00392       _dbus_verbose (
"Removing watch on fd %d\n"
,
00393
group__DBusWatch.html#ga0
dbus_watch_get_fd
(watch));
00394
00395       (* watch_list->
structDBusWatchList.html#o2
remove_watch_function
) (watch,
00396                                              watch_list->
structDBusWatchList.html#o4
watch_data
);
00397     }
00398
00399
group__DBusWatchInternals.html#ga2
_dbus_watch_unref
(watch);
00400 }
00401
00410
void
group__DBusWatchInternals.html#ga10
00411
group__DBusWatchInternals.html#ga10
_dbus_watch_list_toggle_watch
(
structDBusWatchList.html
DBusWatchList
*watch_list,
00412
structDBusWatch.html
DBusWatch
*watch,
00413
group__DBusTypes.html#ga2
dbus_bool_t
enabled)
00414 {
00415   enabled = !!enabled;
00416
00417
if
(enabled == watch->
structDBusWatch.html#o8
enabled
)
00418
return
;
00419
00420   watch->
structDBusWatch.html#o8
enabled
= enabled;
00421
00422
if
(watch_list->
structDBusWatchList.html#o3
watch_toggled_function
!=
group__DBusMacros.html#ga4
NULL
)
00423     {
00424       _dbus_verbose (
"Toggling watch %p on fd %d to %d\n"
,
00425                      watch,
group__DBusWatch.html#ga0
dbus_watch_get_fd
(watch), watch->enabled);
00426
00427       (* watch_list->
structDBusWatchList.html#o3
watch_toggled_function
) (watch,
00428                                               watch_list->
structDBusWatchList.html#o4
watch_data
);
00429     }
00430 }
00431
00444
void
group__DBusWatchInternals.html#ga11
00445
group__DBusWatchInternals.html#ga11
_dbus_watch_set_handler
(
structDBusWatch.html
DBusWatch
*watch,
00446                          DBusWatchHandler  handler,
00447
void
*data,
00448
group__DBusMemory.html#ga8
DBusFreeFunction
free_data_function)
00449 {
00450
if
(watch->
structDBusWatch.html#o5
free_handler_data_function
)
00451     (* watch->
structDBusWatch.html#o5
free_handler_data_function
) (watch->
structDBusWatch.html#o4
handler_data
);
00452
00453   watch->
structDBusWatch.html#o3
handler
= handler;
00454   watch->
structDBusWatch.html#o4
handler_data
= data;
00455   watch->
structDBusWatch.html#o5
free_handler_data_function
= free_data_function;
00456 }
00457
00486
int
group__DBusWatch.html#ga0
00487
group__DBusWatch.html#ga0
dbus_watch_get_fd
(
structDBusWatch.html
DBusWatch
*watch)
00488 {
00489
return
watch->
structDBusWatch.html#o1
fd
;
00490 }
00491
00505
unsigned
int
group__DBusWatch.html#ga1
00506
group__DBusWatch.html#ga1
dbus_watch_get_flags
(
structDBusWatch.html
DBusWatch
*watch)
00507 {
00508
group__DBusInternalsUtils.html#ga130
_dbus_assert
((watch->
structDBusWatch.html#o2
flags
& VALID_WATCH_FLAGS) == watch->
structDBusWatch.html#o2
flags
);
00509
00510
return
watch->
structDBusWatch.html#o2
flags
;
00511 }
00512
00520
void
*
group__DBusWatch.html#ga2
00521
group__DBusWatch.html#ga2
dbus_watch_get_data
(
structDBusWatch.html
DBusWatch
*watch)
00522 {
00523
return
watch->
structDBusWatch.html#o6
data
;
00524 }
00525
00537
void
group__DBusWatch.html#ga3
00538
group__DBusWatch.html#ga3
dbus_watch_set_data
(
structDBusWatch.html
DBusWatch
*watch,
00539
void
*data,
00540
group__DBusMemory.html#ga8
DBusFreeFunction
free_data_function)
00541 {
00542   _dbus_verbose (
"Setting watch fd %d data to data = %p function = %p from data = %p function = %p\n"
,
00543
group__DBusWatch.html#ga0
dbus_watch_get_fd
(watch),
00544                  data, free_data_function, watch->data, watch->free_data_function);
00545
00546
if
(watch->free_data_function !=
group__DBusMacros.html#ga4
NULL
)
00547     (* watch->free_data_function) (watch->data);
00548
00549   watch->data = data;
00550   watch->free_data_function = free_data_function;
00551 }
00552
00560
group__DBusTypes.html#ga2
dbus_bool_t
group__DBusWatch.html#ga4
00561
group__DBusWatch.html#ga4
dbus_watch_get_enabled
(
structDBusWatch.html
DBusWatch
*watch)
00562 {
00563
group__DBusInternalsUtils.html#ga130
_dbus_assert
(watch !=
group__DBusMacros.html#ga4
NULL
);
00564
return
watch->
structDBusWatch.html#o8
enabled
;
00565 }
00566
00567
00590
group__DBusTypes.html#ga2
dbus_bool_t
group__DBusWatch.html#ga5
00591
group__DBusWatch.html#ga5
dbus_watch_handle
(
structDBusWatch.html
DBusWatch
*watch,
00592
unsigned
int
flags)
00593 {
00594
#ifndef DBUS_DISABLE_CHECKS
00595
if
(watch->
structDBusWatch.html#o1
fd
< 0 || watch->
structDBusWatch.html#o2
flags
== 0)
00596     {
00597
group__DBusInternalsUtils.html#ga7
_dbus_warn
(
"%s: Watch is invalid, it should have been removed\n"
,
00598                   _DBUS_FUNCTION_NAME);
00599
return
group__DBusMacros.html#ga2
TRUE
;
00600     }
00601
#endif
00602
00603   _dbus_return_val_if_fail (watch->
structDBusWatch.html#o1
fd
>= 0
/* fails if watch was removed */
,
group__DBusMacros.html#ga2
TRUE
);
00604
00605
group__DBusWatchInternals.html#ga4
_dbus_watch_sanitize_condition
(watch, &flags);
00606
00607
if
(flags == 0)
00608     {
00609       _dbus_verbose (
"After sanitization, watch flags on fd %d were 0\n"
,
00610                      watch->
structDBusWatch.html#o1
fd
);
00611
return
group__DBusMacros.html#ga2
TRUE
;
00612     }
00613
else
00614
return
(* watch->
structDBusWatch.html#o3
handler
) (watch, flags,
00615                                watch->
structDBusWatch.html#o4
handler_data
);
00616 }
00617
00618
Generated on Tue Sep 13 01:28:08 2005 for D-BUS by
http://www.doxygen.org/index.html
doxygen
1.4.4
