Add new Job:Objects property and set it
authorDavid Zeuthen <davidz@redhat.com>
Tue, 22 Nov 2011 18:48:50 +0000 (13:48 -0500)
committerDavid Zeuthen <davidz@redhat.com>
Tue, 22 Nov 2011 18:48:50 +0000 (13:48 -0500)
This can be used to render spinners, e.g.

 http://people.freedesktop.org/~david/gdu2-spinners.png

Signed-off-by: David Zeuthen <davidz@redhat.com>
18 files changed:
data/org.freedesktop.UDisks2.xml
doc/udisks2-sections.txt
src/udisksbasejob.c
src/udisksbasejob.h
src/udiskscleanup.c
src/udisksdaemon.c
src/udisksdaemon.h
src/udiskslinuxblock.c
src/udiskslinuxdrive.c
src/udiskslinuxdriveata.c
src/udiskslinuxencrypted.c
src/udiskslinuxfilesystem.c
src/udiskslinuxloop.c
src/udiskslinuxpartition.c
src/udiskslinuxpartitiontable.c
src/udiskslinuxswapspace.c
udisks/udisksclient.c
udisks/udisksclient.h

index 0500d5d..d4e5f65 100644 (file)
     -->
     <property name="ExpectedEndTime" type="t" access="read"/>
 
+    <!-- Objects: The objects that the job is related to, if any. -->
+    <property name="Objects" type="ao" access="read"/>
+
     <!--
         Cancel:
         @options: Options (currently unused except for <link linkend="udisks-std-options">standard options</link>).
index c8c2882..99cab8a 100644 (file)
@@ -39,6 +39,7 @@ udisks_client_get_drive_for_block
 udisks_client_get_cleartext_block
 udisks_client_get_partition_table
 udisks_client_get_partitions
+udisks_client_get_jobs_for_object
 <SUBSECTION>
 udisks_client_get_drive_info
 udisks_client_get_partition_info
@@ -104,6 +105,8 @@ udisks_daemon_marshal_BOOLEAN__BOXED_INT_BOXED_BOXED
 <TITLE>UDisksBaseJob</TITLE>
 UDisksBaseJob
 UDisksBaseJobClass
+udisks_base_job_add_object
+udisks_base_job_remove_object
 udisks_base_job_get_cancellable
 <SUBSECTION Standard>
 UDISKS_TYPE_BASE_JOB
@@ -697,9 +700,12 @@ udisks_job_emit_completed
 udisks_job_get_expected_end_time
 udisks_job_get_progress
 udisks_job_get_start_time
+udisks_job_get_objects
+udisks_job_dup_objects
 udisks_job_set_expected_end_time
 udisks_job_set_progress
 udisks_job_set_start_time
+udisks_job_set_objects
 UDisksJobProxy
 UDisksJobProxyClass
 udisks_job_proxy_new
