/** * g_dbus_object_skeleton_remove_interface_by_name: * @object: A #GDBusObjectSkeleton. * @interface_name: A D-Bus interface name. * * Removes the #GDBusInterface with @interface_name from @object. * * If no D-Bus interface of the given interface exists, this function * does nothing. * * Since: 2.30 */ void g_dbus_object_skeleton_remove_interface_by_name (GDBusObjectSkeleton *object, const gchar *interface_name) { GDBusInterface *interface; g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); g_return_if_fail (g_dbus_is_interface_name (interface_name)); g_mutex_lock (object->priv->lock); interface = g_hash_table_lookup (object->priv->map_name_to_iface, interface_name); if (interface != NULL) { g_object_ref (interface); g_warn_if_fail (g_hash_table_remove (object->priv->map_name_to_iface, interface_name)); g_mutex_unlock (object->priv->lock); g_dbus_interface_set_object (interface, NULL); g_signal_emit_by_name (object, "interface-removed", interface); g_object_unref (interface); } else { g_mutex_unlock (object->priv->lock); } }
static GList * g_dbus_object_skeleton_get_interfaces (GDBusObject *_object) { GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); GList *ret; g_return_val_if_fail (G_IS_DBUS_OBJECT_SKELETON (object), NULL); ret = NULL; g_mutex_lock (object->priv->lock); ret = g_hash_table_get_values (object->priv->map_name_to_iface); g_list_foreach (ret, (GFunc) g_object_ref, NULL); g_mutex_unlock (object->priv->lock); return ret; }
static GDBusInterface * g_dbus_object_skeleton_get_interface (GDBusObject *_object, const gchar *interface_name) { GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); GDBusInterface *ret; g_return_val_if_fail (G_IS_DBUS_OBJECT_SKELETON (object), NULL); g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL); g_mutex_lock (object->priv->lock); ret = g_hash_table_lookup (object->priv->map_name_to_iface, interface_name); if (ret != NULL) g_object_ref (ret); g_mutex_unlock (object->priv->lock); return ret; }
/** * g_dbus_object_skeleton_remove_interface: * @object: A #GDBusObjectSkeleton. * @interface_: A #GDBusInterfaceSkeleton. * * Removes @interface_ from @object. * * Since: 2.30 */ void g_dbus_object_skeleton_remove_interface (GDBusObjectSkeleton *object, GDBusInterfaceSkeleton *interface_) { GDBusInterfaceSkeleton *other_interface; GDBusInterfaceInfo *info; g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); g_return_if_fail (G_IS_DBUS_INTERFACE (interface_)); g_mutex_lock (object->priv->lock); info = g_dbus_interface_skeleton_get_info (interface_); other_interface = g_hash_table_lookup (object->priv->map_name_to_iface, info->name); if (other_interface == NULL) { g_mutex_unlock (object->priv->lock); g_warning ("Tried to remove interface with name %s from object " "at path %s but no such interface exists", info->name, object->priv->object_path); } else if (other_interface != interface_) { g_mutex_unlock (object->priv->lock); g_warning ("Tried to remove interface %p with name %s from object " "at path %s but the object has the interface %p", interface_, info->name, object->priv->object_path, other_interface); } else { g_object_ref (interface_); g_warn_if_fail (g_hash_table_remove (object->priv->map_name_to_iface, info->name)); g_mutex_unlock (object->priv->lock); g_dbus_interface_set_object (G_DBUS_INTERFACE (interface_), NULL); g_signal_emit_by_name (object, "interface-removed", interface_); g_object_unref (interface_); } }
/** * g_dbus_object_skeleton_add_interface: * @object: A #GDBusObjectSkeleton. * @interface_: A #GDBusInterfaceSkeleton. * * Adds @interface_ to @object. * * If @object already contains a #GDBusInterfaceSkeleton with the same * interface name, it is removed before @interface_ is added. * * Note that @object takes its own reference on @interface_ and holds * it until removed. * * Since: 2.30 */ void g_dbus_object_skeleton_add_interface (GDBusObjectSkeleton *object, GDBusInterfaceSkeleton *interface_) { GDBusInterfaceInfo *info; GDBusInterface *interface_to_remove; g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); g_return_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_)); g_mutex_lock (object->priv->lock); info = g_dbus_interface_skeleton_get_info (interface_); g_object_ref (interface_); interface_to_remove = g_hash_table_lookup (object->priv->map_name_to_iface, info->name); if (interface_to_remove != NULL) { g_object_ref (interface_to_remove); g_warn_if_fail (g_hash_table_remove (object->priv->map_name_to_iface, info->name)); } g_hash_table_insert (object->priv->map_name_to_iface, g_strdup (info->name), g_object_ref (interface_)); g_dbus_interface_set_object (G_DBUS_INTERFACE (interface_), G_DBUS_OBJECT (object)); g_mutex_unlock (object->priv->lock); if (interface_to_remove != NULL) { g_dbus_interface_set_object (interface_to_remove, NULL); g_signal_emit_by_name (object, "interface-removed", interface_to_remove); g_object_unref (interface_to_remove); } g_signal_emit_by_name (object, "interface-added", interface_); g_object_unref (interface_); }
/** * g_dbus_object_skeleton_set_object_path: * @object: A #GDBusObjectSkeleton. * @object_path: A valid D-Bus object path. * * Sets the object path for @object. * * Since: 2.30 */ void g_dbus_object_skeleton_set_object_path (GDBusObjectSkeleton *object, const gchar *object_path) { g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); g_return_if_fail (object_path == NULL || g_variant_is_object_path (object_path)); g_mutex_lock (object->priv->lock); /* TODO: fail if object is currently exported */ if (g_strcmp0 (object->priv->object_path, object_path) != 0) { g_free (object->priv->object_path); object->priv->object_path = g_strdup (object_path); g_mutex_unlock (object->priv->lock); g_object_notify (G_OBJECT (object), "object-path"); } else { g_mutex_unlock (object->priv->lock); } }
/* returns FALSE if object is not (or no longer) valid */ static gboolean update_account_object (GoaDaemon *daemon, GoaObjectSkeleton *object, const gchar *path, const gchar *group, GKeyFile *key_file, gboolean just_added) { GoaAccount *account; GoaProvider *provider; gboolean ret; gchar *identity; gchar *presentation_identity; gchar *type; gchar *name; GIcon *icon; gchar *serialized_icon; GError *error; g_return_val_if_fail (GOA_IS_DAEMON (daemon), FALSE); g_return_val_if_fail (G_IS_DBUS_OBJECT_SKELETON (object), FALSE); g_return_val_if_fail (group != NULL, FALSE); g_return_val_if_fail (key_file != NULL, FALSE); ret = FALSE; identity = NULL; type = NULL; account = NULL; name = NULL; icon = NULL; serialized_icon = NULL; g_debug ("updating %s %d", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)), just_added); type = g_key_file_get_string (key_file, group, "Provider", NULL); identity = g_key_file_get_string (key_file, group, "Identity", NULL); presentation_identity = g_key_file_get_string (key_file, group, "PresentationIdentity", NULL); if (just_added) { account = goa_account_skeleton_new (); goa_object_skeleton_set_account (object, account); } else { account = goa_object_get_account (GOA_OBJECT (object)); } provider = goa_provider_get_for_provider_type (type); if (provider == NULL) { g_warning ("Unsupported account type %s for identity %s (no provider)", type, identity); goto out; } goa_account_set_id (account, g_strrstr (g_dbus_object_get_object_path (G_DBUS_OBJECT (object)), "/") + 1); goa_account_set_provider_type (account, type); goa_account_set_identity (account, identity); goa_account_set_presentation_identity (account, presentation_identity); error = NULL; if (!goa_provider_build_object (provider, object, key_file, group, daemon->connection, just_added, &error)) { g_warning ("Error parsing account: %s (%s, %d)", error->message, g_quark_to_string (error->domain), error->code); g_error_free (error); goto out; } name = goa_provider_get_provider_name (provider, GOA_OBJECT (object)); goa_account_set_provider_name (account, name); icon = goa_provider_get_provider_icon (provider, GOA_OBJECT (object)); serialized_icon = g_icon_to_string (icon); goa_account_set_provider_icon (account, serialized_icon); ret = TRUE; out: g_free (serialized_icon); if (icon != NULL) g_object_unref (icon); g_free (name); if (provider != NULL) g_object_unref (provider); g_object_unref (account); g_free (type); g_free (identity); return ret; }