[gnome-control-center/ua-daemon] Show ESM status




commit 5c23ea06795bc3590905258ae06d226e27c4ccfa
Author: Robert Ancell <robert ancell canonical com>
Date:   Mon Nov 29 16:13:09 2021 +1300

    Show ESM status

 panels/info-overview/cc-info-overview-panel.c      | 107 +++++++++++++++++++++
 panels/info-overview/cc-info-overview-panel.ui     |  14 +++
 .../com.canonical.UbuntuAdvantage.xml              |  23 +++++
 panels/info-overview/meson.build                   |   8 ++
 4 files changed, 152 insertions(+)
---
diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c
index 6e832eb35..3a243f6ba 100644
--- a/panels/info-overview/cc-info-overview-panel.c
+++ b/panels/info-overview/cc-info-overview-panel.c
@@ -25,6 +25,7 @@
 #include "cc-hostname-entry.h"
 
 #include "cc-info-overview-resources.h"
+#include "cc-ua-daemon-generated.h"
 #include "info-cleanup.h"
 
 #include <glib.h>
@@ -59,6 +60,7 @@ struct _CcInfoOverviewPanel
   GtkEntry        *device_name_entry;
   GtkWidget       *rename_button;
   CcListRow       *disk_row;
+  GtkLabel        *esm_label;
   CcListRow       *gnome_version_row;
   CcListRow       *graphics_row;
   GtkListBox      *hardware_box;
@@ -75,6 +77,11 @@ struct _CcInfoOverviewPanel
   CcListRow       *software_updates_row;
   CcListRow       *virtualization_row;
   CcListRow       *windowing_system_row;
+
+  GCancellable       *cancellable;
+  GDBusObjectManager *ua_object_manager;
+  CcUaDaemonManager  *manager; // FIXME: Not required?
+  CcUaDaemonService  *esm_infra_service;
 };
 
 typedef struct
@@ -922,15 +929,111 @@ setup_os_logo (CcInfoOverviewPanel *panel)
   gtk_image_set_from_gicon (panel->os_logo, icon, GTK_ICON_SIZE_INVALID);
 }
 
+static void update_ubuntu_pro_status (CcInfoOverviewPanel *self)
+{
+  gboolean esm_infra_enabled = self->esm_infra_service != NULL && g_strcmp0 (cc_ua_daemon_service_get_status 
(self->esm_infra_service), "enabled") == 0;
+
+  gtk_widget_set_visible (GTK_WIDGET (self->esm_label), esm_infra_enabled);
+}
+
+static void ua_daemon_object_added_cb (CcInfoOverviewPanel *self, GDBusObject *object)
+{
+  g_autoptr(CcUaDaemonManager) manager = NULL;
+  g_autoptr(CcUaDaemonService) service = NULL;
+
+  manager = cc_ua_daemon_object_get_manager (CC_UA_DAEMON_OBJECT (object));
+  if (manager != NULL) {
+    g_clear_object (&self->manager);
+    self->manager = g_steal_pointer(&manager);
+    g_signal_connect_swapped(self->manager, "notify::attached", G_CALLBACK(update_ubuntu_pro_status), self);
+  }
+
+  service = cc_ua_daemon_object_get_service (CC_UA_DAEMON_OBJECT (object));
+  if (service != NULL) {
+    const char *name = cc_ua_daemon_service_get_name(service);
+    if (strcmp (name, "esm-infra") == 0) {
+      g_clear_object (&self->esm_infra_service);
+      self->esm_infra_service = g_steal_pointer(&service);
+    }
+  }
+
+  update_ubuntu_pro_status (self);
+}
+
+static void ua_daemon_object_removed_cb (CcInfoOverviewPanel *self, GDBusObject *object)
+{
+  const gchar *object_path = g_dbus_object_get_object_path (object);
+  if (self->manager != NULL && strcmp (g_dbus_proxy_get_object_path(G_DBUS_PROXY(self->manager)), 
object_path) == 0) {
+    g_clear_object (&self->manager);
+  }
+  if (self->esm_infra_service != NULL && strcmp 
(g_dbus_proxy_get_object_path(G_DBUS_PROXY(self->esm_infra_service)), object_path) == 0) {
+    g_clear_object (&self->esm_infra_service);
+  }
+
+  update_ubuntu_pro_status (self);
+}
+
+static void ua_daemon_cb (GObject *object, GAsyncResult *result, gpointer user_data)
+{
+  CcInfoOverviewPanel *self = user_data;
+  g_autoptr(GList) objects = NULL;
+  g_autoptr(GError) error = NULL;
+
+  self->ua_object_manager = cc_ua_daemon_object_manager_client_new_for_bus_finish (result, &error);
+  if (self->ua_object_manager == NULL) {
+    g_warning ("Failed to connect to UA daemon: %s", error->message);
+    return;
+  }
+
+  g_signal_connect_swapped (self->ua_object_manager, "object-added", G_CALLBACK (ua_daemon_object_added_cb), 
self);
+  g_signal_connect_swapped (self->ua_object_manager, "object-removed", G_CALLBACK 
(ua_daemon_object_removed_cb), self);
+  objects = g_dbus_object_manager_get_objects (self->ua_object_manager);
+  for (GList *link = objects; link != NULL; link = link->next) {
+    GDBusObject *object = link->data;
+    ua_daemon_object_added_cb (self, object);
+  }
+}
+
+static void setup_ua_daemon (CcInfoOverviewPanel *self)
+{
+  cc_ua_daemon_object_manager_client_new_for_bus(G_BUS_TYPE_SYSTEM,
+                                                 G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
+                                                 "com.canonical.UbuntuAdvantage",
+                                                 "/",
+                                                 self->cancellable,
+                                                 ua_daemon_cb,
+                                                 self);
+  update_ubuntu_pro_status (self);
+}
+
+static void
+cc_info_overview_panel_dispose (GObject *object)
+{
+  CcInfoOverviewPanel *self = CC_INFO_OVERVIEW_PANEL (object);
+
+  g_cancellable_cancel (self->cancellable);
+
+  g_clear_object (&self->cancellable);
+  g_clear_object (&self->ua_object_manager);
+  g_clear_object (&self->manager);
+  g_clear_object (&self->esm_infra_service);
+
+  G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->dispose (object);
+}
+
 static void
 cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  object_class->dispose = cc_info_overview_panel_dispose;
