Added GMountMountFlags enum and added a flags argument to all mount calls.
[platform/upstream/glib.git] / gio / gvolume.c
index 280f46c..642ccd1 100644 (file)
  * Boston, MA 02111-1307, USA.
  *
  * Author: Alexander Larsson <alexl@redhat.com>
+ *         David Zeuthen <davidz@redhat.com>
  */
 
 #include <config.h>
+#include "gmount.h"
 #include "gvolume.h"
-#include "gvolumeprivate.h"
 #include "gsimpleasyncresult.h"
 #include "glibintl.h"
 
+#include "gioalias.h"
+
+/**
+ * SECTION:gvolume
+ * @short_description: Volume management
+ * @include: gio.h
+ * 
+ * The #GVolume interface represents user-visible objects that can be
+ * mounted. Note, when porting from GnomeVFS, #GVolume is the moral
+ * equivalent of #GnomeVFSDrive.
+ *
+ * Mounting a #GVolume instance is an asynchronous operation. For more
+ * information about asynchronous operations, see #GAsyncReady and
+ * #GSimpleAsyncReady. To mount a #GVolume, first call
+ * g_volume_mount() with (at least) the #GVolume instance, optionally
+ * a #GMountOperation object and a #GAsyncReadyCallback. 
+ *
+ * Typically, one will only want to pass %NULL for the
+ * #GMountOperation if automounting all volumes when a desktop session
+ * starts since it's not desirable to put up a lot of dialogs asking
+ * for credentials.
+ *
+ * The callback will be fired when the operation has resolved (either
+ * with success or failure), and a #GAsyncReady structure will be
+ * passed to the callback.  That callback should then call
+ * g_volume_mount_finish() with the #GVolume instance and the
+ * #GAsyncReady data to see if the operation was completed
+ * successfully.  If an @error is present when g_volume_mount_finish()
+ * is called, then it will be filled with any error information.
+ *
+ * <para id="volume-identifier">
+ * It is sometimes necessary to directly access the underlying 
+ * operating system object behind a volume (e.g. for passing a volume
+ * to an application via the commandline). For this purpose, GIO
+ * allows to obtain an 'identifier' for the volume. There can be
+ * different kinds of identifiers, such as Hal UDIs, filesystem labels,
+ * traditional Unix devices (e.g. <filename>/dev/sda2</filename>),
+ * uuids. GIO uses predefind strings as names for the different kinds
+ * of identifiers: #G_VOLUME_IDENTIFIER_KIND_HAL_UDI, 
+ * #G_VOLUME_IDENTIFIER_KIND_LABEL, etc. Use g_volume_get_identifier() 
+ * to obtain an identifier for a volume.
+ * </para>
+ **/
+
 static void g_volume_base_init (gpointer g_class);
 static void g_volume_class_init (gpointer g_class,
-                                gpointer class_data);
+                                 gpointer class_data);
 
 GType
 g_volume_get_type (void)
@@ -62,7 +107,7 @@ g_volume_get_type (void)
 
 static void
 g_volume_class_init (gpointer g_class,
-                  gpointer class_data)
+                     gpointer class_data)
 {
 }
 
@@ -73,6 +118,11 @@ g_volume_base_init (gpointer g_class)
 
   if (! initialized)
     {
+     /**
+      * GVolume::changed:
+      * 
+      * Emitted when the volume has been changed.
+      **/
       g_signal_new (I_("changed"),
                     G_TYPE_VOLUME,
                     G_SIGNAL_RUN_LAST,
@@ -81,19 +131,36 @@ g_volume_base_init (gpointer g_class)
                     g_cclosure_marshal_VOID__VOID,
                     G_TYPE_NONE, 0);
 
+     /**
+      * GVolume::removed:
+      * 
+      * This signal is emitted when the #GVolume have been removed. If
+      * the recipient is holding references to the object they should
+      * release them so the object can be finalized.
+      **/
+      g_signal_new (I_("removed"),
+                    G_TYPE_VOLUME,
+                    G_SIGNAL_RUN_LAST,
+                    G_STRUCT_OFFSET (GVolumeIface, removed),
+                    NULL, NULL,
+                    g_cclosure_marshal_VOID__VOID,
+                    G_TYPE_NONE, 0);
+
       initialized = TRUE;
     }
 }
 
 /**
- * g_volume_get_root:
+ * g_volume_get_name:
  * @volume: a #GVolume.
  * 
- * Returns a #GFile.
+ * Gets the name of @volume.
  * 
+ * Returns: the name for the given @volume. The returned string should 
+ * be freed when no longer needed.
  **/
