static void g_dbus_object_manager_server_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); switch (prop_id) { case PROP_CONNECTION: g_dbus_object_manager_server_set_connection (manager, g_value_get_object (value)); break; case PROP_OBJECT_PATH: g_assert (manager->priv->object_path == NULL); g_assert (g_variant_is_object_path (g_value_get_string (value))); manager->priv->object_path = g_value_dup_string (value); manager->priv->object_path_ending_in_slash = g_strdup_printf ("%s/", manager->priv->object_path); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
/** * g_dbus_object_manager_server_new: * @object_path: The object path to export the manager object at. * * Creates a new #GDBusObjectManagerServer object. * * The returned server isn't yet exported on any connection. To do so, * use g_dbus_object_manager_server_set_connection(). Normally you * want to export all of your objects before doing so to avoid <ulink * url="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager">InterfacesAdded</ulink> * signals being emitted. * * Returns: A #GDBusObjectManagerServer object. Free with g_object_unref(). * * Since: 2.30 */ GDBusObjectManagerServer * g_dbus_object_manager_server_new (const gchar *object_path) { g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); return G_DBUS_OBJECT_MANAGER_SERVER (g_object_new (G_TYPE_DBUS_OBJECT_MANAGER_SERVER, "object-path", object_path, NULL)); }
static void manager_method_call (GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (user_data); GVariantBuilder array_builder; GHashTableIter object_iter; RegistrationData *data; if (g_strcmp0 (method_name, "GetManagedObjects") == 0) { g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{oa{sa{sv}}}")); g_hash_table_iter_init (&object_iter, manager->priv->map_object_path_to_data); while (g_hash_table_iter_next (&object_iter, NULL, (gpointer) &data)) { GVariantBuilder interfaces_builder; GHashTableIter interface_iter; GDBusInterfaceSkeleton *iface; const gchar *iter_object_path; g_variant_builder_init (&interfaces_builder, G_VARIANT_TYPE ("a{sa{sv}}")); g_hash_table_iter_init (&interface_iter, data->map_iface_name_to_iface); while (g_hash_table_iter_next (&interface_iter, NULL, (gpointer) &iface)) { g_variant_builder_add_value (&interfaces_builder, g_variant_new ("{s@a{sv}}", g_dbus_interface_skeleton_get_info (iface)->name, g_dbus_interface_skeleton_get_properties (iface))); } iter_object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); g_variant_builder_add (&array_builder, "{oa{sa{sv}}}", iter_object_path, &interfaces_builder); } g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a{oa{sa{sv}}})", &array_builder)); } else { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Unknown method %s - only GetManagedObjects() is supported", method_name); } }
static void g_dbus_object_manager_server_constructed (GObject *object) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); if (manager->priv->connection != NULL) export_all (manager); if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed != NULL) G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed (object); }
static GDBusObject * g_dbus_object_manager_server_get_object (GDBusObjectManager *_manager, const gchar *object_path) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); GDBusObject *ret; RegistrationData *data; ret = NULL; data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); if (data != NULL) ret = g_object_ref (data->object); return ret; }
static GList * g_dbus_object_manager_server_get_objects (GDBusObjectManager *_manager) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); GList *ret; GHashTableIter iter; RegistrationData *data; ret = NULL; g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data); while (g_hash_table_iter_next (&iter, NULL, (gpointer) &data)) { ret = g_list_prepend (ret, g_object_ref (data->object)); } return ret; }
static void g_dbus_object_manager_server_finalize (GObject *object) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); if (manager->priv->connection != NULL) { unexport_all (manager, TRUE); g_object_unref (manager->priv->connection); } g_hash_table_unref (manager->priv->map_object_path_to_data); g_free (manager->priv->object_path); g_free (manager->priv->object_path_ending_in_slash); if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize != NULL) G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize (object); }
static void g_dbus_object_manager_server_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); switch (prop_id) { case PROP_CONNECTION: g_value_set_object (value, manager->priv->connection); break; case PROP_OBJECT_PATH: g_value_set_string (value, g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (manager))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void provider_update_jobs (StorageProvider *provider) { GDBusObjectManagerServer *object_manager; GList *udisks_objects; GList *lvm_objects; GList *all_objects; GList *wanted; GList *added, *removed; GList *l; object_manager = G_DBUS_OBJECT_MANAGER_SERVER (daemon_get_object_manager (provider->daemon)); udisks_objects = g_dbus_object_manager_get_objects (udisks_client_get_object_manager (provider->udisks_client)); lvm_objects = g_dbus_object_manager_get_objects (provider->lvm_objman); all_objects = g_list_concat (udisks_objects, lvm_objects); wanted = NULL; for (l = all_objects; l != NULL; l = l->next) { if (!UDISKS_IS_OBJECT (l->data)) continue; UDisksObject *object = UDISKS_OBJECT (l->data); UDisksJob *job; job = udisks_object_peek_job (object); if (job == NULL) continue; const gchar *operation = udisks_job_get_operation (job); if (strcmp (operation, "format-mkfs") != 0 && strcmp (operation, "format-erase") != 0 && strcmp (operation, "lvm-vg-empty-device") != 0) continue; wanted = g_list_prepend (wanted, g_object_ref (job)); } wanted = g_list_sort (wanted, (GCompareFunc)_udisks_job_compare_func); provider->jobs = g_list_sort (provider->jobs, (GCompareFunc)_udisks_job_compare_func); diff_sorted_lists (provider->jobs, wanted, (GCompareFunc)_udisks_job_compare_func, &added, &removed, NULL); for (l = removed; l != NULL; l = l->next) { UDisksJob *job = UDISKS_JOB (l->data); CockpitJob *object; object = g_hash_table_lookup (provider->hash_job_to_storage_job, job); if (object == NULL) { g_warning ("No object for job %p", job); } else { g_warn_if_fail (g_dbus_object_manager_server_unexport (object_manager, g_dbus_object_get_object_path (G_DBUS_OBJECT (object)))); g_hash_table_remove (provider->hash_job_to_storage_job, job); } provider->jobs = g_list_remove (provider->jobs, job); g_object_unref (job); } for (l = added; l != NULL; l = l->next) { UDisksJob *job = UDISKS_JOB (l->data); CockpitObjectSkeleton *object; CockpitJob *cockpit_job; gchar *object_path; object_path = utils_generate_object_path ("/com/redhat/Cockpit/Jobs", udisks_job_get_operation (job)); cockpit_job = storage_job_new (provider, job); object = cockpit_object_skeleton_new (object_path); cockpit_object_skeleton_set_job (object, cockpit_job); g_object_unref (cockpit_job); g_free (object_path); g_warn_if_fail (g_hash_table_lookup (provider->hash_job_to_storage_job, job) == NULL); g_hash_table_insert (provider->hash_job_to_storage_job, g_object_ref (job), object); g_dbus_object_manager_server_export_uniquely (object_manager, G_DBUS_OBJECT_SKELETON (object)); provider->jobs = g_list_prepend (provider->jobs, g_object_ref (job)); } g_list_free (added); g_list_free (removed); g_list_free_full (all_objects, g_object_unref); g_list_free_full (wanted, g_object_unref); }
static void provider_update_objects (StorageProvider *provider) { GDBusObjectManagerServer *object_manager; GList *udisks_objects; GList *lvm_objects; GList *wanted; GList *added, *removed; GList *l; object_manager = G_DBUS_OBJECT_MANAGER_SERVER (daemon_get_object_manager (provider->daemon)); udisks_objects = g_dbus_object_manager_get_objects (udisks_client_get_object_manager (provider->udisks_client)); lvm_objects = g_dbus_object_manager_get_objects (provider->lvm_objman); wanted = NULL; for (l = udisks_objects; l != NULL; l = l->next) { GDBusInterface *iface = get_udisk_iface (UDISKS_OBJECT (l->data)); if (iface == NULL) continue; wanted = g_list_prepend (wanted, g_object_ref (iface)); } for (l = lvm_objects; l != NULL; l = l->next) { if (!LVM_IS_OBJECT (l->data)) continue; GDBusInterface *iface = get_lvm_iface (LVM_OBJECT (l->data)); if (iface == NULL) continue; wanted = g_list_prepend (wanted, g_object_ref (iface)); } wanted = g_list_sort (wanted, (GCompareFunc)udisks_iface_compare_func); provider->ifaces = g_list_sort (provider->ifaces, (GCompareFunc)udisks_iface_compare_func); diff_sorted_lists (provider->ifaces, wanted, (GCompareFunc)udisks_iface_compare_func, &added, &removed, NULL); for (l = removed; l != NULL; l = l->next) { GDBusInterface *iface = G_DBUS_INTERFACE (l->data); StorageObject *object; object = g_hash_table_lookup (provider->hash_interface_to_storage_object, iface); g_warn_if_fail (object != NULL); if (object) { g_warn_if_fail (g_dbus_object_manager_server_unexport (object_manager, g_dbus_object_get_object_path (G_DBUS_OBJECT (object)))); } g_hash_table_remove (provider->hash_interface_to_storage_object, iface); provider->ifaces = g_list_remove (provider->ifaces, iface); g_object_unref (iface); } for (l = added; l != NULL; l = l->next) { GDBusInterface *iface = G_DBUS_INTERFACE (l->data); StorageObject *object = make_storage_object (provider, iface); g_warn_if_fail (g_hash_table_lookup (provider->hash_interface_to_storage_object, iface) == NULL); g_hash_table_insert (provider->hash_interface_to_storage_object, g_object_ref (iface), object); gs_free gchar *object_path = storage_object_make_object_path (object); g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), object_path); g_dbus_object_manager_server_export_uniquely (object_manager, G_DBUS_OBJECT_SKELETON (object)); provider->ifaces = g_list_prepend (provider->ifaces, g_object_ref (iface)); } g_list_free (added); g_list_free (removed); g_list_free_full (udisks_objects, g_object_unref); g_list_free_full (lvm_objects, g_object_unref); g_list_free_full (wanted, g_object_unref); }
static const gchar * g_dbus_object_manager_server_get_object_path (GDBusObjectManager *_manager) { GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); return manager->priv->object_path; }