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 <dbus/dbus-internals.h>
00027 #include <dbus/dbus-threads-internal.h>
00028 #include <dbus/dbus-server.h>
00029 #include <dbus/dbus-address.h>
00030 #include <dbus/dbus-timeout.h>
00031 #include <dbus/dbus-watch.h>
00032 #include <dbus/dbus-resources.h>
00033 #include <dbus/dbus-dataslot.h>
00034 #include <dbus/dbus-string.h>
00035
00036 DBUS_BEGIN_DECLS
00037
00038 typedef struct DBusServerVTable DBusServerVTable;
00039
00043 struct DBusServerVTable
00044 {
00045 void (* finalize) (DBusServer *server);
00048 void (* disconnect) (DBusServer *server);
00050 };
00051
00055 struct DBusServer
00056 {
00057 DBusAtomic refcount;
00058 const DBusServerVTable *vtable;
00059 DBusMutex *mutex;
00061 DBusGUID guid;
00063 DBusString guid_hex;
00065 DBusWatchList *watches;
00066 DBusTimeoutList *timeouts;
00068 char *address;
00070 int max_connections;
00072 DBusDataSlotList slot_list;
00074 DBusNewConnectionFunction new_connection_function;
00076 void *new_connection_data;
00078 DBusFreeFunction new_connection_free_data_function;
00083 char **auth_mechanisms;
00085 unsigned int disconnected : 1;
00087 #ifndef DBUS_DISABLE_CHECKS
00088 unsigned int have_server_lock : 1;
00089 #endif
00090 };
00091
00092 dbus_bool_t _dbus_server_init_base (DBusServer *server,
00093 const DBusServerVTable *vtable,
00094 const DBusString *address);
00095 void _dbus_server_finalize_base (DBusServer *server);
00096 dbus_bool_t _dbus_server_add_watch (DBusServer *server,
00097 DBusWatch *watch);
00098 void _dbus_server_remove_watch (DBusServer *server,
00099 DBusWatch *watch);
00100 void _dbus_server_toggle_watch (DBusServer *server,
00101 DBusWatch *watch,
00102 dbus_bool_t enabled);
00103 dbus_bool_t _dbus_server_add_timeout (DBusServer *server,
00104 DBusTimeout *timeout);
00105 void _dbus_server_remove_timeout (DBusServer *server,
00106 DBusTimeout *timeout);
00107 void _dbus_server_toggle_timeout (DBusServer *server,
00108 DBusTimeout *timeout,
00109 dbus_bool_t enabled);
00110
00111 void _dbus_server_ref_unlocked (DBusServer *server);
00112 void _dbus_server_unref_unlocked (DBusServer *server);
00113
00114 typedef enum
00115 {
00116 DBUS_SERVER_LISTEN_NOT_HANDLED,
00117 DBUS_SERVER_LISTEN_OK,
00118 DBUS_SERVER_LISTEN_BAD_ADDRESS,
00119 DBUS_SERVER_LISTEN_DID_NOT_CONNECT
00120 } DBusServerListenResult;
00121
00122 DBusServerListenResult _dbus_server_listen_platform_specific (DBusAddressEntry *entry,
00123 DBusServer **server_p,
00124 DBusError *error);
00125
00126 #ifdef DBUS_DISABLE_CHECKS
00127 #define TOOK_LOCK_CHECK(server)
00128 #define RELEASING_LOCK_CHECK(server)
00129 #define HAVE_LOCK_CHECK(server)
00130 #else
00131 #define TOOK_LOCK_CHECK(server) do { \
00132 _dbus_assert (!(server)->have_server_lock); \
00133 (server)->have_server_lock = TRUE; \
00134 } while (0)
00135 #define RELEASING_LOCK_CHECK(server) do { \
00136 _dbus_assert ((server)->have_server_lock); \
00137 (server)->have_server_lock = FALSE; \
00138 } while (0)
00139 #define HAVE_LOCK_CHECK(server) _dbus_assert ((server)->have_server_lock)
00140
00141 #endif
00142
00143 #define TRACE_LOCKS 0
00144
00145 #define SERVER_LOCK(server) do { \
00146 if (TRACE_LOCKS) { _dbus_verbose ("LOCK\n"); } \
00147 _dbus_mutex_lock ((server)->mutex); \
00148 TOOK_LOCK_CHECK (server); \
00149 } while (0)
00150
00151 #define SERVER_UNLOCK(server) do { \
00152 if (TRACE_LOCKS) { _dbus_verbose ("UNLOCK\n"); } \
00153 RELEASING_LOCK_CHECK (server); \
00154 _dbus_mutex_unlock ((server)->mutex); \
00155 } while (0)
00156
00157 DBUS_END_DECLS
00158
00159 #endif