-GFile *
-g_volume_get_root (GVolume *volume)
+char *
+g_volume_get_name (GVolume *volume)
 {
   GVolumeIface *iface;
 
@@ -101,20 +168,19 @@ g_volume_get_root (GVolume *volume)
 
   iface = G_VOLUME_GET_IFACE (volume);
 
-  return (* iface->get_root) (volume);
+  return (* iface->get_name) (volume);
 }
 
 /**
- * g_volume_get_name:
+ * g_volume_get_icon:
  * @volume: a #GVolume.
  * 
- * Returns the name for the given @volume. 
- * 
- * The returned string should be freed when no longer needed.
+ * Gets the icon for @volume.
  * 
+ * Returns: a #GIcon.
  **/
-char *
-g_volume_get_name (GVolume *volume)
+GIcon *
+g_volume_get_icon (GVolume *volume)
 {
   GVolumeIface *iface;
 
@@ -122,18 +188,22 @@ g_volume_get_name (GVolume *volume)
 
   iface = G_VOLUME_GET_IFACE (volume);
 
-  return (* iface->get_name) (volume);
+  return (* iface->get_icon) (volume);
 }
 
 /**
- * g_volume_get_icon:
- * @volume:
+ * g_volume_get_uuid:
+ * @volume: a #GVolume.
  * 
- * Returns the #GIcon for the given @volume.
+ * Gets the UUID for the @volume. The reference is typically based on
+ * the file system UUID for the volume in question and should be
+ * considered an opaque string. Returns %NULL if there is no UUID
+ * available.
  * 
+ * Returns: the UUID for @volume or %NULL if no UUID can be computed.
  **/
-GIcon *
-g_volume_get_icon (GVolume *volume)
+char *
+g_volume_get_uuid (GVolume *volume)
 {
   GVolumeIface *iface;
 
@@ -141,15 +211,16 @@ g_volume_get_icon (GVolume *volume)
 
   iface = G_VOLUME_GET_IFACE (volume);
 
-  return (* iface->get_icon) (volume);
+  return (* iface->get_uuid) (volume);
 }
   
 /**
  * g_volume_get_drive:
- * @volume:
+ * @volume: a #GVolume.
  * 
- * Returns the #GDrive for the given @volume.
+ * Gets the drive for the @volume.
  * 
+ * Returns: a #GDrive or %NULL if @volume is not associated with a drive.
  **/
 GDrive *
 g_volume_get_drive (GVolume *volume)
@@ -164,13 +235,36 @@ g_volume_get_drive (GVolume *volume)
 }
 
 /**
- * g_volume_can_unmount: 
- * @volume:
+ * g_volume_get_mount:
+ * @volume: a #GVolume.
+ * 
+ * Gets the mount for the @volume.
+ * 
+ * Returns: a #GMount or %NULL if @volume isn't mounted.
+ **/
+GMount *
+g_volume_get_mount (GVolume *volume)
+{
+  GVolumeIface *iface;
+
+  g_return_val_if_fail (G_IS_VOLUME (volume), NULL);
+
+  iface = G_VOLUME_GET_IFACE (volume);
+
+  return (* iface->get_mount) (volume);
+}
+
+
+/**
+ * g_volume_can_mount:
+ * @volume: a #GVolume.
+ * 
+ * Checks if a volume can be mounted.
  * 
- * Returns %TRUE if the @volume can be unmounted.
+ * Returns: %TRUE if the @volume can be mounted. %FALSE otherwise.
  **/
 gboolean
