00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef DBUS_SERVER_PROTECTED_H
00024 #define DBUS_SERVER_PROTECTED_H
00025
00026 #include <config.h>
00027 #include <dbus/dbus-internals.h>
00028 #include <dbus/dbus-threads-internal.h>
00029 #include <dbus/dbus-server.h>
00030 #include <dbus/dbus-address.h>
00031 #include <dbus/dbus-timeout.h>
00032 #include <dbus/dbus-watch.h>
00033 #include <dbus/dbus-resources.h>
00034 #include <dbus/dbus-dataslot.h>
00035 #include <dbus/dbus-string.h>
00036
00037 DBUS_BEGIN_DECLS
00038
00039 typedef struct DBusServerVTable DBusServerVTable;
00040
00044 struct DBusServerVTable
00045 {
00046 void (* finalize) (DBusServer *server);
00049 void (* disconnect) (DBusServer *server);
00051 };
00052
00056 struct DBusServer
00057 {
00058 DBusAtomic refcount;
00059 const DBusServerVTable *vtable;
00060 DBusMutex *mutex;
00062 DBusGUID guid;
00064 DBusString guid_hex;
00066 DBusWatchList *watches;
00067 DBusTimeoutList *timeouts;
00069 char *address;
00071 int max_connections;
00073 DBusDataSlotList slot_list;
00075 DBusNewConnectionFunction new_connection_function;
00077 void *new_connection_data;
00079 DBusFreeFunction new_connection_free_data_function;
00084 char **auth_mechanisms;
00086 unsigned int disconnected : 1;
00088 #ifndef DBUS_DISABLE_CHECKS
00089 unsigned int have_server_lock : 1;
00090 #endif
00091 };
00092
00093 dbus_bool_t _dbus_server_init_base (DBusServer *server,
00094 const DBusServerVTable *vtable,
00095 const DBusString *address);
00096 void _dbus_server_finalize_base (DBusServer *server);
00097 dbus_bool_t _dbus_server_add_watch (DBusServer *server,
00098 DBusWatch *watch);
00099 void _dbus_server_remove_watch (DBusServer *server,
00100 DBusWatch *watch);
00101 void _dbus_server_toggle_watch (DBusServer *server,
00102 DBusWatch *watch,
00103 dbus_bool_t enabled);
00104 dbus_bool_t _dbus_server_add_timeout (DBusServer *server,
00105 DBusTimeout *timeout);
00106 void _dbus_server_remove_timeout (DBusServer *server,
00107 DBusTimeout *timeout);
00108 void _dbus_server_toggle_timeout (DBusServer *server,
00109 DBusTimeout *timeout,
00110 dbus_bool_t enabled);
00111
00112 void _dbus_server_ref_unlocked (DBusServer *server);
00113 void _dbus_server_unref_unlocked (DBusServer *server);
00114
00115 typedef enum
00116 {
00117 DBUS_SERVER_LISTEN_NOT_HANDLED,
00118 DBUS_SERVER_LISTEN_OK,
00119 DBUS_SERVER_LISTEN_BAD_ADDRESS,
00120 DBUS_SERVER_LISTEN_DID_NOT_CONNECT
00121 } DBusServerListenResult;
00122
00123 DBusServerListenResult _dbus_server_listen_platform_specific (DBusAddressEntry *entry,
00124 DBusServer **server_p,
00125 DBusError *error);
00126
00127 #ifdef DBUS_DISABLE_CHECKS
00128 #define TOOK_LOCK_CHECK(server)
00129 #define RELEASING_LOCK_CHECK(server)
00130 #define HAVE_LOCK_CHECK(server)
00131 #else
00132 #define TOOK_LOCK_CHECK(server) do { \
00133 _dbus_assert (!(server)->have_server_lock); \
00134 (server)->have_server_lock = TRUE; \
00135 } while (0)
00136 #define RELEASING_LOCK_CHECK(server) do { \
00137 _dbus_assert ((server)->have_server_lock); \
00138 (server)->have_server_lock = FALSE; \
00139 } while (0)
00140 #define HAVE_LOCK_CHECK(server) _dbus_assert ((server)->have_server_lock)
00141
00142 #endif
00143
00144 #define TRACE_LOCKS 0
00145
00146 #define SERVER_LOCK(server) do { \
00147 if (TRACE_LOCKS) { _dbus_verbose (" LOCK: %s\n", _DBUS_FUNCTION_NAME); } \
00148 _dbus_mutex_lock ((server)->mutex); \
00149 TOOK_LOCK_CHECK (server); \
00150 } while (0)
00151
00152 #define SERVER_UNLOCK(server) do { \
00153 if (TRACE_LOCKS) { _dbus_verbose (" UNLOCK: %s\n", _DBUS_FUNCTION_NAME); } \
00154 RELEASING_LOCK_CHECK (server); \
00155 _dbus_mutex_unlock ((server)->mutex); \
00156 } while (0)
00157
00158 DBUS_END_DECLS
00159
00160 #endif