diff options
author | Ting-Wei Lan <lantw@src.gnome.org> | 2019-07-24 14:46:44 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw@src.gnome.org> | 2019-07-24 15:03:28 +0800 |
commit | 5636e1bf9cd4856e6d5d36b357cbf91060152e3f (patch) | |
tree | 92a37ce38c1e23be58706b42b1c0bc89342118b6 | |
parent | faf305772cec9e8c7e1d33d05b16b245c9b1a7f7 (diff) | |
download | gnome-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.c | 76 | ||||
-rw-r--r-- | 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') ] |