cleanup
[platform/upstream/glib.git] / gio / gvolumemonitor.c
index 0d45b7b..441afc6 100644 (file)
@@ -1,3 +1,5 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
 /* GIO - GLib Input, Output and Streaming Library
  * 
  * Copyright (C) 2006-2007 Red Hat, Inc.
  * 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>
  */
 
-#include <config.h>
+#include "config.h"
 #include "gvolumemonitor.h"
+#include "gvolume.h"
+#include "gmount.h"
+#include "gdrive.h"
 #include "glibintl.h"
 
-#include "gioalias.h"
 
 /**
  * SECTION:gvolumemonitor
  * @short_description: Volume Monitor
- * @see_also: #GDirectoryMonitor, #GFileMonitor
+ * @include: gio/gio.h
+ * @see_also: #GFileMonitor
  * 
- * Monitors a mounted volume for changes.
+ * #GVolumeMonitor is for listing the user interesting devices and volumes
+ * on the computer. In other words, what a file selector or file manager
+ * would show in a sidebar. 
  *
+ * #GVolumeMonitor is not
+ * [thread-default-context aware][g-main-context-push-thread-default],
+ * and so should not be used other than from the main thread, with no
+ * thread-default-context active.
  **/
 
 G_DEFINE_TYPE (GVolumeMonitor, g_volume_monitor, G_TYPE_OBJECT);
 
 enum {
-  VOLUME_MOUNTED,
-  VOLUME_PRE_UNMOUNT,
-  VOLUME_UNMOUNTED,
+  VOLUME_ADDED,
+  VOLUME_REMOVED,
+  VOLUME_CHANGED,
+  MOUNT_ADDED,
+  MOUNT_REMOVED,
+  MOUNT_PRE_UNMOUNT,
+  MOUNT_CHANGED,
   DRIVE_CONNECTED,
   DRIVE_DISCONNECTED,
+  DRIVE_CHANGED,
+  DRIVE_EJECT_BUTTON,
+  DRIVE_STOP_BUTTON,
   LAST_SIGNAL
 };
 
@@ -52,12 +69,7 @@ static guint signals[LAST_SIGNAL] = { 0 };
 static void
 g_volume_monitor_finalize (GObject *object)
 {
-  GVolumeMonitor *monitor;
-
-  monitor = G_VOLUME_MONITOR (object);
-
-  if (G_OBJECT_CLASS (g_volume_monitor_parent_class)->finalize)
-    (*G_OBJECT_CLASS (g_volume_monitor_parent_class)->finalize) (object);
+  G_OBJECT_CLASS (g_volume_monitor_parent_class)->finalize (object);
 }
 
 static void
@@ -68,47 +80,110 @@ g_volume_monitor_class_init (GVolumeMonitorClass *klass)
   gobject_class->finalize = g_volume_monitor_finalize;
 
   /**
-   * GVolumeMonitor::volume-mounted:   
+   * GVolumeMonitor::volume-added:
    * @volume_monitor: The volume monitor emitting the signal.
-   * @volume: the volume that was mounted.
-   *
-   * Emitted when a volume is mounted.
+   * @volume: a #GVolume that was added.
+   * 
+   * Emitted when a mountable volume is added to the system.
    **/
-  signals[VOLUME_MOUNTED] = g_signal_new (I_("volume_mounted"),
-                                         G_TYPE_VOLUME_MONITOR,
-                                         G_SIGNAL_RUN_LAST,
-                                         G_STRUCT_OFFSET (GVolumeMonitorClass, volume_mounted),
-                                         NULL, NULL,
-                                         g_cclosure_marshal_VOID__OBJECT,
-                                         G_TYPE_NONE, 1, G_TYPE_VOLUME);
+  signals[VOLUME_ADDED] = g_signal_new (I_("volume-added"),
+                                        G_TYPE_VOLUME_MONITOR,
+                                        G_SIGNAL_RUN_LAST,
+                                        G_STRUCT_OFFSET (GVolumeMonitorClass, volume_added),
+                                        NULL, NULL,
+                                        g_cclosure_marshal_VOID__OBJECT,
+                                        G_TYPE_NONE, 1, G_TYPE_VOLUME);
+  
   /**
-   * GVolumeMonitor::volume-pre-unmount:
+   * GVolumeMonitor::volume-removed:
    * @volume_monitor: The volume monitor emitting the signal.
-   * @volume: the volume that is being unmounted.
-   *
-   * Emitted when a volume is about to be unmounted.
-   **/ 
-  signals[VOLUME_PRE_UNMOUNT] = g_signal_new (I_("volume_pre_unmount"),
-                                             G_TYPE_VOLUME_MONITOR,
-                                             G_SIGNAL_RUN_LAST,
-                                             G_STRUCT_OFFSET (GVolumeMonitorClass, volume_pre_unmount),
-                                             NULL, NULL,
-                                             g_cclosure_marshal_VOID__OBJECT,
-                                             G_TYPE_NONE, 1, G_TYPE_VOLUME);
+   * @volume: a #GVolume that was removed.
+   * 
+   * Emitted when a mountable volume is removed from the system.
+   **/  
+  signals[VOLUME_REMOVED] = g_signal_new (I_("volume-removed"),
+                                          G_TYPE_VOLUME_MONITOR,
+                                          G_SIGNAL_RUN_LAST,
+                                          G_STRUCT_OFFSET (GVolumeMonitorClass, volume_removed),
+                                          NULL, NULL,
+                                          g_cclosure_marshal_VOID__OBJECT,
+                                          G_TYPE_NONE, 1, G_TYPE_VOLUME);
+  
   /**
-   * GVolumeMonitor::volume-unmounted:
+   * GVolumeMonitor::volume-changed:
    * @volume_monitor: The volume monitor emitting the signal.
-   * @volume: the volume that was unmounted.
+   * @volume: a #GVolume that changed.
    * 
-   * Emitted when a volume is unmounted.
+   * Emitted when mountable volume is changed.
    **/  
