cleanup
[platform/upstream/glib.git] / gio / gdrive.c
index 5d6efdc..5d79286 100644 (file)
@@ -13,9 +13,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
  * Author: Alexander Larsson <alexl@redhat.com>
  *         David Zeuthen <davidz@redhat.com>
@@ -23,7 +21,8 @@
 
 #include "config.h"
 #include "gdrive.h"
-#include "gsimpleasyncresult.h"
+#include "gtask.h"
+#include "gthemedicon.h"
 #include "gasyncresult.h"
 #include "gioerror.h"
 #include "glibintl.h"
@@ -41,7 +40,7 @@
  * #GDrive is a container class for #GVolume objects that stem from
  * the same piece of media. As such, #GDrive abstracts a drive with
  * (or without) removable media and provides operations for querying
- * whether media is available, determing whether media change is
+ * whether media is available, determining whether media change is
  * automatically detected and ejecting the media.
  *
  * If the #GDrive reports that media isn't automatically detected, one
@@ -175,6 +174,35 @@ g_drive_get_icon (GDrive *drive)
 }
 
 /**
+ * g_drive_get_symbolic_icon:
+ * @drive: a #GDrive.
+ * 
+ * Gets the icon for @drive.
+ * 
+ * Returns: (transfer full): symbolic #GIcon for the @drive.
+ *    Free the returned object with g_object_unref().
+ *
+ * Since: 2.34
+ **/
+GIcon *
+g_drive_get_symbolic_icon (GDrive *drive)
+{
+  GDriveIface *iface;
+  GIcon *ret;
+
+  g_return_val_if_fail (G_IS_DRIVE (drive), NULL);
+
+  iface = G_DRIVE_GET_IFACE (drive);
+
+  if (iface->get_symbolic_icon != NULL)
+    ret = iface->get_symbolic_icon (drive);
+  else
+    ret = g_themed_icon_new_with_default_fallbacks ("drive-removable-media-symbolic");
+
+  return ret;
+}
+
+/**
  * g_drive_has_volumes:
  * @drive: a #GDrive.
  * 
@@ -331,8 +359,8 @@ g_drive_can_poll_for_media (GDrive *drive)
  * g_drive_eject:
  * @drive: a #GDrive.
  * @flags: flags affecting the unmount if required for eject
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback, or %NULL.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (allow-none): a #GAsyncReadyCallback, or %NULL.
  * @user_data: user data to pass to @callback
  * 
  * Asynchronously ejects a drive.
@@ -358,10 +386,10 @@ g_drive_eject (GDrive              *drive,
 
   if (iface->eject == NULL)
     {
-      g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data,
-                                          G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
-                                          _("drive doesn't implement eject"));
-      
+      g_task_report_new_error (drive, callback, user_data,
+                               g_drive_eject_with_operation,
+                               G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+                               _("drive doesn't implement eject"));
       return;
     }
   
@@ -391,13 +419,11 @@ g_drive_eject_finish (GDrive        *drive,
   g_return_val_if_fail (G_IS_DRIVE (drive), FALSE);
   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
 
-  if (G_IS_SIMPLE_ASYNC_RESULT (result))
-    {
-      GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
-      if (g_simple_async_result_propagate_error (simple, error))
-       return FALSE;
-    }
-  
+  if (g_async_result_legacy_propagate_error (result, error))
+    return FALSE;
+  else if (g_async_result_is_tagged (result, g_drive_eject_with_operation))
+    return g_task_propagate_boolean (G_TASK (result), error);
+
   iface = G_DRIVE_GET_IFACE (drive);
   
   return (* iface->eject_finish) (drive, result, error);
@@ -407,9 +433,10 @@ g_drive_eject_finish (GDrive        *drive,
  * g_drive_eject_with_operation:
  * @drive: a #GDrive.
  * @flags: flags affecting the unmount if required for eject
- * @mount_operation: a #GMountOperation or %NULL to avoid user interaction.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback, or %NULL.
+ * @mount_operation: (allow-none): a #GMountOperation or %NULL to avoid
+ *     user interaction.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (allow-none): a #GAsyncReadyCallback, or %NULL.
  * @user_data: user data passed to @callback.
  *
  * Ejects a drive. This is an asynchronous operation, and is
@@ -434,13 +461,13 @@ g_drive_eject_with_operation (GDrive              *drive,
 
   if (iface->eject == NULL && iface->eject_with_operation == NULL)
     {
-      g_simple_async_report_error_in_idle (G_OBJECT (drive),
-                                          callback, user_data,
-                                          G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
-                                          /* Translators: This is an error
-                                           * message for drive objects that
-                                           * don't implement any of eject or eject_with_operation. */
-                                          _("drive doesn't implement eject or eject_with_operation"));
+      g_task_report_new_error (drive, callback, user_data,
+                               g_drive_eject_with_operation,
+                               G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+                               /* Translators: This is an error
+                                * message for drive objects that
+                                * don't implement any of eject or eject_with_operation. */
+                               _("drive doesn't implement eject or eject_with_operation"));
       return;
     }
 