-g_volume_can_unmount (GVolume *volume)
+g_volume_can_mount (GVolume *volume)
 {
   GVolumeIface *iface;
 
@@ -178,15 +272,19 @@ g_volume_can_unmount (GVolume *volume)
 
   iface = G_VOLUME_GET_IFACE (volume);
 
-  return (* iface->can_unmount) (volume);
+  if (iface->can_mount == NULL)
+    return FALSE;
+
+  return (* iface->can_mount) (volume);
 }
 
 /**
  * g_volume_can_eject:
- * @volume:
+ * @volume: a #GVolume.
  * 
- * Returns %TRUE if the @volume can be ejected.
+ * Checks if a volume can be ejected.
  * 
+ * Returns: %TRUE if the @volume can be ejected. %FALSE otherwise.
  **/
 gboolean
 g_volume_can_eject (GVolume *volume)
@@ -197,55 +295,87 @@ g_volume_can_eject (GVolume *volume)
 
   iface = G_VOLUME_GET_IFACE (volume);
 
+  if (iface->can_eject == NULL)
+    return FALSE;
+
   return (* iface->can_eject) (volume);
 }
 
 /**
- * g_volume_unmount:
- * @volume:
- * @callback:
- * @user_data:
+ * g_volume_should_automount:
+ * @volume: a #GVolume
+ *
+ * Returns whether the volume should be automatically mounted.
  * 
+ * Returns: %TRUE if the volume should be automatically mounted.
+ */
+gboolean
+g_volume_should_automount (GVolume *volume)
+{
+  GVolumeIface *iface;
+
+  g_return_val_if_fail (G_IS_VOLUME (volume), FALSE);
+
+  iface = G_VOLUME_GET_IFACE (volume);
+
+  if (iface->should_automount == NULL)
+    return FALSE;
+
+  return (* iface->should_automount) (volume);
+}
+
+
+/**
+ * g_volume_mount:
+ * @volume: a #GVolume.
+ * @flags: flags affecting the operation
+ * @mount_operation: a #GMountOperation or %NULL to avoid user interaction.
+ * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @callback: a #GAsyncReadyCallback, or %NULL.
+ * @user_data: a #gpointer.
  * 
+ * Mounts a volume.
  **/
 void
-g_volume_unmount (GVolume *volume,
-                 GCancellable *cancellable,
-                 GAsyncReadyCallback callback,
-                 gpointer user_data)
+g_volume_mount (GVolume    *volume,
+               GMountMountFlags     flags,
+                GMountOperation     *mount_operation,
+                GCancellable        *cancellable,
+                GAsyncReadyCallback  callback,
+                gpointer             user_data)
 {
   GVolumeIface *iface;
 
   g_return_if_fail (G_IS_VOLUME (volume));
-  
+
   iface = G_VOLUME_GET_IFACE (volume);
 
-  if (iface->unmount == NULL)
+  if (iface->mount_fn == NULL)
     {
-      g_simple_async_report_error_in_idle (G_OBJECT (volume),
-                                          callback, user_data,
+      g_simple_async_report_error_in_idle (G_OBJECT (volume), callback, user_data,
                                           G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
-                                          _("volume doesn't implement unmount"));
+                                          _("volume doesn't implement mount"));
       
       return;
     }
   
-  (* iface->unmount) (volume, cancellable, callback, user_data);
+  (* iface->mount_fn) (volume, flags, mount_operation, cancellable, callback, user_data);
 }
 
 /**
- * g_volume_unmount_finish:
- * @volume:
- * @result:
- * @error: a #GError location to store the error occuring, or %NULL to 
- * ignore.
- * Return:
+ * g_volume_mount_finish:
+ * @volume: pointer to a #GVolume.
+ * @result: a #GAsyncResult.
+ * @error: a #GError.
+ * 
+ * Finishes mounting a volume.
  * 
+ * Returns: %TRUE, %FALSE if operation failed.
  **/
 gboolean
-g_volume_unmount_finish (GVolume              *volume,
-                        GAsyncResult         *result,
-                        GError              **error)
+g_volume_mount_finish (GVolume  *volume,
+                       GAsyncResult      *result,
+                       GError           **error)
 {
   GVolumeIface *iface;
 
@@ -260,21 +390,25 @@ g_volume_unmount_finish (GVolume              *volume,
     }
   
   iface = G_VOLUME_GET_IFACE (volume);
-  return (* iface->unmount_finish) (volume, result, error);
+  return (* iface->mount_finish) (volume, result, error);
 }
 
 /**
  * g_volume_eject:
- * @volume:
- * @callback:
- * @user_data:
+ * @volume: a #GVolume.
+ * @flags: flags affecting the unmount if required for eject
+ * @cancellable: optional #GCancellable object, %NULL to ignore.
+ * @callback: a #GAsyncReadyCallback, or %NULL.
+ * @user_data: a #gpointer.
  * 
+ * Ejects a volume.
  **/
 void