index 7b5fabf..d298792 100644 (file)
@@ -178,6 +178,91 @@ udisks_base_job_get_cancellable  (UDisksBaseJob  *job)
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+/**
+ * udisks_base_job_add_object:
+ * @job: A #UDisksBaseJob.
+ * @object: A #UDisksObject.
+ *
+ * Adds the object path for @object to the <link
+ * linkend="gdbus-property-org-freedesktop-UDisks2-Job.Objects">Objects</link>
+ * array. If the object path is already in the array, does nothing.
+ */
+void
+udisks_base_job_add_object (UDisksBaseJob  *job,
+                            UDisksObject   *object)
+{
+  const gchar *object_path;
+  const gchar *const *paths;
+  const gchar **p;
+  guint n;
+
+  g_return_if_fail (UDISKS_IS_BASE_JOB (job));
+  g_return_if_fail (UDISKS_IS_OBJECT (object));
+
+  object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (object));
+  paths = udisks_job_get_objects (UDISKS_JOB (job));
+  for (n = 0; paths != NULL && paths[n] != NULL; n++)
+    {
+      if (g_strcmp0 (paths[n], object_path) == 0)
+        goto out;
+    }
+
+  p = g_new0 (const gchar *, n + 2);
+  p[n] = object_path;
+  udisks_job_set_objects (UDISKS_JOB (job), p);
+  g_free (p);
+
+ out:
+  ;
+}
+
+/**
+ * udisks_base_job_remove_object:
+ * @job: A #UDisksBaseJob.
+ * @object: A #UDisksObject.
+ *
+ * Removes the object path for @object to the <link
+ * linkend="gdbus-property-org-freedesktop-UDisks2-Job.Objects">Objects</link>
+ * array. If the object path is not in the array, does nothing.
+ */
+void
+udisks_base_job_remove_object (UDisksBaseJob  *job,
+                               UDisksObject   *object)
+{
+  const gchar *object_path;
+  const gchar *const *paths;
+  GPtrArray *p = NULL;
+  guint n;
+
+  g_return_if_fail (UDISKS_IS_BASE_JOB (job));
+  g_return_if_fail (UDISKS_IS_OBJECT (object));
+
+  object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (object));
+  paths = udisks_job_get_objects (UDISKS_JOB (job));
+  for (n = 0; paths != NULL && paths[n] != NULL; n++)
+    {
+      if (g_strcmp0 (paths[n], object_path) != 0)
+        {
+          if (p == NULL)
+            p = g_ptr_array_new ();
+          g_ptr_array_add (p, (gpointer) paths[n]);
+        }
+    }
+
+  if (p != NULL)
+    {
+      g_ptr_array_add (p, NULL);
+      udisks_job_set_objects (UDISKS_JOB (job), (const gchar *const *) p->pdata);
+      g_ptr_array_free (p, TRUE);
+    }
+  else
+    {
+      udisks_job_set_objects (UDISKS_JOB (job), NULL);
+    }
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 static gboolean
 handle_cancel (UDisksJob              *object,
                GDBusMethodInvocation  *invocation,
index 7c73cd9..35f8495 100644 (file)
@@ -63,6 +63,10 @@ struct _UDisksBaseJobClass
 
 GType              udisks_base_job_get_type         (void) G_GNUC_CONST;
 GCancellable      *udisks_base_job_get_cancellable  (UDisksBaseJob  *job);
+void               udisks_base_job_add_object       (UDisksBaseJob  *job,
+                                                     UDisksObject   *object);
+void               udisks_base_job_remove_object    (UDisksBaseJob  *job,
+                                                     UDisksObject   *object);
 
 G_END_DECLS
 
index 6084340..0796784 100644 (file)
@@ -621,6 +621,7 @@ udisks_cleanup_check_mounted_fs_entry (UDisksCleanup  *cleanup,
           escaped_mount_point = g_strescape (mount_point, NULL);
           /* right now -l is the only way to "force unmount" file systems... */
           if (!udisks_daemon_launch_spawned_job_sync (cleanup->daemon,
+                                                      NULL, /* UDisksObject */
                                                       NULL, /* GCancellable */
                                                       0,    /* uid_t run_as_uid */
                                                       0,    /* uid_t run_as_euid */
@@ -1292,6 +1293,7 @@ udisks_cleanup_check_unlocked_luks_entry (UDisksCleanup  *cleanup,
           error_message = NULL;
           escaped_device_file = g_strescape (device_file_cleartext, NULL);
           if (!udisks_daemon_launch_spawned_job_sync (cleanup->daemon,
+                                                      NULL, /* UDisksObject */
                                                       NULL, /* GCancellable */
                                                       0,    /* uid_t run_as_uid */
                                                       0,    /* uid_t run_as_euid */
@@ -1963,6 +1965,7 @@ udisks_cleanup_check_loop_entry (UDisksCleanup  *cleanup,
           error_message = NULL;
           escaped_loop_device_file = g_strescape (loop_device, NULL);
           if (!udisks_daemon_launch_spawned_job_sync (cleanup->daemon,
+                                                      NULL, /* UDisksObject */
                                                       NULL, /* GCancellable */
                                                       0,    /* uid_t run_as_uid */
                                                       0,    /* uid_t run_as_euid */
index 6214e6f..e2baf3e 100644 (file)
@@ -494,6 +494,7 @@ static guint job_id = 0;
 /**
  * udisks_daemon_launch_simple_job:
  * @daemon: A #UDisksDaemon.
+ * @object: (allow-none): A #UDisksObject to add to the job or %NULL.
  * @cancellable: A #GCancellable or %NULL.
  *
  * Launches a new simple job.
@@ -512,23 +513,26 @@ static guint job_id = 0;
  */
 UDisksBaseJob *
 udisks_daemon_launch_simple_job (UDisksDaemon    *daemon,
+                                 UDisksObject    *object,
                                  GCancellable    *cancellable)
 {
   UDisksSimpleJob *job;
-  UDisksObjectSkeleton *object;
-  gchar *object_path;
+  UDisksObjectSkeleton *job_object;
+  gchar *job_object_path;
 
   g_return_val_if_fail (UDISKS_IS_DAEMON (daemon), NULL);
 
   job = udisks_simple_job_new (cancellable);
+  if (object != NULL)
+    udisks_base_job_add_object (UDISKS_BASE_JOB (job), object);
 
   /* TODO: protect job_id by a mutex */
-  object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
-  object = udisks_object_skeleton_new (object_path);
-  udisks_object_skeleton_set_job (object, UDISKS_JOB (job));
-  g_free (object_path);
+  job_object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
+  job_object = udisks_object_skeleton_new (job_object_path);
+  udisks_object_skeleton_set_job (job_object, UDISKS_JOB (job));
+  g_free (job_object_path);
 
-  g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (object));
+  g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (job_object));
   g_signal_connect_after (job,
                           "completed",
                           G_CALLBACK (on_job_completed),
@@ -542,6 +546,7 @@ udisks_daemon_launch_simple_job (UDisksDaemon    *daemon,
 /**
  * udisks_daemon_launch_threaded_job:
  * @daemon: A #UDisksDaemon.
+ * @object: (allow-none): A #UDisksObject to add to the job or %NULL.
  * @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.
@@ -565,14 +570,15 @@ udisks_daemon_launch_simple_job (UDisksDaemon    *daemon,
  */
 UDisksBaseJob *
 udisks_daemon_launch_threaded_job  (UDisksDaemon    *daemon,
+                                    UDisksObject    *object,
                                     UDisksThreadedJobFunc job_func,
                                     gpointer         user_data,
                                     GDestroyNotify   user_data_free_func,
                                     GCancellable    *cancellable)
 {
   UDisksThreadedJob *job;
-  UDisksObjectSkeleton *object;
-  gchar *object_path;
+  UDisksObjectSkeleton *job_object;
+  gchar *job_object_path;
 
   g_return_val_if_fail (UDISKS_IS_DAEMON (daemon), NULL);
   g_return_val_if_fail (job_func != NULL, NULL);
@@ -581,14 +587,16 @@ udisks_daemon_launch_threaded_job  (UDisksDaemon    *daemon,
                                  user_data,
                                  user_data_free_func,
                                  cancellable);
+  if (object != NULL)
+    udisks_base_job_add_object (UDISKS_BASE_JOB (job), object);
 
   /* TODO: protect job_id by a mutex */
-  object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
-  object = udisks_object_skeleton_new (object_path);
-  udisks_object_skeleton_set_job (object, UDISKS_JOB (job));
-  g_free (object_path);
+  job_object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
+  job_object = udisks_object_skeleton_new (job_object_path);
+  udisks_object_skeleton_set_job (job_object, UDISKS_JOB (job));
+  g_free (job_object_path);
 
-  g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (object));
+  g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (job_object));
   g_signal_connect_after (job,
                           "completed",
                           G_CALLBACK (on_job_completed),
@@ -602,6 +610,7 @@ udisks_daemon_launch_threaded_job  (UDisksDaemon    *daemon,
 /**
  * udisks_daemon_launch_spawned_job:
  * @daemon: A #UDisksDaemon.
+ * @object: (allow-none): A #UDisksObject to add to the job or %NULL.
  * @cancellable: A #GCancellable or %NULL.
  * @run_as_uid: The #uid_t to run the command as.
  * @run_as_euid: The effective #uid_t to run the command as.
@@ -624,6 +633,7 @@ udisks_daemon_launch_threaded_job  (UDisksDaemon    *daemon,
  */
 UDisksBaseJob *
 udisks_daemon_launch_spawned_job (UDisksDaemon    *daemon,
+                                  UDisksObject    *object,
                                   GCancellable    *cancellable,
                                   uid_t            run_as_uid,
                                   uid_t            run_as_euid,
@@ -634,8 +644,8 @@ udisks_daemon_launch_spawned_job (UDisksDaemon    *daemon,
   va_list var_args;
   gchar *command_line;
   UDisksSpawnedJob *job;
-  UDisksObjectSkeleton *object;
-  gchar *object_path;
+  UDisksObjectSkeleton *job_object;
+  gchar *job_object_path;
 
   g_return_val_if_fail (UDISKS_IS_DAEMON (daemon), NULL);
   g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
@@ -647,13 +657,16 @@ udisks_daemon_launch_spawned_job (UDisksDaemon    *daemon,
   job = udisks_spawned_job_new (command_line, input_string, run_as_uid, run_as_euid, cancellable);
   g_free (command_line);
 
+  if (object != NULL)
+    udisks_base_job_add_object (UDISKS_BASE_JOB (job), object);
+
   /* TODO: protect job_id by a mutex */
-  object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
-  object = udisks_object_skeleton_new (object_path);
-  udisks_object_skeleton_set_job (object, UDISKS_JOB (job));
-  g_free (object_path);
+  job_object_path = g_strdup_printf ("/org/freedesktop/UDisks2/jobs/%d", job_id++);
+  job_object = udisks_object_skeleton_new (job_object_path);
+  udisks_object_skeleton_set_job (job_object, UDISKS_JOB (job));
+  g_free (job_object_path);
 
-  g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (object));
+  g_dbus_object_manager_server_export (daemon->object_manager, G_DBUS_OBJECT_SKELETON (job_object));
   g_signal_connect_after (job,
                           "completed",
                           G_CALLBACK (on_job_completed),
@@ -701,6 +714,7 @@ spawned_job_sync_on_completed (UDisksJob    *job,
 /**
  * udisks_daemon_launch_spawned_job_sync:
  * @daemon: A #UDisksDaemon.
+ * @object: (allow-none): A #UDisksObject to add to the job or %NULL.
  * @cancellable: A #GCancellable or %NULL.
  * @run_as_uid: The #uid_t to run the command as.
  * @run_as_euid: The effective #uid_t to run the command as.
@@ -717,6 +731,7 @@ spawned_job_sync_on_completed (UDisksJob    *job,
  */
 gboolean
 udisks_daemon_launch_spawned_job_sync (UDisksDaemon    *daemon,
+                                       UDisksObject    *object,
                                        GCancellable    *cancellable,
                                        uid_t            run_as_uid,
                                        uid_t            run_as_euid,
@@ -746,6 +761,7 @@ udisks_daemon_launch_spawned_job_sync (UDisksDaemon    *daemon,
   command_line = g_strdup_vprintf (command_line_format, var_args);
   va_end (var_args);
   job = udisks_daemon_launch_spawned_job (daemon,
+                                          object,
                                           cancellable,
                                           run_as_uid,
                                           run_as_euid,
index 7f346ec..8cda8f0 100644 (file)
@@ -69,15 +69,18 @@ UDisksObject             *udisks_daemon_find_object           (UDisksDaemon
                                                                const gchar          *object_path);
 
 UDisksBaseJob            *udisks_daemon_launch_simple_job     (UDisksDaemon    *daemon,
+                                                               UDisksObject    *object,
                                                                GCancellable    *cancellable);
 UDisksBaseJob            *udisks_daemon_launch_spawned_job    (UDisksDaemon    *daemon,
+                                                               UDisksObject    *object,
                                                                GCancellable    *cancellable,
                                                                uid_t            run_as_uid,
                                                                uid_t            run_as_euid,
                                                                const gchar     *input_string,
                                                                const gchar     *command_line_format,
-                                                               ...) G_GNUC_PRINTF (6, 7);
+                                                               ...) G_GNUC_PRINTF (7, 8);
 gboolean                  udisks_daemon_launch_spawned_job_sync (UDisksDaemon    *daemon,
+                                                                 UDisksObject    *object,
                                                                  GCancellable    *cancellable,
                                                                  uid_t            run_as_uid,
                                                                  uid_t            run_as_euid,
@@ -85,8 +88,9 @@ gboolean                  udisks_daemon_launch_spawned_job_sync (UDisksDaemon
                                                                  gchar          **out_message,
                                                                  const gchar     *input_string,
                                                                  const gchar     *command_line_format,
-                                                                 ...) G_GNUC_PRINTF (8, 9);
+                                                                 ...) G_GNUC_PRINTF (9, 10);
 UDisksBaseJob            *udisks_daemon_launch_threaded_job   (UDisksDaemon    *daemon,
+                                                               UDisksObject    *object,
                                                                UDisksThreadedJobFunc job_func,
                                                                gpointer         user_data,
                                                                GDestroyNotify   user_data_free_func,
index 5889319..d1c6a94 100644 (file)
@@ -1804,6 +1804,7 @@ handle_format (UDisksBlock           *block,
   wait_data = g_new0 (FormatWaitData, 1);
   wait_data->object = object;
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* cancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
@@ -1840,6 +1841,7 @@ handle_format (UDisksBlock           *block,
     {
       /* Create it */
       if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                                  object,
                                                   NULL, /* cancellable */
                                                   0,    /* uid_t run_as_uid */
                                                   0,    /* uid_t run_as_euid */
@@ -1874,6 +1876,7 @@ handle_format (UDisksBlock           *block,
       /* Open it */
       mapped_name = g_strdup_printf ("luks-%s", udisks_block_get_id_uuid (block));
       if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                                  object,
                                                   NULL, /* cancellable */
                                                   0,    /* uid_t run_as_uid */
                                                   0,    /* uid_t run_as_euid */
@@ -1956,6 +1959,7 @@ handle_format (UDisksBlock           *block,
   command = subst_str (tmp, "$LABEL", escaped_label);
   g_free (tmp);
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object_to_mkfs,
                                               NULL, /* cancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
index 39645b4..d628149 100644 (file)
@@ -580,6 +580,7 @@ handle_eject (UDisksDrive           *_drive,
     goto out;
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              UDISKS_OBJECT (object),
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
index 07af74f..2887cf3 100644 (file)
@@ -933,6 +933,7 @@ handle_smart_selftest_start (UDisksDriveAta        *_drive,
     {
       drive->selftest_cancellable = g_cancellable_new ();
       drive->selftest_job = UDISKS_THREADED_JOB (udisks_daemon_launch_threaded_job (daemon,
+                                                                                    UDISKS_OBJECT (object),
                                                                                     selftest_job_func,
                                                                                     g_object_ref (drive),
                                                                                     g_object_unref,
index 066019d..c349798 100644 (file)
@@ -320,6 +320,7 @@ handle_unlock (UDisksEncrypted        *encrypted,
 
   /* TODO: support a 'readonly' option */
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
@@ -526,6 +527,7 @@ handle_lock (UDisksEncrypted        *encrypted,
     }
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
index c72203e..f4ab0ec 100644 (file)
@@ -908,6 +908,7 @@ handle_mount (UDisksFilesystem       *filesystem,
       mount_fstab_as_root = FALSE;
     mount_fstab_again:
       if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                                  object,
                                                   NULL,  /* GCancellable */
                                                   mount_fstab_as_root ? 0 : caller_uid, /* uid_t run_as_uid */
                                                   mount_fstab_as_root ? 0 : caller_uid, /* uid_t run_as_euid */
@@ -1068,6 +1069,7 @@ handle_mount (UDisksFilesystem       *filesystem,
 
   /* run mount(8) */
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
@@ -1222,6 +1224,7 @@ handle_unmount (UDisksFilesystem       *filesystem,
       escaped_mount_point = g_strescape (mount_point, NULL);
       /* right now -l is the only way to "force unmount" file systems... */
       if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                                  object,
                                                   NULL, /* GCancellable */
                                                   unmount_fstab_as_root ? 0 : caller_uid, /* uid_t run_as_uid */
                                                   unmount_fstab_as_root ? 0 : caller_uid, /* uid_t run_as_euid */
@@ -1319,6 +1322,7 @@ handle_unmount (UDisksFilesystem       *filesystem,
         }
       escaped_mount_point = g_strescape (mount_point, NULL);
       rc = udisks_daemon_launch_spawned_job_sync (daemon,
+                                                  object,
                                                   NULL, /* GCancellable */
                                                   0,    /* uid_t run_as_uid */
                                                   0,    /* uid_t run_as_euid */
@@ -1333,6 +1337,7 @@ handle_unmount (UDisksFilesystem       *filesystem,
     {
       /* mount_point == NULL */
       rc = udisks_daemon_launch_spawned_job_sync (daemon,
+                                                  object,
                                                   NULL, /* GCancellable */
                                                   0,    /* uid_t run_as_uid */
                                                   0,    /* uid_t run_as_euid */
@@ -1559,6 +1564,7 @@ handle_set_label (UDisksFilesystem       *filesystem,
     }
 
   job = udisks_daemon_launch_spawned_job (daemon,
+                                          object,
                                           NULL, /* cancellable */
                                           0,    /* uid_t run_as_uid */
                                           0,    /* uid_t run_as_euid */
index 47a74dc..33afd58 100644 (file)
@@ -233,6 +233,7 @@ handle_delete (UDisksLoop             *loop,
     }
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              NULL, /* UDisksObject */
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
index e6f535e..0b84791 100644 (file)
@@ -274,6 +274,7 @@ handle_set_flags (UDisksPartition        *partition,
   fd = open (udisks_block_get_device (block), O_RDONLY);
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
@@ -386,6 +387,7 @@ handle_set_name (UDisksPartition        *partition,
   fd = open (udisks_block_get_device (block), O_RDONLY);
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
@@ -555,6 +557,7 @@ handle_set_type (UDisksPartition        *partition,
   fd = open (udisks_block_get_device (block), O_RDONLY);
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
@@ -633,6 +636,7 @@ handle_delete (UDisksPartition        *partition,
   escaped_device = g_strescape (udisks_block_get_device (partition_table_block), NULL);
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              partition_table_object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
index 561b522..104be36 100644 (file)
@@ -461,6 +461,7 @@ handle_create_partition (UDisksPartitionTable   *table,
     }
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
@@ -510,6 +511,7 @@ handle_create_partition (UDisksPartitionTable   *table,
 
   /* wipe the newly created partition */
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
+                                              partition_object,
                                               NULL, /* GCancellable */
                                               0,    /* uid_t run_as_uid */
                                               0,    /* uid_t run_as_euid */
index 92d1524..161acdc 100644 (file)
@@ -172,6 +172,7 @@ handle_start (UDisksSwapspace        *swapspace,
     goto out;
 
   job = udisks_daemon_launch_spawned_job (daemon,
+                                          object,
                                           NULL, /* cancellable */
                                           0,    /* uid_t run_as_uid */
                                           0,    /* uid_t run_as_euid */
@@ -234,6 +235,7 @@ handle_stop (UDisksSwapspace        *swapspace,
     goto out;
 
   job = udisks_daemon_launch_spawned_job (daemon,
+                                          object,
                                           NULL, /* cancellable */
                                           0,    /* uid_t run_as_uid */
                                           0,    /* uid_t run_as_euid */
index d6d21c0..9ec88eb 100644 (file)
@@ -1415,6 +1415,61 @@ udisks_client_get_partition_table (UDisksClient     *client,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+/**
+ * udisks_client_get_jobs_for_object:
+ * @client: A #UDisksClient.
+ * @object: A #UDisksObject.
+ *
+ * Gets all the #UDisksJob instances that reference @object, if any.
+ *
+ * Returns: (transfer full) (element-type UDisksJob): A list of #UDisksJob instances. The
+ *   returned list should be freed with g_list_free() after each
+ *   element has been freed with g_object_unref().
+ */
+GList *
+udisks_client_get_jobs_for_object (UDisksClient  *client,
+                                   UDisksObject  *object)
+{
+  GList *ret = NULL;
+  const gchar *object_path;
+  GList *l, *object_proxies = NULL;
+
+  /* TODO: this is probably slow. Can optimize by maintaining a hash-table from object path to UDisksJob* */
+
+  g_return_val_if_fail (UDISKS_IS_CLIENT (client), NULL);
+  g_return_val_if_fail (UDISKS_IS_OBJECT (object), NULL);
+
+  object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (object));
+
+  object_proxies = g_dbus_object_manager_get_objects (client->object_manager);
+  for (l = object_proxies; l != NULL; l = l->next)
+    {
+      UDisksObject *object = UDISKS_OBJECT (l->data);
+      UDisksJob *job;
+
+      job = udisks_object_get_job (object);
+      if (job != NULL)
+        {
+          const gchar *const *object_paths;
+          guint n;
+          object_paths = udisks_job_get_objects (job);
+          for (n = 0; object_paths != NULL && object_paths[n] != NULL; n++)
+            {
+              if (g_strcmp0 (object_paths[n], object_path) == 0)
+                ret = g_list_prepend (ret, g_object_ref (job));
+            }
+          g_object_unref (job);
+        }
+    }
+  ret = g_list_reverse (ret);
+
+  g_list_foreach (object_proxies, (GFunc) g_object_unref, NULL);
+  g_list_free (object_proxies);
+  return ret;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 static void
 maybe_emit_changed_now (UDisksClient *client)
 {
index 8f039aa..6bc7a18 100644 (file)
@@ -69,6 +69,9 @@ UDisksPartitionTable *udisks_client_get_partition_table (UDisksClient        *cl
 GList              *udisks_client_get_partitions      (UDisksClient        *client,
                                                        UDisksPartitionTable *table);
 
+GList              *udisks_client_get_jobs_for_object (UDisksClient        *client,
+                                                       UDisksObject        *object);
+
 void                udisks_client_get_drive_info      (UDisksClient        *client,
                                                        UDisksDrive         *drive,
                                                        gchar              **out_name,