[gnome-control-center/wip/lantw/info-dont-depend-on-udisks2-client-library] info: Don't depend on udisks2 client library



commit 5636e1bf9cd4856e6d5d36b357cbf91060152e3f
Author: Ting-Wei Lan <lantw src gnome org>
Date:   Wed Jul 24 14:46:44 2019 +0800

    info: Don't depend on udisks2 client library
    
    The official implementation of udisks2 service is only available on
    Linux. Since the client library is bundled with the service, it is not
    possible to install the client library on non-Linux systems without
    patching the build system of udisks2. In order to support non-Linux
    systems with their unofficial udisks2 service implementations, we should
    use GDBus directly instead of relying on the client library.
    
    Fixes https://gitlab.gnome.org/GNOME/gnome-control-center/issues/606

 panels/info/cc-info-overview-panel.c | 76 +++++++++++++++++++++++-------------
 panels/info/meson.build              |  1 -
 2 files changed, 48 insertions(+), 29 deletions(-)
---
diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c
index 0d0a17fcf..13b18cb45 100644
--- a/panels/info/cc-info-overview-panel.c
+++ b/panels/info/cc-info-overview-panel.c
@@ -36,7 +36,6 @@
 #include <glibtop/mountlist.h>
 #include <glibtop/mem.h>
 #include <glibtop/sysinfo.h>
-#include <udisks/udisks.h>
 
 #include <gdk/gdk.h>
 
@@ -80,8 +79,6 @@ typedef struct
 
   GCancellable   *cancellable;
 
-  UDisksClient   *client;
-
   GraphicsData   *graphics_data;
 } CcInfoOverviewPanelPrivate;
 
@@ -483,38 +480,70 @@ get_os_type (void)
 static void
 get_primary_disc_info (CcInfoOverviewPanel *self)
 {
-  CcInfoOverviewPanelPrivate *priv;
+  CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
+  g_autoptr(GError) error = NULL;
   GDBusObjectManager *manager;
   g_autolist(GDBusObject) objects = NULL;
   GList *l;
-  guint64 total_size;
-
-  priv = cc_info_overview_panel_get_instance_private (self);
-  total_size = 0;
-
-  if (!priv->client)
+  guint64 total_size = 0;
+
+  manager = g_dbus_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                           G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
+                                                           "org.freedesktop.UDisks2",
+                                                           "/org/freedesktop/UDisks2",
+                                                           NULL,
+                                                           NULL,
+                                                           NULL,
+                                                           NULL,
+                                                           &error);
+  if (error != NULL)
     {
+      g_warning ("Unable to get UDisks client: %s. Disk information will not be available.",
+                 error->message);
       gtk_label_set_text (GTK_LABEL (priv->disk_label), _("Unknown"));
       return;
     }
 
-  manager = udisks_client_get_object_manager (priv->client);
   objects = g_dbus_object_manager_get_objects (manager);
 
   for (l = objects; l != NULL; l = l->next)
     {
-      UDisksDrive *drive;
-      drive = udisks_object_peek_drive (UDISKS_OBJECT (l->data));
+      GDBusInterface *interface = g_dbus_object_get_interface(l->data, "org.freedesktop.UDisks2.Drive");
+      if (interface == NULL)
+        continue;
 
-      /* Skip removable devices */
-      if (drive == NULL ||
-          udisks_drive_get_removable (drive) ||
-          udisks_drive_get_ejectable (drive))
+      GDBusProxy *drive = G_DBUS_PROXY (interface);
+      GVariant *variant;
+
+      gboolean removable = FALSE;
+      variant = g_dbus_proxy_get_cached_property (drive, "Removable");
+      if (variant != NULL)
         {
-          continue;
+          removable = g_variant_get_boolean (variant);
+          g_variant_unref (variant);
+        }
+
+      gboolean ejectable = FALSE;
+      variant = g_dbus_proxy_get_cached_property (drive, "Ejectable");
+      if (variant != NULL)
+        {
+          ejectable = g_variant_get_boolean (variant);
+          g_variant_unref (variant);
+        }
+
+      guint64 size = 0;
+      variant = g_dbus_proxy_get_cached_property (drive, "Size");
+      if (variant != NULL)
+        {
+          size = g_variant_get_uint64 (variant);
+          g_variant_unref (variant);
         }
 
-      total_size += udisks_drive_get_size (drive);
+      /* Skip removable devices */
+      if (removable || ejectable)
+        continue;
+
+      total_size += size;
     }
 
   if (total_size > 0)
@@ -787,8 +816,6 @@ cc_info_overview_panel_finalize (GObject *object)
       g_clear_object (&priv->cancellable);
     }
 
-  g_clear_object (&priv->client);
-
   g_free (priv->gnome_version);
   g_free (priv->gnome_date);
   g_free (priv->gnome_distributor);
@@ -829,7 +856,6 @@ static void
 cc_info_overview_panel_init (CcInfoOverviewPanel *self)
 {
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
-  g_autoptr(GError) error = NULL;
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
@@ -842,12 +868,6 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
   else
     gtk_widget_destroy (priv->updates_button);
 
-  priv->client = udisks_client_new_sync (NULL, &error);
-
-  if (error != NULL)
-      g_warning ("Unable to get UDisks client: %s. Disk information will not be available.",
-                 error->message);
-
   info_overview_panel_setup_overview (self);
   info_overview_panel_setup_virt (self);
 }
diff --git a/panels/info/meson.build b/panels/info/meson.build
index 911abbe9f..16176f780 100644
--- a/panels/info/meson.build
+++ b/panels/info/meson.build
@@ -57,7 +57,6 @@ sources += gnome.compile_resources(
 
 deps = common_deps + [
   polkit_gobject_dep,
-  dependency('udisks2', version: '>= 2.1.8'),
   dependency('libgtop-2.0')
 ]
 


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