+
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/info-overview/cc-info-overview-panel.ui");
 
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, device_name_entry);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, disk_row);
+  gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, esm_label);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, gnome_version_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, graphics_row);
   gtk_widget_class_bind_template_child (widget_class, CcInfoOverviewPanel, hardware_box);
@@ -963,6 +1066,8 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
 
   g_resources_register (cc_info_overview_get_resource ());
 
+  self->cancellable = g_cancellable_new ();
+
   if ((!does_gnome_software_exist () || !does_gnome_software_allow_updates ()) && 
!does_gpk_update_viewer_exist ())
     gtk_widget_hide (GTK_WIDGET (self->software_updates_row));
 
@@ -970,6 +1075,8 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
   info_overview_panel_setup_virt (self);
 
   setup_os_logo (self);
+
+  setup_ua_daemon (self);
 }
 
 GtkWidget *
diff --git a/panels/info-overview/cc-info-overview-panel.ui b/panels/info-overview/cc-info-overview-panel.ui
index 95afe867c..cf682f0a2 100644
--- a/panels/info-overview/cc-info-overview-panel.ui
+++ b/panels/info-overview/cc-info-overview-panel.ui
@@ -35,6 +35,20 @@
                     <property name="fill">False</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkLabel" id="esm_label">
+                    <property name="visible">False</property>
+                    <property name="can_focus">False</property>
+                   <property name="label" translatable="yes">Extended Security Maintenance</property>
+                   <attributes>
+                     <attribute name="weight" value="bold"/>
+                   </attributes>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                  </packing>
+                </child>
 
                 <child>
                   <object class="GtkListBox">
diff --git a/panels/info-overview/com.canonical.UbuntuAdvantage.xml 
b/panels/info-overview/com.canonical.UbuntuAdvantage.xml
new file mode 100644
index 000000000..15ae2a0f8
--- /dev/null
+++ b/panels/info-overview/com.canonical.UbuntuAdvantage.xml
@@ -0,0 +1,23 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd";>
+
+<node name="/">
+  <interface name='com.canonical.UbuntuAdvantage.Manager'>
+    <method name='Attach'>
+      <arg type='s' name='token' direction='in'/>
+    </method>
+    <method name='Detach'/>
+    <property name='Attached' type='b' access='read'/>
+    <property name='DaemonVersion' type='s' access='read'/>
+  </interface>
+
+  <interface name='com.canonical.UbuntuAdvantage.Service'>
+    <method name='Enable'/>
+    <method name='Disable'/>
+    <property name='Name' type='s' access='read'/>
+    <property name='Description' type='s' access='read'/>
+    <property name='Entitled' type='s' access='read'/>
+    <property name='Status' type='s' access='read'/>
+  </interface>
+</node>
diff --git a/panels/info-overview/meson.build b/panels/info-overview/meson.build
index 2fe10b32c..ae834093d 100644
--- a/panels/info-overview/meson.build
+++ b/panels/info-overview/meson.build
@@ -27,6 +27,14 @@ sources = files(
   'info-cleanup.c'
 )
 
+sources += gnome.gdbus_codegen(
+  'cc-ua-daemon-generated',
+  'com.canonical.UbuntuAdvantage.xml',
+  interface_prefix: 'com.canonical.UbuntuAdvantage.',
+  namespace: 'CcUaDaemon',
+  object_manager: true
+)
+
 resource_data = files(
   'cc-info-overview-panel.ui'
 )


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