static gboolean update_iface (UDisksLinuxMDRaidObject *object, const gchar *uevent_action, HasInterfaceFunc has_func, ConnectInterfaceFunc connect_func, UpdateInterfaceFunc update_func, GType skeleton_type, gpointer _interface_pointer) { gboolean ret = FALSE; gboolean has; gboolean add; GDBusInterface **interface_pointer = _interface_pointer; g_return_val_if_fail (object != NULL, FALSE); g_return_val_if_fail (has_func != NULL, FALSE); g_return_val_if_fail (update_func != NULL, FALSE); g_return_val_if_fail (g_type_is_a (skeleton_type, G_TYPE_OBJECT), FALSE); g_return_val_if_fail (g_type_is_a (skeleton_type, G_TYPE_DBUS_INTERFACE), FALSE); g_return_val_if_fail (interface_pointer != NULL, FALSE); g_return_val_if_fail (*interface_pointer == NULL || G_IS_DBUS_INTERFACE (*interface_pointer), FALSE); add = FALSE; has = has_func (object); if (*interface_pointer == NULL) { if (has) { *interface_pointer = g_object_new (skeleton_type, NULL); if (connect_func != NULL) connect_func (object); add = TRUE; } } else { if (!has) { g_dbus_object_skeleton_remove_interface (G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (*interface_pointer)); g_object_unref (*interface_pointer); *interface_pointer = NULL; } } if (*interface_pointer != NULL) { if (update_func (object, uevent_action, G_DBUS_INTERFACE (*interface_pointer))) ret = TRUE; if (add) g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (*interface_pointer)); } 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_interface_dup_object: * @interface_: An exported D-Bus interface. * * Gets the #GDBusObject that @interface_ belongs to, if any. * * Returns: (transfer full): A #GDBusObject or %NULL. The returned * reference should be freed with g_object_unref(). * * Since: 2.32 * * Rename to: g_dbus_interface_get_object */ GDBusObject * g_dbus_interface_dup_object (GDBusInterface *interface_) { GDBusObject *ret; g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); if (G_LIKELY (G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object != NULL)) { ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object (interface_); } else { g_warning ("No dup_object() vfunc on type %s - using get_object() in a way that is not thread-safe.", g_type_name_from_instance ((GTypeInstance *) interface_)); ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_); if (ret != NULL) g_object_ref (ret); } return ret; }
/** * udisks_daemon_util_dup_object: * @interface_: (type GDBusInterface): A #GDBusInterface<!-- -->-derived instance. * @error: %NULL, or an unset #GError to set if the return value is %NULL. * * Gets the enclosing #UDisksObject for @interface, if any. * * Returns: (transfer full) (type UDisksObject): Either %NULL or a * #UDisksObject<!-- -->-derived instance that must be released with * g_object_unref(). */ gpointer udisks_daemon_util_dup_object (gpointer interface_, GError **error) { gpointer ret; g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); ret = g_dbus_interface_dup_object (interface_); if (ret == NULL) { g_set_error (error, UDISKS_ERROR, UDISKS_ERROR_FAILED, "No enclosing object for interface"); } return ret; }
static gboolean update_iface (StoragedObject *object, const gchar *uevent_action, StoragedObjectHasInterfaceFunc has_func, StoragedObjectConnectInterfaceFunc connect_func, StoragedObjectUpdateInterfaceFunc update_func, GType skeleton_type, gpointer _interface_pointer) { gboolean ret = FALSE; gboolean has; gboolean add; GDBusInterface **interface_pointer = _interface_pointer; GDBusInterfaceInfo *interface_info = NULL; g_return_val_if_fail (object != NULL, FALSE); g_return_val_if_fail (has_func != NULL, FALSE); g_return_val_if_fail (update_func != NULL, FALSE); g_return_val_if_fail (g_type_is_a (skeleton_type, G_TYPE_OBJECT), FALSE); g_return_val_if_fail (g_type_is_a (skeleton_type, G_TYPE_DBUS_INTERFACE), FALSE); g_return_val_if_fail (interface_pointer != NULL, FALSE); g_return_val_if_fail (*interface_pointer == NULL || G_IS_DBUS_INTERFACE (*interface_pointer), FALSE); add = FALSE; has = has_func (object); if (*interface_pointer == NULL) { if (has) { *interface_pointer = g_object_new (skeleton_type, NULL); if (connect_func != NULL) connect_func (object); add = TRUE; } } else { if (!has) { /* Check before we remove interface from object */ interface_info = g_dbus_interface_get_info (*interface_pointer); if (g_dbus_object_get_interface ((GDBusObject *) object, interface_info->name)) g_dbus_object_skeleton_remove_interface (G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (*interface_pointer)); g_object_unref (*interface_pointer); *interface_pointer = NULL; } } if (*interface_pointer != NULL) { if (update_func (object, uevent_action, G_DBUS_INTERFACE (*interface_pointer))) ret = TRUE; if (add) g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (*interface_pointer)); } return ret; }
/** * g_dbus_interface_get_object: (skip) * @interface_: An exported D-Bus interface * * Gets the #GDBusObject that @interface_ belongs to, if any. * * It is not safe to use the returned object if @interface_ or * the returned object is being used from other threads. See * g_dbus_interface_dup_object() for a thread-safe alternative. * * Returns: (transfer none): A #GDBusObject or %NULL. The returned * reference belongs to @interface_ and should not be freed. * * Since: 2.30 */ GDBusObject * g_dbus_interface_get_object (GDBusInterface *interface_) { g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); return G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_); }