-  signals[VOLUME_UNMOUNTED] = g_signal_new (I_("volume_unmounted"),
-                                           G_TYPE_VOLUME_MONITOR,
-                                           G_SIGNAL_RUN_LAST,
-                                           G_STRUCT_OFFSET (GVolumeMonitorClass, volume_unmounted),
-                                           NULL, NULL,
-                                           g_cclosure_marshal_VOID__OBJECT,
-                                           G_TYPE_NONE, 1, G_TYPE_VOLUME);
+  signals[VOLUME_CHANGED] = g_signal_new (I_("volume-changed"),
+                                          G_TYPE_VOLUME_MONITOR,
+                                          G_SIGNAL_RUN_LAST,
+                                          G_STRUCT_OFFSET (GVolumeMonitorClass, volume_changed),
+                                          NULL, NULL,
+                                          g_cclosure_marshal_VOID__OBJECT,
+                                          G_TYPE_NONE, 1, G_TYPE_VOLUME);
+
+  /**
+   * GVolumeMonitor::mount-added:
+   * @volume_monitor: The volume monitor emitting the signal.
+   * @mount: a #GMount that was added.
+   * 
+   * Emitted when a mount is added.
+   **/
+  signals[MOUNT_ADDED] = g_signal_new (I_("mount-added"),
+                                       G_TYPE_VOLUME_MONITOR,
+                                       G_SIGNAL_RUN_LAST,
+                                       G_STRUCT_OFFSET (GVolumeMonitorClass, mount_added),
+                                       NULL, NULL,
+                                       g_cclosure_marshal_VOID__OBJECT,
+                                       G_TYPE_NONE, 1, G_TYPE_MOUNT);
+
+  /**
+   * GVolumeMonitor::mount-removed:
+   * @volume_monitor: The volume monitor emitting the signal.
+   * @mount: a #GMount that was removed.
+   * 
+   * Emitted when a mount is removed.
+   **/
+  signals[MOUNT_REMOVED] = g_signal_new (I_("mount-removed"),
+                                         G_TYPE_VOLUME_MONITOR,
+                                         G_SIGNAL_RUN_LAST,
+                                         G_STRUCT_OFFSET (GVolumeMonitorClass, mount_removed),
+                                         NULL, NULL,
+                                         g_cclosure_marshal_VOID__OBJECT,
+                                         G_TYPE_NONE, 1, G_TYPE_MOUNT);
+
+  /**
+   * GVolumeMonitor::mount-pre-unmount:
+   * @volume_monitor: The volume monitor emitting the signal.
+   * @mount: a #GMount that is being unmounted.
+   *
+   * Emitted when a mount is about to be removed.
+   **/ 
+  signals[MOUNT_PRE_UNMOUNT] = g_signal_new (I_("mount-pre-unmount"),
+                                             G_TYPE_VOLUME_MONITOR,
+                                             G_SIGNAL_RUN_LAST,
+                                             G_STRUCT_OFFSET (GVolumeMonitorClass, mount_pre_unmount),
+                                             NULL, NULL,
+                                             g_cclosure_marshal_VOID__OBJECT,
+                                             G_TYPE_NONE, 1, G_TYPE_MOUNT);
+
+  /**
+   * GVolumeMonitor::mount-changed:
+   * @volume_monitor: The volume monitor emitting the signal.
+   * @mount: a #GMount that changed.
+   *
+   * Emitted when a mount changes.
+   **/ 
+  signals[MOUNT_CHANGED] = g_signal_new (I_("mount-changed"),
+                                         G_TYPE_VOLUME_MONITOR,
+                                         G_SIGNAL_RUN_LAST,
+                                         G_STRUCT_OFFSET (GVolumeMonitorClass, mount_changed),
+                                         NULL, NULL,
+                                         g_cclosure_marshal_VOID__OBJECT,
+                                         G_TYPE_NONE, 1, G_TYPE_MOUNT);
+
   /**
    * GVolumeMonitor::drive-connected:
    * @volume_monitor: The volume monitor emitting the signal.
@@ -116,7 +191,7 @@ g_volume_monitor_class_init (GVolumeMonitorClass *klass)
    * 
    * Emitted when a drive is connected to the system.
    **/