@@ -454,7 +481,7 @@ g_drive_eject_with_operation (GDrive              *drive,
  * g_drive_eject_with_operation_finish:
  * @drive: a #GDrive.
  * @result: a #GAsyncResult.
- * @error: a #GError location to store the error occuring, or %NULL to
+ * @error: a #GError location to store the error occurring, or %NULL to
  *     ignore.
  *
  * Finishes ejecting a drive. If any errors occurred during the operation,
@@ -474,12 +501,10 @@ g_drive_eject_with_operation_finish (GDrive        *drive,
   g_return_val_if_fail (G_IS_DRIVE (drive), FALSE);
   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
 
-  if (G_IS_SIMPLE_ASYNC_RESULT (result))
-    {
-      GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
-      if (g_simple_async_result_propagate_error (simple, error))
-        return FALSE;
-    }
+  if (g_async_result_legacy_propagate_error (result, error))
+    return FALSE;
+  else if (g_async_result_is_tagged (result, g_drive_eject_with_operation))
+    return g_task_propagate_boolean (G_TASK (result), error);
 
   iface = G_DRIVE_GET_IFACE (drive);
   if (iface->eject_with_operation_finish != NULL)
@@ -491,8 +516,8 @@ g_drive_eject_with_operation_finish (GDrive        *drive,
 /**
  * g_drive_poll_for_media:
  * @drive: a #GDrive.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback, or %NULL.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (allow-none): a #GAsyncReadyCallback, or %NULL.
  * @user_data: user data to pass to @callback
  * 
  * Asynchronously polls @drive to see if media has been inserted or removed.
@@ -515,10 +540,10 @@ g_drive_poll_for_media (GDrive              *drive,
 
   if (iface->poll_for_media == NULL)
     {
-      g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data,
-                                          G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
-                                          _("drive doesn't implement polling for media"));
-      
+      g_task_report_new_error (drive, callback, user_data,
+                               g_drive_poll_for_media,
+                               G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+                               _("drive doesn't implement polling for media"));
       return;
     }
   
@@ -546,13 +571,11 @@ g_drive_poll_for_media_finish (GDrive        *drive,
   g_return_val_if_fail (G_IS_DRIVE (drive), FALSE);
   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
 
-  if (G_IS_SIMPLE_ASYNC_RESULT (result))
-    {
-      GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
-      if (g_simple_async_result_propagate_error (simple, error))
-       return FALSE;
-    }
-  
+  if (g_async_result_legacy_propagate_error (result, error))
+    return FALSE;
+  else if (g_async_result_is_tagged (result, g_drive_poll_for_media))
+    return g_task_propagate_boolean (G_TASK (result), error);
+
   iface = G_DRIVE_GET_IFACE (drive);
   
   return (* iface->poll_for_media_finish) (drive, result, error);
@@ -591,11 +614,12 @@ g_drive_get_identifier (GDrive     *drive,
  * @drive: a #GDrive
  *
  * Gets the kinds of identifiers that @drive has. 
- * Use g_drive_get_identifer() to obtain the identifiers
+ * Use g_drive_get_identifier() to obtain the identifiers
  * themselves.
  *
- * Returns: (transfer full): a %NULL-terminated array of strings containing
- *     kinds of identifiers. Use g_strfreev() to free.
+ * Returns: (transfer full) (array zero-terminated=1): a %NULL-terminated
+ *     array of strings containing kinds of identifiers. Use g_strfreev()
+ *     to free.
  */
 char **
 g_drive_enumerate_identifiers (GDrive *drive)
@@ -691,9 +715,10 @@ g_drive_can_start_degraded (GDrive *drive)
  * g_drive_start:
  * @drive: a #GDrive.
  * @flags: flags affecting the start operation.
- * @mount_operation: a #GMountOperation or %NULL to avoid user interaction.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback, or %NULL.
+ * @mount_operation: (allow-none): a #GMountOperation or %NULL to avoid
+ *     user interaction.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (allow-none): a #GAsyncReadyCallback, or %NULL.
  * @user_data: user data to pass to @callback
  *
  * Asynchronously starts a drive.
@@ -720,9 +745,10 @@ g_drive_start (GDrive              *drive,
 
   if (iface->start == NULL)
     {
-      g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data,
-                                          G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
-                                          _("drive doesn't implement start"));
+      g_task_report_new_error (drive, callback, user_data,
+                               g_drive_start,
+                               G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+                               _("drive doesn't implement start"));
       return;
     }
 
@@ -752,12 +778,10 @@ g_drive_start_finish (GDrive         *drive,
   g_return_val_if_fail (G_IS_DRIVE (drive), FALSE);
   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
 
-  if (G_IS_SIMPLE_ASYNC_RESULT (result))
-    {
-      GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
-      if (g_simple_async_result_propagate_error (simple, error))
-       return FALSE;
-    }
+  if (g_async_result_legacy_propagate_error (result, error))
+    return FALSE;
+  else if (g_async_result_is_tagged (result, g_drive_start))
+    return g_task_propagate_boolean (G_TASK (result), error);
 
   iface = G_DRIVE_GET_IFACE (drive);
 
@@ -793,9 +817,10 @@ g_drive_can_stop (GDrive *drive)
  * g_drive_stop:
  * @drive: a #GDrive.
  * @flags: flags affecting the unmount if required for stopping.
- * @mount_operation: a #GMountOperation or %NULL to avoid user interaction.
- * @cancellable: optional #GCancellable object, %NULL to ignore.
- * @callback: a #GAsyncReadyCallback, or %NULL.
+ * @mount_operation: (allow-none): a #GMountOperation or %NULL to avoid
+ *     user interaction.
+ * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
+ * @callback: (allow-none): a #GAsyncReadyCallback, or %NULL.
  * @user_data: user data to pass to @callback
  *
  * Asynchronously stops a drive.
@@ -822,9 +847,10 @@ g_drive_stop (GDrive               *drive,
 
   if (iface->stop == NULL)
     {
-      g_simple_async_report_error_in_idle (G_OBJECT (drive), callback, user_data,
-                                          G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
-                                          _("drive doesn't implement stop"));
+      g_task_report_new_error (drive, callback, user_data,
+                               g_drive_start,
+                               G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+                               _("drive doesn't implement stop"));
       return;
     }
 
@@ -854,14 +880,37 @@ g_drive_stop_finish (GDrive        *drive,
   g_return_val_if_fail (G_IS_DRIVE (drive), FALSE);
   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
 
-  if (G_IS_SIMPLE_ASYNC_RESULT (result))
-    {
-      GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
-      if (g_simple_async_result_propagate_error (simple, error))
-       return FALSE;
-    }
+  if (g_async_result_legacy_propagate_error (result, error))
+    return FALSE;
+  else if (g_async_result_is_tagged (result, g_drive_start))
+    return g_task_propagate_boolean (G_TASK (result), error);
 
   iface = G_DRIVE_GET_IFACE (drive);
 
   return (* iface->stop_finish) (drive, result, error);
 }
+
+/**
+ * g_drive_get_sort_key:
+ * @drive: A #GDrive.
+ *
+ * Gets the sort key for @drive, if any.
+ *
+ * Returns: Sorting key for @drive or %NULL if no such key is available.
+ *
+ * Since: 2.32
+ */
+const gchar *
+g_drive_get_sort_key (GDrive  *drive)
+{
+  const gchar *ret = NULL;
+  GDriveIface *iface;
+
+  g_return_val_if_fail (G_IS_DRIVE (drive), NULL);
+
+  iface = G_DRIVE_GET_IFACE (drive);
+  if (iface->get_sort_key != NULL)
+    ret = iface->get_sort_key (drive);
+
+  return ret;
+}