diff options
Diffstat (limited to 'glib/dbus-gproxy.c')
-rw-r--r-- | glib/dbus-gproxy.c | 171 |
1 files changed, 88 insertions, 83 deletions
diff --git a/glib/dbus-gproxy.c b/glib/dbus-gproxy.c index 24ce6bf3..624a95ca 100644 --- a/glib/dbus-gproxy.c +++ b/glib/dbus-gproxy.c @@ -45,7 +45,7 @@ struct DBusGProxy GObject parent; /**< Parent instance */ DBusGProxyManager *manager; /**< Proxy manager */ - char *service; /**< Service messages go to or NULL */ + char *name; /**< Name messages go to or NULL */ char *path; /**< Path messages go to or NULL */ char *interface; /**< Interface messages go to or NULL */ }; @@ -68,14 +68,14 @@ static void dbus_g_proxy_emit_received (DBusGProxy *proxy, /** - * A list of proxies with a given service+path+interface, used to + * A list of proxies with a given name+path+interface, used to * route incoming signals. */ typedef struct { GSList *proxies; /**< The list of proxies */ - char name[4]; /**< service (empty string for none), nul byte, + char name[4]; /**< name (empty string for none), nul byte, * path, nul byte, * interface, nul byte */ @@ -85,7 +85,7 @@ typedef struct /** * DBusGProxyManager's primary task is to route signals to the proxies * those signals are emitted on. In order to do this it also has to - * track the owners of the services proxies are bound to. + * track the owners of the names proxies are bound to. */ struct DBusGProxyManager { @@ -100,9 +100,10 @@ struct DBusGProxyManager }; static DBusGProxyManager *dbus_g_proxy_manager_ref (DBusGProxyManager *manager); -static DBusHandlerResult dbus_g_proxy_manager_filter (DBusConnection *connection, - DBusMessage *message, - void *user_data); +static DBusHandlerResult dbus_g_proxy_manager_filter (DBusConnection *connection, + DBusMessage *message, + void *user_data); + /** Lock the DBusGProxyManager */ #define LOCK_MANAGER(mgr) (g_static_mutex_lock (&(mgr)->lock)) @@ -293,48 +294,48 @@ tristring_equal (gconstpointer a, static char* tristring_alloc_from_strings (size_t padding_before, - const char *service, + const char *name, const char *path, const char *interface) { - size_t service_len, iface_len, path_len, len; + size_t name_len, iface_len, path_len, len; char *tri; - if (service) - service_len = strlen (service); + if (name) + name_len = strlen (name); else - service_len = 0; + name_len = 0; path_len = strlen (path); iface_len = strlen (interface); - tri = g_malloc (padding_before + service_len + path_len + iface_len + 3); + tri = g_malloc (padding_before + name_len + path_len + iface_len + 3); len = padding_before; - if (service) - memcpy (&tri[len], service, service_len); + if (name) + memcpy (&tri[len], name, name_len); - len += service_len; + len += name_len; tri[len] = '\0'; len += 1; - g_assert (len == (padding_before + service_len + 1)); + g_assert (len == (padding_before + name_len + 1)); memcpy (&tri[len], path, path_len); len += path_len; tri[len] = '\0'; len += 1; - g_assert (len == (padding_before + service_len + path_len + 2)); + g_assert (len == (padding_before + name_len + path_len + 2)); memcpy (&tri[len], interface, iface_len); len += iface_len; tri[len] = '\0'; len += 1; - g_assert (len == (padding_before + service_len + path_len + iface_len + 3)); + g_assert (len == (padding_before + name_len + path_len + iface_len + 3)); return tri; } @@ -343,7 +344,7 @@ static char* tristring_from_proxy (DBusGProxy *proxy) { return tristring_alloc_from_strings (0, - proxy->service, + proxy->name, proxy->path, proxy->interface); } @@ -363,7 +364,7 @@ g_proxy_list_new (DBusGProxy *first_proxy) DBusGProxyList *list; list = (void*) tristring_alloc_from_strings (G_STRUCT_OFFSET (DBusGProxyList, name), - first_proxy->service, + first_proxy->name, first_proxy->path, first_proxy->interface); list->proxies = NULL; @@ -387,9 +388,9 @@ g_proxy_get_match_rule (DBusGProxy *proxy) { /* FIXME Escaping is required here */ - if (proxy->service) + if (proxy->name) return g_strdup_printf ("type='signal',sender='%s',path='%s',interface='%s'", - proxy->service, proxy->path, proxy->interface); + proxy->name, proxy->path, proxy->interface); else return g_strdup_printf ("type='signal',path='%s',interface='%s'", proxy->path, proxy->interface); @@ -397,7 +398,7 @@ g_proxy_get_match_rule (DBusGProxy *proxy) static void dbus_g_proxy_manager_register (DBusGProxyManager *manager, - DBusGProxy *proxy) + DBusGProxy *proxy) { DBusGProxyList *list; @@ -738,7 +739,7 @@ dbus_g_proxy_finalize (GObject *object) dbus_g_proxy_manager_unref (proxy->manager); } - g_free (proxy->service); + g_free (proxy->name); g_free (proxy->path); g_free (proxy->interface); @@ -842,9 +843,9 @@ dbus_g_proxy_get_type (void) static DBusGProxy* dbus_g_proxy_new (DBusGConnection *connection, - const char *service_name, - const char *path_name, - const char *interface_name) + const char *name, + const char *path_name, + const char *interface_name) { DBusGProxy *proxy; @@ -858,7 +859,7 @@ dbus_g_proxy_new (DBusGConnection *connection, proxy->manager = dbus_g_proxy_manager_get (DBUS_CONNECTION_FROM_G_CONNECTION (connection)); - proxy->service = g_strdup (service_name); + proxy->name = g_strdup (name); proxy->path = g_strdup (path_name); proxy->interface = g_strdup (interface_name); @@ -868,101 +869,105 @@ dbus_g_proxy_new (DBusGConnection *connection, } /** - * Creates a new proxy for a remote interface exported by a service on - * a message bus. Method calls and signal connections over this proxy - * will go to the service owner; the service owner is expected to - * support the given interface name. THE SERVICE OWNER MAY CHANGE OVER - * TIME, for example between two different method calls. If you need a - * fixed owner, you need to request the current owner and bind a proxy - * to that rather than to the generic service name; see - * dbus_g_proxy_new_for_service_owner(). + * Creates a new proxy for a remote interface exported by a connection + * on a message bus. Method calls and signal connections over this + * proxy will go to the name owner; the name's owner is expected to + * support the given interface name. THE NAME OWNER MAY CHANGE OVER + * TIME, for example between two different method calls, unless the + * name is a unique name. If you need a fixed owner, you need to + * request the current owner and bind a proxy to its unique name + * rather than to the generic name; see + * dbus_g_proxy_new_for_name_owner(). * - * A service-associated proxy only makes sense with a message bus, - * not for app-to-app direct dbus connections. + * A name-associated proxy only makes sense with a message bus, not + * for app-to-app direct dbus connections. * - * This proxy will only emit the "destroy" signal if the #DBusConnection - * is disconnected or the proxy is has no remaining references. + * This proxy will only emit the "destroy" signal if the + * #DBusConnection is disconnected, the proxy has no remaining + * references, or the name is a unique name and its owner + * disappears. If a well-known name changes owner, the proxy will + * still be alive. * * @param connection the connection to the remote bus - * @param service_name name of the service on the message bus - * @param path_name name of the object inside the service to call methods on + * @param name any name on the message bus + * @param path_name name of the object instance to call methods on * @param interface_name name of the interface to call methods on * @returns new proxy object */ DBusGProxy* -dbus_g_proxy_new_for_service (DBusGConnection *connection, - const char *service_name, - const char *path_name, - const char *interface_name) +dbus_g_proxy_new_for_name (DBusGConnection *connection, + const char *name, + const char *path_name, + const char *interface_name) { DBusGProxy *proxy; g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (service_name != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (path_name != NULL, NULL); g_return_val_if_fail (interface_name != NULL, NULL); - proxy = dbus_g_proxy_new (connection, service_name, + proxy = dbus_g_proxy_new (connection, name, path_name, interface_name); return proxy; } /** - * Similar to dbus_g_proxy_new_for_service(), but makes a round-trip - * request to the message bus to get the current service owner, then - * binds the proxy specifically to the current owner. As a result, the - * service owner will not change over time, and the proxy will emit - * the "destroy" signal when the owner disappears from the message - * bus. + * Similar to dbus_g_proxy_new_for_name(), but makes a round-trip + * request to the message bus to get the current name owner, then + * binds the proxy to the unique name of the current owner, rather + * than to the well-known name. As a result, the name owner will + * not change over time, and the proxy will emit the "destroy" signal + * when the owner disappears from the message bus. * - * An example of the difference between dbus_g_proxy_new_for_service() - * and dbus_g_proxy_new_for_service_owner(): if you pass the service name - * "org.freedesktop.Database" dbus_g_proxy_new_for_service() remains bound - * to that name as it changes owner. dbus_g_proxy_new_for_service_owner() - * will fail if the service has no owner. If the service has an owner, - * dbus_g_proxy_new_for_service_owner() will bind to the unique name - * of that owner rather than the generic service name. + * An example of the difference between dbus_g_proxy_new_for_name() + * and dbus_g_proxy_new_for_name_owner(): if you provide the well-known name + * "org.freedesktop.Database" dbus_g_proxy_new_for_name() remains bound + * to that name as it changes owner. dbus_g_proxy_new_for_name_owner() + * will fail if the name has no owner. If the name has an owner, + * dbus_g_proxy_new_for_name_owner() will bind to the unique name + * of that owner rather than the generic name. * * @param connection the connection to the remote bus - * @param service_name name of the service on the message bus + * @param name any name on the message bus * @param path_name name of the object inside the service to call methods on * @param interface_name name of the interface to call methods on * @param error return location for an error * @returns new proxy object, or #NULL on error */ DBusGProxy* -dbus_g_proxy_new_for_service_owner (DBusGConnection *connection, - const char *service_name, - const char *path_name, - const char *interface_name, - GError **error) +dbus_g_proxy_new_for_name_owner (DBusGConnection *connection, + const char *name, + const char *path_name, + const char *interface_name, + GError **error) { DBusGProxy *proxy; DBusMessage *request, *reply; DBusError derror; - const char *base_service_name; + const char *unique_name; g_return_val_if_fail (connection != NULL, NULL); - g_return_val_if_fail (service_name != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (path_name != NULL, NULL); g_return_val_if_fail (interface_name != NULL, NULL); dbus_error_init (&derror); proxy = NULL; - base_service_name = NULL; + unique_name = NULL; reply = NULL; request = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, DBUS_PATH_ORG_FREEDESKTOP_DBUS, DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, - "GetServiceOwner"); + "GetNameOwner"); if (request == NULL) g_error ("Out of memory"); if (! dbus_message_append_args (request, - DBUS_TYPE_STRING, &service_name, + DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) g_error ("Out of memory"); @@ -977,13 +982,13 @@ dbus_g_proxy_new_for_service_owner (DBusGConnection *connection, goto error; if (! dbus_message_get_args (reply, &derror, - DBUS_TYPE_STRING, &base_service_name, + DBUS_TYPE_STRING, &unique_name, DBUS_TYPE_INVALID)) goto error; - proxy = dbus_g_proxy_new (connection, base_service_name, - path_name, interface_name); + proxy = dbus_g_proxy_new (connection, unique_name, + path_name, interface_name); goto out; @@ -1017,8 +1022,8 @@ dbus_g_proxy_new_for_service_owner (DBusGConnection *connection, */ DBusGProxy* dbus_g_proxy_new_for_peer (DBusGConnection *connection, - const char *path_name, - const char *interface_name) + const char *path_name, + const char *interface_name) { DBusGProxy *proxy; @@ -1063,7 +1068,7 @@ dbus_g_proxy_begin_call (DBusGProxy *proxy, g_return_val_if_fail (DBUS_IS_G_PROXY (proxy), NULL); - message = dbus_message_new_method_call (proxy->service, + message = dbus_message_new_method_call (proxy->name, proxy->path, proxy->interface, method); @@ -1191,7 +1196,7 @@ dbus_g_proxy_call_no_reply (DBusGProxy *proxy, g_return_if_fail (DBUS_IS_G_PROXY (proxy)); - message = dbus_message_new_method_call (proxy->service, + message = dbus_message_new_method_call (proxy->name, proxy->path, proxy->interface, method); @@ -1224,7 +1229,7 @@ dbus_g_proxy_call_no_reply (DBusGProxy *proxy, * dbus_connection_flush(). * * The message is modified to be addressed to the target interface. - * That is, a destination service field or whatever is needed will be + * That is, a destination name field or whatever is needed will be * added to the message. The basic point of this function is to add * the necessary header fields, otherwise it's equivalent to * dbus_connection_send(). @@ -1242,9 +1247,9 @@ dbus_g_proxy_send (DBusGProxy *proxy, { g_return_if_fail (DBUS_IS_G_PROXY (proxy)); - if (proxy->service) + if (proxy->name) { - if (!dbus_message_set_destination (message, proxy->service)) + if (!dbus_message_set_destination (message, proxy->name)) g_error ("Out of memory"); } if (proxy->path) |