-  signals[DRIVE_CONNECTED] = g_signal_new (I_("drive_connected"),
+  signals[DRIVE_CONNECTED] = g_signal_new (I_("drive-connected"),
                                           G_TYPE_VOLUME_MONITOR,
                                           G_SIGNAL_RUN_LAST,
                                           G_STRUCT_OFFSET (GVolumeMonitorClass, drive_connected),
@@ -131,13 +206,63 @@ g_volume_monitor_class_init (GVolumeMonitorClass *klass)
    * 
    * Emitted when a drive is disconnected from the system.
    **/  
-  signals[DRIVE_DISCONNECTED] = g_signal_new (I_("drive_disconnected"),
+  signals[DRIVE_DISCONNECTED] = g_signal_new (I_("drive-disconnected"),
                                              G_TYPE_VOLUME_MONITOR,
                                              G_SIGNAL_RUN_LAST,
                                              G_STRUCT_OFFSET (GVolumeMonitorClass, drive_disconnected),
                                              NULL, NULL,
                                              g_cclosure_marshal_VOID__OBJECT,
                                              G_TYPE_NONE, 1, G_TYPE_DRIVE);
+
+  /**
+   * GVolumeMonitor::drive-changed:
+   * @volume_monitor: The volume monitor emitting the signal.
+   * @drive: the drive that changed
+   *
+   * Emitted when a drive changes.
+   **/ 
+  signals[DRIVE_CHANGED] = g_signal_new (I_("drive-changed"),
+                                         G_TYPE_VOLUME_MONITOR,
+                                         G_SIGNAL_RUN_LAST,
+                                         G_STRUCT_OFFSET (GVolumeMonitorClass, drive_changed),
+                                         NULL, NULL,
+                                         g_cclosure_marshal_VOID__OBJECT,
+                                         G_TYPE_NONE, 1, G_TYPE_DRIVE);
+
+  /**
+   * GVolumeMonitor::drive-eject-button:
+   * @volume_monitor: The volume monitor emitting the signal.
+   * @drive: the drive where the eject button was pressed
+   *
+   * Emitted when the eject button is pressed on @drive.
+   *
+   * Since: 2.18
+   **/
+  signals[DRIVE_EJECT_BUTTON] = g_signal_new (I_("drive-eject-button"),
+                                              G_TYPE_VOLUME_MONITOR,
+                                              G_SIGNAL_RUN_LAST,
+                                              G_STRUCT_OFFSET (GVolumeMonitorClass, drive_eject_button),
+                                              NULL, NULL,
+                                              g_cclosure_marshal_VOID__OBJECT,
+                                              G_TYPE_NONE, 1, G_TYPE_DRIVE);
+
+  /**
+   * GVolumeMonitor::drive-stop-button:
+   * @volume_monitor: The volume monitor emitting the signal.
+   * @drive: the drive where the stop button was pressed
+   *
+   * Emitted when the stop button is pressed on @drive.
+   *
+   * Since: 2.22
+   **/
+  signals[DRIVE_STOP_BUTTON] = g_signal_new (I_("drive-stop-button"),
+                                             G_TYPE_VOLUME_MONITOR,
+                                             G_SIGNAL_RUN_LAST,
+                                             G_STRUCT_OFFSET (GVolumeMonitorClass, drive_stop_button),
+                                             NULL, NULL,
+                                             g_cclosure_marshal_VOID__OBJECT,
+                                             G_TYPE_NONE, 1, G_TYPE_DRIVE);
+
 }
 
 static void
@@ -145,16 +270,20 @@ g_volume_monitor_init (GVolumeMonitor *monitor)
 {
 }
 
+
 /**
- * g_volume_monitor_get_mounted_volumes:
+ * g_volume_monitor_get_connected_drives:
  * @volume_monitor: a #GVolumeMonitor.
  * 
- * Gets a list of volumes mounted on the computer.
+ * Gets a list of drives connected to the system.
  * 
- * Returns: a #GList of mounted #GVolumes.
+ * The returned list should be freed with g_list_free(), after
+ * its elements have been unreffed with g_object_unref().
+ *
+ * Returns: (element-type GDrive) (transfer full): a #GList of connected #GDrive objects.
  **/
 GList *
-g_volume_monitor_get_mounted_volumes  (GVolumeMonitor *volume_monitor)
+g_volume_monitor_get_connected_drives (GVolumeMonitor *volume_monitor)
 {
   GVolumeMonitorClass *class;
 
@@ -162,19 +291,22 @@ g_volume_monitor_get_mounted_volumes  (GVolumeMonitor *volume_monitor)
 
   class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor);
 
-  return class->get_mounted_volumes (volume_monitor);
+  return class->get_connected_drives (volume_monitor);
 }
 
 /**
- * g_volume_monitor_get_connected_drives:
+ * g_volume_monitor_get_volumes:
  * @volume_monitor: a #GVolumeMonitor.
  * 
- * Gets a list of drives connected to the computer.
+ * Gets a list of the volumes on the system.
  * 
- * Returns: a #GList of connected #GDrives. 
+ * The returned list should be freed with g_list_free(), after
+ * its elements have been unreffed with g_object_unref().
+ *
+ * Returns: (element-type GVolume) (transfer full): a #GList of #GVolume objects.
  **/
 GList *
-g_volume_monitor_get_connected_drives (GVolumeMonitor *volume_monitor)
+g_volume_monitor_get_volumes (GVolumeMonitor *volume_monitor)
 {
   GVolumeMonitorClass *class;
 
@@ -182,8 +314,76 @@ g_volume_monitor_get_connected_drives (GVolumeMonitor *volume_monitor)
 
   class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor);
 
-  return class->get_connected_drives (volume_monitor);
+  return class->get_volumes (volume_monitor);
 }
 
