diff options
| -rw-r--r-- | ChangeLog | 10 | ||||
| -rw-r--r-- | glib/dbus-glib.h | 14 | ||||
| -rw-r--r-- | glib/dbus-gmain.c | 99 | ||||
| -rw-r--r-- | glib/dbus-gproxy.c | 8 | 
4 files changed, 107 insertions, 24 deletions
| @@ -1,3 +1,13 @@ +2003-10-02  Havoc Pennington  <hp@pobox.com> + +	* glib/dbus-gproxy.c (dbus_gproxy_call_no_reply): rename from +	dbus_gproxy_oneway_call + +	* glib/dbus-gmain.c (dbus_connection_setup_with_g_main)  +	(dbus_server_setup_with_g_main): fix to allow calling them more +	than once on the same args +	(dbus_bus_get_with_g_main): new function +  2003-10-02  Havoc Pennington  <hp@redhat.com>  	* doc/dbus-tutorial.xml: write some stuff diff --git a/glib/dbus-glib.h b/glib/dbus-glib.h index 46f4555d..10539545 100644 --- a/glib/dbus-glib.h +++ b/glib/dbus-glib.h @@ -51,11 +51,13 @@ typedef enum  void dbus_set_g_error (GError   **gerror,                         DBusError *derror); -void dbus_g_thread_init                (void); -void dbus_connection_setup_with_g_main (DBusConnection *connection, -					GMainContext   *context); -void dbus_server_setup_with_g_main     (DBusServer     *server, -					GMainContext   *context); +void            dbus_g_thread_init                (void); +void            dbus_connection_setup_with_g_main (DBusConnection  *connection, +                                                   GMainContext    *context); +void            dbus_server_setup_with_g_main     (DBusServer      *server, +                                                   GMainContext    *context); +DBusConnection* dbus_bus_get_with_g_main          (DBusBusType      type, +                                                   GError         **error);  typedef struct DBusGObjectInfo DBusGObjectInfo;  typedef struct DBusGMethodInfo DBusGMethodInfo; @@ -137,7 +139,7 @@ gboolean         dbus_gproxy_end_call              (DBusGProxy               *pr                                                      GError                  **error,                                                      int                       first_arg_type,                                                      ...); -void             dbus_gproxy_oneway_call           (DBusGProxy               *proxy, +void             dbus_gproxy_call_no_reply         (DBusGProxy               *proxy,                                                      const char               *method,                                                      int                       first_arg_type,                                                      ...); diff --git a/glib/dbus-gmain.c b/glib/dbus-gmain.c index 68ba22d7..7c845d5b 100644 --- a/glib/dbus-gmain.c +++ b/glib/dbus-gmain.c @@ -443,6 +443,11 @@ create_source (void         *connection_or_server,   * Pass in #NULL for the #GMainContext unless you're   * doing something specialized.   * + * If called twice for the same context, does nothing the second + * time. If called once with context A and once with context B, + * context B replaces context A as the context monitoring the + * connection. + *   * @param connection the connection   * @param context the #GMainContext or #NULL for default context   */ @@ -451,7 +456,29 @@ dbus_connection_setup_with_g_main (DBusConnection *connection,  				   GMainContext   *context)  {    GSource *source; +   +  /* FIXME we never free the slot, so its refcount just keeps growing, +   * which is kind of broken. +   */ +  dbus_connection_allocate_data_slot (&connection_slot); +  if (connection_slot < 0) +    goto nomem; + +  /* So we can test for equality below */ +  if (context == NULL) +    context = g_main_context_default (); +   +  source = dbus_connection_get_data (connection, connection_slot); +  if (source != NULL) +    { +      if (source->context == context) +        return; /* nothing to do */ +      /* Remove the previous source and move to a new context */ +      dbus_connection_set_data (connection, connection_slot, NULL, NULL); +      source = NULL; +    } +      source = create_source (connection, &dbus_connection_funcs, context);    if (!dbus_connection_set_watch_functions (connection, @@ -474,13 +501,6 @@ dbus_connection_setup_with_g_main (DBusConnection *connection,    g_source_attach (source, context); -  /* FIXME we never free the slot, so its refcount just keeps growing, -   * which is kind of broken. -   */ -  dbus_connection_allocate_data_slot (&connection_slot); -  if (connection_slot < 0) -    goto nomem; -    if (!dbus_connection_set_data (connection, connection_slot, source,                                   (DBusFreeFunction)free_source))      goto nomem; @@ -496,6 +516,11 @@ dbus_connection_setup_with_g_main (DBusConnection *connection,   * to integrate the server with the GLib main loop.   * In most cases the context argument should be #NULL.   * + * If called twice for the same context, does nothing the second + * time. If called once with context A and once with context B, + * context B replaces context A as the context monitoring the + * connection. + *   * @param server the server   * @param context the #GMainContext or #NULL for default   */ @@ -505,6 +530,25 @@ dbus_server_setup_with_g_main (DBusServer   *server,  {    GSource *source; +  dbus_server_allocate_data_slot (&server_slot); +  if (server_slot < 0) +    goto nomem; + +  /* So we can test for equality below */ +  if (context == NULL) +    context = g_main_context_default (); +   +  source = dbus_server_get_data (server, server_slot); +  if (source != NULL) +    { +      if (source->context == context) +        return; /* nothing to do */ + +      /* Remove the previous source and move to a new context */ +      dbus_server_set_data (server, server_slot, NULL, NULL); +      source = NULL; +    } +      source = create_source (server, &dbus_server_funcs, context);    dbus_server_set_watch_functions (server, @@ -521,13 +565,6 @@ dbus_server_setup_with_g_main (DBusServer   *server,    g_source_attach (source, context); -  /* FIXME we never free the slot, so its refcount just keeps growing, -   * which is kind of broken. -   */ -  dbus_server_allocate_data_slot (&server_slot); -  if (server_slot < 0) -    goto nomem; -    if (!dbus_server_set_data (server, server_slot, source,                               (DBusFreeFunction)free_source))      goto nomem; @@ -539,6 +576,40 @@ dbus_server_setup_with_g_main (DBusServer   *server,  }  /** + * Calls dbus_bus_get() then calls dbus_connection_setup_with_g_main() + * on the result and returns the bus connection. + * + * @param type bus type + * @param error address where an error can be returned. + * @returns a DBusConnection + */ +DBusConnection* +dbus_bus_get_with_g_main (DBusBusType     type, +                          GError        **error) +{ +  DBusConnection *connection; +  DBusError derror; + +  g_return_val_if_fail (error == NULL || *error == NULL, NULL); +   +  dbus_error_init (&derror); + +  connection = dbus_bus_get (type, &derror); +  if (connection == NULL) +    { +      dbus_set_g_error (error, &derror); +      dbus_error_free (&derror); +    } +  else +    { +      /* does nothing if it's already been done */ +      dbus_connection_setup_with_g_main (connection, NULL); +    } + +  return connection; +} + +/**   * The implementation of DBUS_GERROR error domain. See documentation   * for GError in GLib reference manual.   * diff --git a/glib/dbus-gproxy.c b/glib/dbus-gproxy.c index 99900e4c..13b4248c 100644 --- a/glib/dbus-gproxy.c +++ b/glib/dbus-gproxy.c @@ -1089,10 +1089,10 @@ dbus_gproxy_end_call (DBusGProxy          *proxy,   * @param first_arg_type type of the first argument   */  void -dbus_gproxy_oneway_call (DBusGProxy               *proxy, -                         const char               *method, -                         int                       first_arg_type, -                         ...) +dbus_gproxy_call_no_reply (DBusGProxy               *proxy, +                           const char               *method, +                           int                       first_arg_type, +                           ...)  {    DBusMessage *message;    va_list args; | 
