diff options
| -rw-r--r-- | ChangeLog | 9 | ||||
| -rw-r--r-- | dbus/dbus-bus.c | 95 | ||||
| -rw-r--r-- | dbus/dbus-bus.h | 32 | ||||
| -rw-r--r-- | dbus/dbus-memory.c | 2 | 
4 files changed, 125 insertions, 13 deletions
@@ -1,3 +1,12 @@ +2003-03-28  Anders Carlsson  <andersca@codefactory.se> + +	* dbus/dbus-bus.c: (bus_data_free), (dbus_bus_get): +	* dbus/dbus-bus.h: +	Add dbus_bus_get. +	 +	* dbus/dbus-memory.c: +	Fix a doc comment. +	  2003-03-28  Havoc Pennington  <hp@pobox.com>  	* bus/test.c (bus_test_flush_bus): remove the sleep from here,  diff --git a/dbus/dbus-bus.c b/dbus/dbus-bus.c index 1b63d608..c3978db2 100644 --- a/dbus/dbus-bus.c +++ b/dbus/dbus-bus.c @@ -51,6 +51,7 @@ typedef struct  {    char *base_service; /**< Base service name of this connection */ +  DBusConnection **connection; /**< Pointer to bus_connections entry */  } BusData;  /** The slot we have reserved to store BusData @@ -65,6 +66,7 @@ static int bus_data_slot_refcount = 0;   */  _DBUS_DEFINE_GLOBAL_LOCK (bus); +  static dbus_bool_t  data_slot_ref (void)  { @@ -114,6 +116,9 @@ bus_data_free (void *data)  {    BusData *bd = data; +  if (bd->connection) +    *bd->connection = NULL; +      dbus_free (bd->base_service);    dbus_free (bd); @@ -163,6 +168,96 @@ ensure_bus_data (DBusConnection *connection)   * @{   */ +/** Number of bus types */ +#define BUS_TYPES 2 + +static DBusConnection *bus_connections[BUS_TYPES]; + +/** + * Connects to a bus daemon and registers the client with it. + * If a connection to the bus already exists, then that connection is returned. + * + * @todo alex thinks we should nullify the connection when we get a disconnect-message. + * + * @param type bus type + * @param error address where an error can be returned. + * @returns a DBusConnection + */ +DBusConnection * +dbus_bus_get (DBusBusType  type, +	      DBusError   *error) +{ +  const char *name, *value; +  DBusConnection *connection; +  BusData *bd; + +  if (type <= 0 || type >= BUS_TYPES) +    { +      _dbus_assert_not_reached ("Invalid bus type specified."); + +      return NULL; +    } + +  _DBUS_LOCK (bus); +   +  if (bus_connections[type] != NULL) +    { +      connection = bus_connections[type]; +      dbus_connection_ref (connection); +       +      _DBUS_UNLOCK (bus); +      return connection; +    } + +  switch (type) +    { +    case DBUS_BUS_SESSION: +      name = "DBUS_SESSION_BUS_ADDRESS"; +      break; +    case DBUS_BUS_SYSTEM: +      name = "DBUS_SYSTEM_BUS_ADDRESS"; +      break; +    } + +  value = _dbus_getenv (name); + +  if (!value) +    { +      dbus_set_error (error, DBUS_ERROR_FAILED, +		      "Could not get bus daemon address."); +      _DBUS_UNLOCK (bus); +       +      return NULL; +    } + +  connection = dbus_connection_open (value, error); +   +  if (!connection) +    { +      _DBUS_UNLOCK (bus); +      return NULL; +    } +   +  if (!dbus_bus_register (connection, error)) +    { +      dbus_connection_disconnect (connection); +      dbus_connection_unref (connection); + +      _DBUS_UNLOCK (bus); +      return NULL; +    } + +  bus_connections[type] = connection; +  bd = ensure_bus_data (connection); +  _dbus_assert (bd != NULL); + +  bd->connection = &bus_connections[type]; + +  _DBUS_UNLOCK (bus);   +  return connection; +} + +  /**   * Registers a connection with the bus. This must be the first   * thing an application does when connecting to the message bus. diff --git a/dbus/dbus-bus.h b/dbus/dbus-bus.h index 9f25eeb6..508dc5b1 100644 --- a/dbus/dbus-bus.h +++ b/dbus/dbus-bus.h @@ -31,18 +31,26 @@  DBUS_BEGIN_DECLS; -dbus_bool_t dbus_bus_register         (DBusConnection *connection, -                                       DBusError      *error); -dbus_bool_t dbus_bus_set_base_service (DBusConnection *connection, -                                       const char     *base_service); -const char* dbus_bus_get_base_service (DBusConnection *connection); -int         dbus_bus_acquire_service  (DBusConnection *connection, -                                       const char     *service_name, -                                       unsigned int    flags, -                                       DBusError      *error); -dbus_bool_t dbus_bus_service_exists   (DBusConnection *connection, -                                       const char     *service_name, -                                       DBusError      *error); +typedef enum +{ +  DBUS_BUS_SESSION, /**< The login session bus */ +  DBUS_BUS_SYSTEM /**< The system bus */ +} DBusBusType; + +DBusConnection *dbus_bus_get              (DBusBusType     type, +					   DBusError      *error); +dbus_bool_t     dbus_bus_register         (DBusConnection *connection, +					   DBusError      *error); +dbus_bool_t     dbus_bus_set_base_service (DBusConnection *connection, +					   const char     *base_service); +const char*     dbus_bus_get_base_service (DBusConnection *connection); +int             dbus_bus_acquire_service  (DBusConnection *connection, +					   const char     *service_name, +					   unsigned int    flags, +					   DBusError      *error); +dbus_bool_t     dbus_bus_service_exists   (DBusConnection *connection, +					   const char     *service_name, +					   DBusError      *error);  DBUS_END_DECLS; diff --git a/dbus/dbus-memory.c b/dbus/dbus-memory.c index 11d52045..fbda7139 100644 --- a/dbus/dbus-memory.c +++ b/dbus/dbus-memory.c @@ -190,7 +190,7 @@ _dbus_get_fail_alloc_counter (void)   * Sets how many mallocs to fail when the fail alloc counter reaches   * 0.   * - * @param number to fail + * @param failures_per_failure number to fail   */  void  _dbus_set_fail_alloc_failures (int failures_per_failure)  | 
