[gvfs/wip/udisks2] udisks2: (partially) implement guess_content_type() methods



commit d10afcce3ca1f90e860eae8c8ab64a32daef8d0f
Author: David Zeuthen <davidz redhat com>
Date:   Wed Sep 28 16:48:02 2011 -0400

    udisks2: (partially) implement guess_content_type() methods
    
    Signed-off-by: David Zeuthen <davidz redhat com>

 monitor/udisks2/gvfsudisks2mount.c         |  103 +++++++++++++++++++++++++++-
 monitor/udisks2/gvfsudisks2volumemonitor.c |   12 +++
 monitor/udisks2/gvfsudisks2volumemonitor.h |    2 +
 3 files changed, 115 insertions(+), 2 deletions(-)
---
diff --git a/monitor/udisks2/gvfsudisks2mount.c b/monitor/udisks2/gvfsudisks2mount.c
index 728b158..81f7682 100644
--- a/monitor/udisks2/gvfsudisks2mount.c
+++ b/monitor/udisks2/gvfsudisks2mount.c
@@ -950,6 +950,107 @@ gvfs_udisks2_mount_eject_finish (GMount        *mount,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+/* TODO: handle force_rescan */
+static gchar **
+gvfs_udisks2_mount_guess_content_type_sync (GMount        *_mount,
+                                            gboolean       force_rescan,
+                                            GCancellable  *cancellable,
+                                            GError       **error)
+{
+  GVfsUDisks2Mount *mount = GVFS_UDISKS2_MOUNT (_mount);
+  gchar **x_content_types;
+  GPtrArray *p;
+  gchar **ret;
+  guint n;
+
+  p = g_ptr_array_new ();
+
+#if 0
+  // TODO: handle blank discs
+  /* doesn't make sense to probe blank discs - look at the disc type instead */
+  if (device != NULL && gdu_device_optical_disc_get_is_blank (device))
+    {
+      disc_type = gdu_device_drive_get_media (device);
+      if (disc_type != NULL)
+        {
+          if (g_str_has_prefix (disc_type, "optical_dvd"))
+            g_ptr_array_add (p, g_strdup ("x-content/blank-dvd"));
+          else if (g_str_has_prefix (disc_type, "optical_hddvd"))
+            g_ptr_array_add (p, g_strdup ("x-content/blank-hddvd"));
+          else if (g_str_has_prefix (disc_type, "optical_bd"))
+            g_ptr_array_add (p, g_strdup ("x-content/blank-bd"));
+          else
+            g_ptr_array_add (p, g_strdup ("x-content/blank-cd")); /* assume CD */
+        }
+    }
+  else
+#endif
+    {
+      /* sniff content type */
+      x_content_types = g_content_type_guess_for_tree (mount->root);
+      if (x_content_types != NULL)
+        {
+          for (n = 0; x_content_types[n] != NULL; n++)
+            g_ptr_array_add (p, g_strdup (x_content_types[n]));
+          g_strfreev (x_content_types);
+        }
+    }
+
+  /* Check if its bootable */
+  if (mount->device_file != NULL)
+    {
+      GUdevDevice *gudev_device;
+      gudev_device = g_udev_client_query_by_device_file (gvfs_udisks2_volume_monitor_get_gudev_client (mount->monitor),
+                                                         mount->device_file);
+      if (gudev_device != NULL)
+        {
+          if (g_udev_device_get_property_as_boolean (gudev_device, "OSINFO_BOOTABLE"))
+            g_ptr_array_add (p, g_strdup ("x-content/bootable-media"));
+          g_object_unref (gudev_device);
+        }
+    }
+
+  if (p->len == 0)
+    {
+      ret = NULL;
+      g_ptr_array_free (p, TRUE);
+    }
+  else
+    {
+      g_ptr_array_add (p, NULL);
+      ret = (char **) g_ptr_array_free (p, FALSE);
+    }
+  return ret;
+}
+
+/* since we're an out-of-process volume monitor we'll just do this sync */
+static void
+gvfs_udisks2_mount_guess_content_type (GMount              *mount,
+                                       gboolean             force_rescan,
+                                       GCancellable        *cancellable,
+                                       GAsyncReadyCallback  callback,
+                                       gpointer             user_data)
+{
+  GSimpleAsyncResult *simple;
+  /* TODO: handle force_rescan */
+  simple = g_simple_async_result_new (G_OBJECT (mount),
+                                      callback,
+                                      user_data,
+                                      NULL);
+  g_simple_async_result_complete (simple);
+  g_object_unref (simple);
+}
+
+static gchar **
+gvfs_udisks2_mount_guess_content_type_finish (GMount        *mount,
+                                              GAsyncResult  *result,
+                                              GError       **error)
+{
+  return gvfs_udisks2_mount_guess_content_type_sync (mount, FALSE, NULL, error);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 static void
 gvfs_udisks2_mount_mount_iface_init (GMountIface *iface)
 {
@@ -969,11 +1070,9 @@ gvfs_udisks2_mount_mount_iface_init (GMountIface *iface)
   iface->eject_finish = gvfs_udisks2_mount_eject_finish;
   iface->eject_with_operation = gvfs_udisks2_mount_eject_with_operation;
   iface->eject_with_operation_finish = gvfs_udisks2_mount_eject_with_operation_finish;
-#if 0
   iface->guess_content_type = gvfs_udisks2_mount_guess_content_type;
   iface->guess_content_type_finish = gvfs_udisks2_mount_guess_content_type_finish;
   iface->guess_content_type_sync = gvfs_udisks2_mount_guess_content_type_sync;
-#endif
 }
 
 gboolean
diff --git a/monitor/udisks2/gvfsudisks2volumemonitor.c b/monitor/udisks2/gvfsudisks2volumemonitor.c
index 4c2df40..58c4a29 100644
--- a/monitor/udisks2/gvfsudisks2volumemonitor.c
+++ b/monitor/udisks2/gvfsudisks2volumemonitor.c
@@ -54,6 +54,7 @@ struct _GVfsUDisks2VolumeMonitor
   GNativeVolumeMonitor parent;
 
   UDisksClient *client;
+  GUdevClient *gudev_client;
 
   GList *last_mounts;
 
@@ -146,6 +147,7 @@ gvfs_udisks2_volume_monitor_finalize (GObject *object)
                                         monitor);
 
   g_clear_object (&monitor->client);
+  g_clear_object (&monitor->gudev_client);
 
   g_list_foreach (monitor->last_mounts, (GFunc) g_unix_mount_free, NULL);
   g_list_free (monitor->last_mounts);
@@ -320,6 +322,7 @@ gvfs_udisks2_volume_monitor_init (GVfsUDisks2VolumeMonitor *monitor)
   GDBusObjectManager *object_manager;
 
   monitor->client = get_udisks_client_sync (NULL);
+  monitor->gudev_client = g_udev_client_new (NULL); /* don't listen to any changes */
 
   object_manager = udisks_client_get_object_manager (monitor->client);
   g_signal_connect (object_manager,
@@ -397,6 +400,15 @@ gvfs_udisks2_volume_monitor_get_udisks_client (GVfsUDisks2VolumeMonitor *monitor
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+GUdevClient *
+gvfs_udisks2_volume_monitor_get_gudev_client (GVfsUDisks2VolumeMonitor *monitor)
+{
+  g_return_val_if_fail (GVFS_IS_UDISKS2_VOLUME_MONITOR (monitor), NULL);
+  return monitor->gudev_client;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 void
 gvfs_udisks2_volume_monitor_update (GVfsUDisks2VolumeMonitor *monitor)
 {
diff --git a/monitor/udisks2/gvfsudisks2volumemonitor.h b/monitor/udisks2/gvfsudisks2volumemonitor.h
index c08d58e..b9460b3 100644
--- a/monitor/udisks2/gvfsudisks2volumemonitor.h
+++ b/monitor/udisks2/gvfsudisks2volumemonitor.h
@@ -29,6 +29,7 @@
 #include <gio/gunixmounts.h>
 
 #include <udisks/udisks.h>
+#include <gudev/gudev.h>
 
 G_BEGIN_DECLS
 
@@ -47,6 +48,7 @@ GType           gvfs_udisks2_volume_monitor_get_type          (void) G_GNUC_CONS
 GVolumeMonitor *gvfs_udisks2_volume_monitor_new               (void);
 UDisksClient   *gvfs_udisks2_volume_monitor_get_udisks_client (GVfsUDisks2VolumeMonitor *monitor);
 void            gvfs_udisks2_volume_monitor_update            (GVfsUDisks2VolumeMonitor *monitor);
+GUdevClient    *gvfs_udisks2_volume_monitor_get_gudev_client  (GVfsUDisks2VolumeMonitor *monitor);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]