static UDisksObjectInfo * udisks_object_info_new (UDisksObject *object) { UDisksObjectInfo *ret; g_return_val_if_fail (object == NULL || UDISKS_IS_OBJECT (object), NULL); ret = g_object_new (UDISKS_TYPE_OBJECT_INFO, NULL); ret->object = object != NULL ? g_object_ref (object) : NULL; return ret; }
/** * udisks_client_get_object_info: * @client: A #UDisksClient. * @object: A #UDisksObject. * * Gets information about a #UDisksObject instance that is suitable to * present in an user interface. Information is returned in the * #UDisksObjectInfo object and is localized. * * Returns: (transfer full): A #UDisksObjectInfo instance that should be freed with g_object_unref(). * * Since: 2.1 */ UDisksObjectInfo * udisks_client_get_object_info (UDisksClient *client, UDisksObject *object) { UDisksObjectInfo *ret = NULL; UDisksDrive *drive = NULL; UDisksBlock *block = NULL; UDisksPartition *partition = NULL; UDisksMDRaid *mdraid = NULL; UDisksLoop *loop = NULL; g_return_val_if_fail (UDISKS_IS_CLIENT (client), NULL); g_return_val_if_fail (UDISKS_IS_OBJECT (object), NULL); ret = udisks_object_info_new (object); drive = udisks_object_get_drive (object); block = udisks_object_get_block (object); loop = udisks_object_get_loop (object); partition = udisks_object_get_partition (object); mdraid = udisks_object_get_mdraid (object); if (drive != NULL) { udisks_client_get_object_info_for_drive (client, drive, NULL, ret); } else if (mdraid != NULL) { udisks_client_get_object_info_for_mdraid (client, mdraid, NULL, ret); } else if (block != NULL) { drive = udisks_client_get_drive_for_block (client, block); if (drive != NULL) { udisks_client_get_object_info_for_drive (client, drive, partition, ret); goto out; } mdraid = udisks_client_get_mdraid_for_block (client, block); if (mdraid != NULL) { udisks_client_get_object_info_for_mdraid (client, mdraid, partition, ret); goto out; } if (loop != NULL) udisks_client_get_object_info_for_loop (client, loop, block, partition, ret); else udisks_client_get_object_info_for_block (client, block, partition, ret); } out: g_clear_object (&loop); g_clear_object (&mdraid); g_clear_object (&partition); g_clear_object (&block); g_clear_object (&drive); #if 0 /* for debugging */ g_print ("%s -> dd='%s', md='%s', ol='%s' and di='%s', mi='%s' sk='%s'\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object)), ret->description, ret->media_description, ret->one_liner, ret->icon == NULL ? "" : g_icon_to_string (ret->icon), ret->media_icon == NULL ? "" : g_icon_to_string (ret->media_icon), ret->sort_key); #endif return ret; }
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); }