summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw@src.gnome.org>2019-07-24 14:46:44 +0800
committerTing-Wei Lan <lantw@src.gnome.org>2019-07-24 15:03:28 +0800
commit5636e1bf9cd4856e6d5d36b357cbf91060152e3f (patch)
tree92a37ce38c1e23be58706b42b1c0bc89342118b6
parentfaf305772cec9e8c7e1d33d05b16b245c9b1a7f7 (diff)
downloadgnome-control-center-wip/lantw/info-dont-depend-on-udisks2-client-library.tar.gz
info: Don't depend on udisks2 client librarywip/lantw/info-dont-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
-rw-r--r--panels/info/cc-info-overview-panel.c76
-rw-r--r--panels/info/meson.build1
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')
]