-g_volume_eject (GVolume         *volume,
-               GCancellable *cancellable,
-               GAsyncReadyCallback  callback,
-               gpointer         user_data)
+g_volume_eject (GVolume    *volume,
+               GMountUnmountFlags   flags,
+                GCancellable        *cancellable,
+                GAsyncReadyCallback  callback,
+                gpointer             user_data)
 {
   GVolumeIface *iface;
 
@@ -284,30 +418,30 @@ g_volume_eject (GVolume         *volume,
 
   if (iface->eject == NULL)
     {
-      g_simple_async_report_error_in_idle (G_OBJECT (volume),
-                                          callback, user_data,
+      g_simple_async_report_error_in_idle (G_OBJECT (volume), callback, user_data,
                                           G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
                                           _("volume doesn't implement eject"));
       
       return;
     }
   
-  (* iface->eject) (volume, cancellable, callback, user_data);
+  (* iface->eject) (volume, flags, cancellable, callback, user_data);
 }
 
 /**
  * g_volume_eject_finish:
- * @volume:
- * @result:
- * @error: a #GError location to store the error occuring, or %NULL to 
- * ignore.
- * Returns: 
+ * @volume: pointer to a #GVolume.
+ * @result: a #GAsyncResult.
+ * @error: a #GError.
+ * 
+ * Finishes ejecting a volume.
  * 
+ * Returns: %TRUE, %FALSE if operation failed.
  **/
 gboolean
-g_volume_eject_finish (GVolume              *volume,
-                      GAsyncResult         *result,
-                      GError              **error)
+g_volume_eject_finish (GVolume  *volume,
+                       GAsyncResult      *result,
+                       GError           **error)
 {
   GVolumeIface *iface;
 
@@ -324,3 +458,62 @@ g_volume_eject_finish (GVolume              *volume,
   iface = G_VOLUME_GET_IFACE (volume);
   return (* iface->eject_finish) (volume, result, error);
 }
+
+/**
+ * g_volume_get_identifier:
+ * @volume: a #GVolume
+ * @kind: the kind of identifier to return
+ *
+ * Gets the identifier of the given kind for @volume. 
+ * See the <link linkend="volume-identifier">introduction</link>
+ * for more information about volume identifiers.
+ *
+ * Returns: a newly allocated string containing the
+ *   requested identfier, or %NULL if the #GVolume
+ *   doesn't have this kind of identifier
+ */
+char *
+g_volume_get_identifier (GVolume    *volume,
+                        const char *kind)
+{
+  GVolumeIface *iface;
+
+  g_return_val_if_fail (G_IS_VOLUME (volume), NULL);
+  g_return_val_if_fail (kind != NULL, NULL);
+
+  iface = G_VOLUME_GET_IFACE (volume);
+
+  if (iface->get_identifier == NULL)
+    return NULL;
+  
+  return (* iface->get_identifier) (volume, kind);
+}
+
+/**
+ * g_volume_enumerate_identifiers:
+ * @volume: a #GVolume
+ * 
+ * Gets the kinds of <link linkend="volume-identifier">identifiers</link>
+ * that @volume has. Use g_volume_get_identifer() to obtain 
+ * the identifiers themselves.
+ *
+ * Returns: a %NULL-terminated array of strings containing
+ *   kinds of identifiers. Use g_strfreev() to free.
+ */
+char **
+g_volume_enumerate_identifiers (GVolume *volume)
+{
+  GVolumeIface *iface;
+
+  g_return_val_if_fail (G_IS_VOLUME (volume), NULL);
+  iface = G_VOLUME_GET_IFACE (volume);
+
+  if (iface->enumerate_identifiers == NULL)
+    return NULL;
+  
+  return (* iface->enumerate_identifiers) (volume);
+}
+
+
+#define __G_VOLUME_C__
+#include "gioaliasdef.c"