void storage_daemon_publish (StorageDaemon *self, const gchar *path, gboolean uniquely, gpointer thing) { GDBusInterface *prev; GDBusInterfaceInfo *info; GDBusObjectSkeleton *object; GQuark detail; g_return_if_fail (STORAGE_IS_DAEMON (self)); g_return_if_fail (path != NULL); if (G_IS_DBUS_INTERFACE (thing)) { g_debug ("%spublishing iface: %s %s", uniquely ? "uniquely " : "", path, g_dbus_interface_get_info(thing)->name); object = G_DBUS_OBJECT_SKELETON (g_dbus_object_manager_get_object (G_DBUS_OBJECT_MANAGER (self->object_manager), path)); if (object != NULL) { if (uniquely) { info = g_dbus_interface_get_info (thing); prev = g_dbus_object_get_interface (G_DBUS_OBJECT (object), info->name); if (prev) { g_object_unref (prev); g_object_unref (object); object = NULL; } } } if (object == NULL) object = g_dbus_object_skeleton_new (path); g_dbus_object_skeleton_add_interface (object, thing); } else { g_critical ("Unsupported type to publish: %s", G_OBJECT_TYPE_NAME (thing)); return; } if (uniquely) g_dbus_object_manager_server_export_uniquely (self->object_manager, object); else g_dbus_object_manager_server_export (self->object_manager, object); detail = g_quark_from_static_string (G_OBJECT_TYPE_NAME (thing)); g_signal_emit (self, signals[PUBLISHED], detail, thing); g_object_unref (object); }
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; 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; }
void get_iface (GObject *object, GType skeleton, gpointer _pointer_to_iface) { GDBusInterface **pointer_to_iface = _pointer_to_iface; if (*pointer_to_iface == NULL) { *pointer_to_iface = g_object_new(skeleton, NULL); } g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (*pointer_to_iface)); }
static void hev_dbus_interface_skeleton_constructed(GObject *obj) { GDBusObject *dbus_obj = NULL; g_debug("%s:%d[%s]", __FILE__, __LINE__, __FUNCTION__); G_OBJECT_CLASS(hev_dbus_interface_skeleton_parent_class)->constructed(obj); g_object_get(obj, "object", &dbus_obj, NULL); g_dbus_object_skeleton_add_interface(G_DBUS_OBJECT_SKELETON(dbus_obj), G_DBUS_INTERFACE_SKELETON(obj)); g_object_unref(dbus_obj); }
static gboolean register_display (GdmDisplay *display) { GError *error = NULL; error = NULL; display->priv->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (display->priv->connection == NULL) { g_critical ("error getting system bus: %s", error->message); g_error_free (error); exit (1); } display->priv->object_skeleton = g_dbus_object_skeleton_new (display->priv->id); display->priv->display_skeleton = GDM_DBUS_DISPLAY (gdm_dbus_display_skeleton_new ()); g_signal_connect (display->priv->display_skeleton, "handle-get-id", G_CALLBACK (handle_get_id), display); g_signal_connect (display->priv->display_skeleton, "handle-get-remote-hostname", G_CALLBACK (handle_get_remote_hostname), display); g_signal_connect (display->priv->display_skeleton, "handle-get-seat-id", G_CALLBACK (handle_get_seat_id), display); g_signal_connect (display->priv->display_skeleton, "handle-get-timed-login-details", G_CALLBACK (handle_get_timed_login_details), display); g_signal_connect (display->priv->display_skeleton, "handle-get-x11-authority-file", G_CALLBACK (handle_get_x11_authority_file), display); g_signal_connect (display->priv->display_skeleton, "handle-get-x11-cookie", G_CALLBACK (handle_get_x11_cookie), display); g_signal_connect (display->priv->display_skeleton, "handle-get-x11-display-name", G_CALLBACK (handle_get_x11_display_name), display); g_signal_connect (display->priv->display_skeleton, "handle-get-x11-display-number", G_CALLBACK (handle_get_x11_display_number), display); g_signal_connect (display->priv->display_skeleton, "handle-is-local", G_CALLBACK (handle_is_local), display); g_signal_connect (display->priv->display_skeleton, "handle-is-initial", G_CALLBACK (handle_is_initial), display); g_signal_connect (display->priv->display_skeleton, "handle-get-slave-bus-name", G_CALLBACK (handle_get_slave_bus_name), display); g_signal_connect (display->priv->display_skeleton, "handle-set-slave-bus-name", G_CALLBACK (handle_set_slave_bus_name), display); g_signal_connect (display->priv->display_skeleton, "handle-add-user-authorization", G_CALLBACK (handle_add_user_authorization), display); g_signal_connect (display->priv->display_skeleton, "handle-remove-user-authorization", G_CALLBACK (handle_remove_user_authorization), display); g_dbus_object_skeleton_add_interface (display->priv->object_skeleton, G_DBUS_INTERFACE_SKELETON (display->priv->display_skeleton)); return TRUE; }
/** * storage_daemon_launch_threaded_job: * @daemon: A #StorageDaemon. * @object: (allow-none): An object to add to the job or %NULL. * @job_operation: The operation for the job. * @job_started_by_uid: The user who started the job. * @job_func: The function to run in another thread. * @user_data: User data to pass to @job_func. * @user_data_free_func: Function to free @user_data with or %NULL. * @cancellable: A #GCancellable or %NULL. * * Launches a new job by running @job_func in a new dedicated thread. * * The job is started immediately - connect to the * #StorageThreadedJob::threaded-job-completed or #StorageJob::completed * signals to get notified when the job is done. * * Long-running jobs should periodically check @cancellable to see if * they have been cancelled. * * The returned object will be exported on the bus until the * #StorageJob::completed signal is emitted on the object. It is not * valid to use the returned object after this signal fires. * * Returns: A #StorageThreadedJob object. Do not free, the object * belongs to @manager. */ StorageJob * storage_daemon_launch_threaded_job (StorageDaemon *daemon, gpointer object_or_interface, const gchar *job_operation, uid_t job_started_by_uid, StorageJobFunc job_func, gpointer user_data, GDestroyNotify user_data_free_func, GCancellable *cancellable) { StorageThreadedJob *job; GDBusObjectSkeleton *job_object; gchar *job_object_path; g_return_val_if_fail (STORAGE_IS_DAEMON (daemon), NULL); g_return_val_if_fail (job_func != NULL, NULL); job = storage_threaded_job_new (job_func, user_data, user_data_free_func, cancellable); if (object_or_interface != NULL) storage_job_add_thing (STORAGE_JOB (job), object_or_interface); /* TODO: protect job_id by a mutex */ job_object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++); job_object = g_dbus_object_skeleton_new (job_object_path); g_dbus_object_skeleton_add_interface (job_object, G_DBUS_INTERFACE_SKELETON (job)); g_free (job_object_path); udisks_job_set_cancelable (UDISKS_JOB (job), TRUE); udisks_job_set_operation (UDISKS_JOB (job), job_operation); udisks_job_set_started_by_uid (UDISKS_JOB (job), job_started_by_uid); g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (job_object)); daemon->num_jobs++; g_signal_connect_after (job, "completed", G_CALLBACK (on_job_completed), g_object_ref (daemon)); g_object_unref (job_object); return STORAGE_JOB (job); }
StorageJob * storage_daemon_launch_spawned_jobv (StorageDaemon *self, gpointer object_or_interface, const gchar *job_operation, uid_t job_started_by_uid, GCancellable *cancellable, uid_t run_as_uid, uid_t run_as_euid, const gchar *input_string, const gchar **argv) { StorageSpawnedJob *job; GDBusObjectSkeleton *job_object; gchar *job_object_path; g_return_val_if_fail (STORAGE_IS_DAEMON (self), NULL); g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); job = storage_spawned_job_new (argv, input_string, run_as_uid, run_as_euid, cancellable); if (object_or_interface != NULL) storage_job_add_thing (STORAGE_JOB (job), object_or_interface); /* TODO: protect job_id by a mutex */ job_object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++); job_object = g_dbus_object_skeleton_new (job_object_path); g_dbus_object_skeleton_add_interface (job_object, G_DBUS_INTERFACE_SKELETON (job)); g_free (job_object_path); udisks_job_set_cancelable (UDISKS_JOB (job), TRUE); udisks_job_set_operation (UDISKS_JOB (job), job_operation); udisks_job_set_started_by_uid (UDISKS_JOB (job), job_started_by_uid); g_dbus_object_manager_server_export (self->object_manager, G_DBUS_OBJECT_SKELETON (job_object)); self->num_jobs++; g_signal_connect_after (job, "completed", G_CALLBACK (on_job_completed), g_object_ref (self)); g_object_unref (job_object); return STORAGE_JOB (job); }
static void storaged_linux_volume_group_object_constructed (GObject *_object) { StoragedLinuxVolumeGroupObject *object = STORAGED_LINUX_VOLUME_GROUP_OBJECT (_object); GString *s; if (G_OBJECT_CLASS (storaged_linux_volume_group_object_parent_class)->constructed != NULL) G_OBJECT_CLASS (storaged_linux_volume_group_object_parent_class)->constructed (_object); object->logical_volumes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref); /* compute the object path */ s = g_string_new ("/org/storaged/Storaged/lvm/"); storaged_safe_append_to_object_path (s, object->name); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), s->str); g_string_free (s, TRUE); /* create the DBus interface */ object->iface_volume_group = storaged_linux_volume_group_new (); g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (object->iface_volume_group)); /* Watch fstab and crypttab for changes. */ g_signal_connect (storaged_daemon_get_fstab_monitor (object->daemon), "entry-added", G_CALLBACK (etctabs_changed), object); g_signal_connect (storaged_daemon_get_fstab_monitor (object->daemon), "entry-removed", G_CALLBACK (etctabs_changed), object); g_signal_connect (storaged_daemon_get_crypttab_monitor (object->daemon), "entry-added", G_CALLBACK (etctabs_changed), object); g_signal_connect (storaged_daemon_get_crypttab_monitor (object->daemon), "entry-removed", G_CALLBACK (etctabs_changed), object); }
static void block_object_update_lvm_iface (StoragedLinuxBlockObject *object, const gchar *lv_obj_path) { StoragedBlockLVM2 *iface_block_lvm2; iface_block_lvm2 = storaged_object_peek_block_lvm2 (STORAGED_OBJECT (object)); if (iface_block_lvm2 == NULL) { iface_block_lvm2 = storaged_linux_block_lvm2_new (); g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (iface_block_lvm2)); g_object_unref (iface_block_lvm2); } storaged_linux_block_lvm2_update (STORAGED_LINUX_BLOCK_LVM2 (iface_block_lvm2), object); storaged_block_lvm2_set_logical_volume (iface_block_lvm2, lv_obj_path); }
static void udisks_linux_logical_volume_object_constructed (GObject *_object) { UDisksLinuxLogicalVolumeObject *object = UDISKS_LINUX_LOGICAL_VOLUME_OBJECT (_object); GString *s; if (G_OBJECT_CLASS (udisks_linux_logical_volume_object_parent_class)->constructed != NULL) G_OBJECT_CLASS (udisks_linux_logical_volume_object_parent_class)->constructed (_object); /* compute the object path */ s = g_string_new (g_dbus_object_get_object_path (G_DBUS_OBJECT (object->volume_group))); g_string_append_c (s, '/'); udisks_safe_append_to_object_path (s, object->name); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), s->str); g_string_free (s, TRUE); /* create the DBus interface */ object->iface_logical_volume = udisks_linux_logical_volume_new (); g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), G_DBUS_INTERFACE_SKELETON (object->iface_logical_volume)); }