-#define __G_VOLUME_MONITOR_C__
-#include "gioaliasdef.c"
+/**
+ * g_volume_monitor_get_mounts:
+ * @volume_monitor: a #GVolumeMonitor.
+ * 
+ * Gets a list of the mounts on the system.
+ *
+ * The returned list should be freed with g_list_free(), after
+ * its elements have been unreffed with g_object_unref().
+ * 
+ * Returns: (element-type GMount) (transfer full): a #GList of #GMount objects.
+ **/
+GList *
+g_volume_monitor_get_mounts (GVolumeMonitor *volume_monitor)
+{
+  GVolumeMonitorClass *class;
+
+  g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL);
+
+  class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor);
+
+  return class->get_mounts (volume_monitor);
+}
+
+/**
+ * g_volume_monitor_get_volume_for_uuid:
+ * @volume_monitor: a #GVolumeMonitor.
+ * @uuid: the UUID to look for
+ * 
+ * Finds a #GVolume object by its UUID (see g_volume_get_uuid())
+ * 
+ * Returns: (transfer full): a #GVolume or %NULL if no such volume is available.
+ *     Free the returned object with g_object_unref().
+ **/
+GVolume *
+g_volume_monitor_get_volume_for_uuid (GVolumeMonitor *volume_monitor, 
+                                      const char     *uuid)
+{
+  GVolumeMonitorClass *class;
+
+  g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL);
+  g_return_val_if_fail (uuid != NULL, NULL);
+
+  class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor);
+
+  return class->get_volume_for_uuid (volume_monitor, uuid);
+}
+
+/**
+ * g_volume_monitor_get_mount_for_uuid:
+ * @volume_monitor: a #GVolumeMonitor.
+ * @uuid: the UUID to look for
+ * 
+ * Finds a #GMount object by its UUID (see g_mount_get_uuid())
+ * 
+ * Returns: (transfer full): a #GMount or %NULL if no such mount is available.
+ *     Free the returned object with g_object_unref().
+ **/
+GMount *
+g_volume_monitor_get_mount_for_uuid (GVolumeMonitor *volume_monitor, 
+                                     const char     *uuid)
+{
+  GVolumeMonitorClass *class;
+
+  g_return_val_if_fail (G_IS_VOLUME_MONITOR (volume_monitor), NULL);
+  g_return_val_if_fail (uuid != NULL, NULL);
+
+  class = G_VOLUME_MONITOR_GET_CLASS (volume_monitor);
+
+  return class->get_mount_for_uuid (volume_monitor, uuid);
+}