/** * g_dbus_interface_set_object: * @interface_: An exported D-Bus interface. * @object: (allow-none): A #GDBusObject or %NULL. * * Sets the #GDBusObject for @interface_ to @object. * * Note that @interface_ will hold a weak reference to @object. * * Since: 2.30 */ void g_dbus_interface_set_object (GDBusInterface *interface_, GDBusObject *object) { g_return_if_fail (G_IS_DBUS_INTERFACE (interface_)); g_return_if_fail (object == NULL || G_IS_DBUS_OBJECT (object)); G_DBUS_INTERFACE_GET_IFACE (interface_)->set_object (interface_, object); }
static gboolean is_realm_with_kerberos_and_membership (gpointer object) { GDBusInterface *interface; if (!G_IS_DBUS_OBJECT (object)) return FALSE; interface = g_dbus_object_get_interface (object, "org.freedesktop.realmd.Kerberos"); if (interface == NULL) return FALSE; g_object_unref (interface); interface = g_dbus_object_get_interface (object, "org.freedesktop.realmd.KerberosMembership"); if (interface == NULL) return FALSE; g_object_unref (interface); return TRUE; }
/** * g_dbus_object_manager_server_export_uniquely: * @manager: A #GDBusObjectManagerServer. * @object: An object. * * Like g_dbus_object_manager_server_export() but appends a string of * the form <literal>_N</literal> (with N being a natural number) to * @object<!-- -->'s object path if an object with the given path * already exists. As such, the #GDBusObjectProxy:object-path property * of @object may be modified. * * Since: 2.30 */ void g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager, GDBusObjectSkeleton *object) { gchar *orig_object_path; gchar *object_path; guint count; gboolean modified; orig_object_path = g_strdup (g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); g_return_if_fail (G_IS_DBUS_OBJECT (object)); g_return_if_fail (g_str_has_prefix (orig_object_path, manager->priv->object_path_ending_in_slash)); object_path = g_strdup (orig_object_path); count = 1; modified = FALSE; while (TRUE) { RegistrationData *data; data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); if (data == NULL) { break; } g_free (object_path); object_path = g_strdup_printf ("%s_%d", orig_object_path, count++); modified = TRUE; } if (modified) g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), object_path); g_dbus_object_manager_server_export (manager, object); g_free (object_path); g_free (orig_object_path); }
/** * g_dbus_object_manager_server_export: * @manager: A #GDBusObjectManagerServer. * @object: A #GDBusObjectSkeleton. * * Exports @object on @manager. * * If there is already a #GDBusObject exported at the object path, * then the old object is removed. * * The object path for @object must be in the hierarchy rooted by the * object path for @manager. * * Note that @manager will take a reference on @object for as long as * it is exported. * * Since: 2.30 */ void g_dbus_object_manager_server_export (GDBusObjectManagerServer *manager, GDBusObjectSkeleton *object) { RegistrationData *data; GList *existing_interfaces; GList *l; GPtrArray *interface_names; const gchar *object_path; object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (object)); g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); g_return_if_fail (G_IS_DBUS_OBJECT (object)); g_return_if_fail (g_str_has_prefix (object_path, manager->priv->object_path_ending_in_slash)); interface_names = g_ptr_array_new (); data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); if (data != NULL) g_dbus_object_manager_server_unexport (manager, object_path); data = g_new0 (RegistrationData, 1); data->object = g_object_ref (object); data->manager = manager; data->map_iface_name_to_iface = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_object_unref); g_signal_connect (object, "interface-added", G_CALLBACK (on_interface_added), data); g_signal_connect (object, "interface-removed", G_CALLBACK (on_interface_removed), data); /* Register all known interfaces - note that data->exported is FALSE so * we don't emit any InterfacesAdded signals. */ existing_interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object)); for (l = existing_interfaces; l != NULL; l = l->next) { GDBusInterfaceSkeleton *interface_skeleton = G_DBUS_INTERFACE_SKELETON (l->data); registration_data_export_interface (data, interface_skeleton); g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (interface_skeleton)->name); } g_list_foreach (existing_interfaces, (GFunc) g_object_unref, NULL); g_list_free (existing_interfaces); g_ptr_array_add (interface_names, NULL); data->exported = TRUE; /* now emit InterfacesAdded() for all the interfaces */ g_dbus_object_manager_server_emit_interfaces_added (manager, data, (const gchar *const *) interface_names->pdata); g_ptr_array_unref (interface_names); g_hash_table_insert (manager->priv->map_object_path_to_data, g_strdup (object_path), data); }