[gnome-software/wip/rancell/permissions] Replace gboolean with GsPermissionValue



commit 01867779df37f872e0718c45c375eb7844298cba
Author: Robert Ancell <robert ancell canonical com>
Date:   Tue Aug 15 16:36:25 2017 +1200

    Replace gboolean with GsPermissionValue

 lib/gs-app.c                  |    4 +-
 lib/gs-permission.c           |   88 ++++++++++++++++++++++++++++++-----------
 lib/gs-permission.h           |   29 ++++++++------
 lib/gs-plugin-job-private.h   |    2 +-
 lib/gs-plugin-job.c           |   25 ++++++-----
 lib/gs-plugin-job.h           |    5 +-
 lib/gs-plugin-loader.c        |   12 +++---
 lib/gs-plugin-vfuncs.h        |   12 +++---
 lib/meson.build               |    2 +
 plugins/snap/gs-plugin-snap.c |   30 ++++++++++++--
 src/gs-details-page.c         |    2 +-
 src/gs-page.c                 |    2 +-
 src/gs-page.h                 |   10 ++--
 src/gs-permission-dialog.c    |    4 +-
 src/gs-permission-switch.c    |    9 +++-
 15 files changed, 158 insertions(+), 78 deletions(-)
---
diff --git a/lib/gs-app.c b/lib/gs-app.c
index a57a9e9..d9a91ac 100644
--- a/lib/gs-app.c
+++ b/lib/gs-app.c
@@ -444,13 +444,15 @@ gs_app_to_string_append (GsApp *app, GString *str)
        }
        for (i = 0; i < priv->permissions->len; i++) {
                GsPermission *permission;
+               GsPermissionValue *value;
                g_autofree gchar *key = NULL;
 
                permission = g_ptr_array_index (priv->permissions, i);
+               value = gs_permission_get_value (permission);
                key = g_strdup_printf ("permission-%02u", i);
                gs_app_kv_printf (str, key, "[%s] %s",
                                  gs_permission_get_label (permission),
-                                 gs_permission_get_enabled (permission) ? "true" : "false");
+                                 value ? gs_permission_value_get_label (value) : "(unset)");
        }
        if (priv->match_value != 0)
                gs_app_kv_printf (str, "match-value", "%05x", priv->match_value);
diff --git a/lib/gs-permission.c b/lib/gs-permission.c
index 0ec7820..4ab5e37 100644
--- a/lib/gs-permission.c
+++ b/lib/gs-permission.c
@@ -30,7 +30,8 @@ struct _GsPermission
        GObject                  parent_instance;
 
        gchar                   *label;
-       gboolean                 enabled;
+       GPtrArray               *values;
+       GsPermissionValue       *value;
        GHashTable              *metadata;      /* utf8: utf8 */
 };
 
@@ -38,7 +39,7 @@ G_DEFINE_TYPE (GsPermission, gs_permission, G_TYPE_OBJECT)
 
 /**
  * gs_permission_get_metadata_item:
- * @auth: a #GsPermission
+ * @permission: a #GsPermission
  * @key: a string
  *
  * Gets some metadata from a permission object.
@@ -48,16 +49,16 @@ G_DEFINE_TYPE (GsPermission, gs_permission, G_TYPE_OBJECT)
  * Returns: A string value, or %NULL for not found
  */
 const gchar *
-gs_permission_get_metadata_item (GsPermission *auth, const gchar *key)
+gs_permission_get_metadata_item (GsPermission *permission, const gchar *key)
 {
-       g_return_val_if_fail (GS_IS_PERMISSION (auth), NULL);
+       g_return_val_if_fail (GS_IS_PERMISSION (permission), NULL);
        g_return_val_if_fail (key != NULL, NULL);
-       return g_hash_table_lookup (auth->metadata, key);
+       return g_hash_table_lookup (permission->metadata, key);
 }
 
 /**
  * gs_permission_add_metadata:
- * @auth: a #GsPermission
+ * @permission: a #GsPermission
  * @key: a string
  * @value: a string
  *
@@ -66,10 +67,10 @@ gs_permission_get_metadata_item (GsPermission *auth, const gchar *key)
  * typical use would be to store an ID for this permission.
  */
 void
-gs_permission_add_metadata (GsPermission *auth, const gchar *key, const gchar *value)
+gs_permission_add_metadata (GsPermission *permission, const gchar *key, const gchar *value)
 {
-       g_return_if_fail (GS_IS_PERMISSION (auth));
-       g_hash_table_insert (auth->metadata, g_strdup (key), g_strdup (value));
+       g_return_if_fail (GS_IS_PERMISSION (permission));
+       g_hash_table_insert (permission->metadata, g_strdup (key), g_strdup (value));
 }
 
 /**
@@ -88,32 +89,72 @@ gs_permission_get_label (GsPermission *permission)
 }
 
 /**
- * gs_permission_get_enabled:
+ * gs_permission_add_value:
+ * @permission: a #GsPermission
+ * @value: a #GsPermissionValue
+ *
+ * Add a possible values for this permission.
+ */
+void
+gs_permission_add_value (GsPermission *permission, GsPermissionValue *value)
+{
+       g_return_if_fail (GS_IS_PERMISSION (permission));
+       g_ptr_array_add (permission->values, g_object_ref (value));
+}
+
+/**
+ * gs_permission_get_values:
+ * @permission: a #GsPermission
+ *
+ * Get the possible values for this permission.
+ *
+ * Returns: (element-type GsPermissionValue) (transfer none): a list
+ */
+GPtrArray *
+gs_permission_get_values (GsPermission *permission)
+{
+       g_return_val_if_fail (GS_IS_PERMISSION (permission), NULL);
+       return permission->values;
+}
+
+/**
+ * gs_permission_get_value:
  * @permission: a #GsPermission
  *
- * Get if this permission is enabled.
+ * Get the value for this permission.
  *
- * Returns: %TRUE if enabled
+ * Returns: a %GsPermissionValue or %NULL.
  */
-gboolean
-gs_permission_get_enabled (GsPermission *permission)
+GsPermissionValue *
+gs_permission_get_value (GsPermission *permission)
 {
-       g_return_val_if_fail (GS_IS_PERMISSION (permission), 0);
-       return permission->enabled;
+       g_return_val_if_fail (GS_IS_PERMISSION (permission), NULL);
+       return permission->value;
 }
 
 /**
- * gs_permission_set_enabled:
+ * gs_permission_set_value:
  * @permission: a #GsPermission
- * @enabled: %TRUE if this permission is enabled.
+ * @value: a #GsPermissionValue to set for this permission
  *
- * Set if this permission is enabled.
+ * Set the value of this permission.
  */
 void
-gs_permission_set_enabled (GsPermission *permission, gboolean enabled)
+gs_permission_set_value (GsPermission *permission, GsPermissionValue *value)
 {
        g_return_if_fail (GS_IS_PERMISSION (permission));
-       permission->enabled = enabled;
+       g_set_object (&permission->value, value);
+}
+
+static void
+gs_permission_dispose (GObject *object)
+{
+       GsPermission *permission = GS_PERMISSION (object);
+
+       g_clear_pointer (&permission->values, g_ptr_array_unref);
+       g_clear_object (&permission->value);
+
+       G_OBJECT_CLASS (gs_permission_parent_class)->dispose (object);
 }
 
 static void
@@ -131,6 +172,7 @@ static void
 gs_permission_class_init (GsPermissionClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       object_class->dispose = gs_permission_dispose;
        object_class->finalize = gs_permission_finalize;
 }
 
@@ -139,15 +181,15 @@ gs_permission_init (GsPermission *permission)
 {
        permission->metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                      g_free, g_free);
+       permission->values = g_ptr_array_new_with_free_func (g_object_unref);
 }
 
 GsPermission *
-gs_permission_new (const gchar *label, gboolean enabled)
+gs_permission_new (const gchar *label)
 {
        GsPermission *permission;
        permission = g_object_new (GS_TYPE_PERMISSION, NULL);
        permission->label = g_strdup (label);
-       permission->enabled = enabled;
        return GS_PERMISSION (permission);
 }
 
diff --git a/lib/gs-permission.h b/lib/gs-permission.h
index 925e1be..08a2436 100644
--- a/lib/gs-permission.h
+++ b/lib/gs-permission.h
@@ -23,7 +23,8 @@
 #define __GS_PERMISSION_H
 
 #include <glib-object.h>
-#include <gdk/gdk.h>
+
+#include "gs-permission-value.h"
 
 G_BEGIN_DECLS
 
@@ -31,19 +32,23 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (GsPermission, gs_permission, GS, PERMISSION, GObject)
 
-GsPermission   *gs_permission_new                      (const gchar    *label,
-                                                        gboolean        enabled);
+GsPermission           *gs_permission_new                      (const gchar            *label);
+
+const gchar            *gs_permission_get_metadata_item        (GsPermission           *permission,
+                                                                const gchar            *key);
+void                    gs_permission_add_metadata             (GsPermission           *permission,
+                                                                const gchar            *key,
+                                                                const gchar            *value);
+
+const gchar            *gs_permission_get_label                (GsPermission   *permission);
 
-const gchar    *gs_permission_get_metadata_item        (GsPermission   *permission,
-                                                        const gchar    *key);
-void            gs_permission_add_metadata             (GsPermission   *permission,
-                                                        const gchar    *key,
-                                                        const gchar    *value);
+void                    gs_permission_add_value                (GsPermission           *permission,
+                                                                GsPermissionValue      *value);
+GPtrArray              *gs_permission_get_values               (GsPermission           *permission);
 
-const gchar    *gs_permission_get_label                (GsPermission   *permission);
-gboolean        gs_permission_get_enabled              (GsPermission   *permission);
-void            gs_permission_set_enabled              (GsPermission   *permission,
-                                                        gboolean        enabled);
+GsPermissionValue      *gs_permission_get_value                (GsPermission           *permission);
+void                    gs_permission_set_value                (GsPermission           *permission,
+                                                                GsPermissionValue      *value);
 
 G_END_DECLS
 
diff --git a/lib/gs-plugin-job-private.h b/lib/gs-plugin-job-private.h
index f9f2cfd..7a1c467 100644
--- a/lib/gs-plugin-job-private.h
+++ b/lib/gs-plugin-job-private.h
@@ -53,7 +53,7 @@ GsCategory            *gs_plugin_job_get_category             (GsPluginJob    *self);
 AsReview               *gs_plugin_job_get_review               (GsPluginJob    *self);
 GsPrice                        *gs_plugin_job_get_price                (GsPluginJob    *self);
 GsPermission           *gs_plugin_job_get_permission           (GsPluginJob    *self);
-gboolean                gs_plugin_job_get_permission_value     (GsPluginJob    *self);
+GsPermissionValue      *gs_plugin_job_get_permission_value     (GsPluginJob    *self);
 gchar                  *gs_plugin_job_to_string                (GsPluginJob    *self);
 void                    gs_plugin_job_set_action               (GsPluginJob    *self,
                                                                 GsPluginAction  action);
diff --git a/lib/gs-plugin-job.c b/lib/gs-plugin-job.c
index 0973674..7d1081e 100644
--- a/lib/gs-plugin-job.c
+++ b/lib/gs-plugin-job.c
@@ -48,7 +48,7 @@ struct _GsPluginJob
        AsReview                *review;
        GsPrice                 *price;
        GsPermission            *permission;
-       gboolean                 permission_value;
+       GsPermissionValue       *permission_value;
        gint64                   time_created;
 };
 
@@ -133,7 +133,10 @@ gs_plugin_job_to_string (GsPluginJob *self)
                g_string_append_printf (str, " with file=%s", path);
        }
        if (self->permission != NULL) {
-               g_string_append_printf (str, " with permission=%s:%s", gs_permission_get_label 
(self->permission), self->permission_value ? "true" : "false");
+               g_string_append_printf (str, " with permission=%s", gs_permission_get_label 
(self->permission));
+       }
+       if (self->permission_value != NULL) {
+               g_string_append_printf (str, " with permission-value=%s", gs_permission_value_get_label 
(self->permission_value));
        }
        if (self->plugin != NULL) {
                g_string_append_printf (str, " on plugin=%s",
@@ -452,16 +455,16 @@ gs_plugin_job_get_permission (GsPluginJob *self)
 }
 
 void
-gs_plugin_job_set_permission_value (GsPluginJob *self, gboolean value)
+gs_plugin_job_set_permission_value (GsPluginJob *self, GsPermissionValue *value)
 {
        g_return_if_fail (GS_IS_PLUGIN_JOB (self));
-       self->permission_value = value;
+       g_set_object (&self->permission_value, value);
 }
 
-gboolean
+GsPermissionValue *
 gs_plugin_job_get_permission_value (GsPluginJob *self)
 {
-       g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), FALSE);
+       g_return_val_if_fail (GS_IS_PLUGIN_JOB (self), NULL);
        return self->permission_value;
 }
 
@@ -520,7 +523,7 @@ gs_plugin_job_get_property (GObject *obj, guint prop_id, GValue *value, GParamSp
                g_value_set_object (value, self->permission);
                break;
        case PROP_PERMISSION_VALUE:
-               g_value_set_boolean (value, self->permission_value);
+               g_value_set_object (value, self->permission_value);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
@@ -583,7 +586,7 @@ gs_plugin_job_set_property (GObject *obj, guint prop_id, const GValue *value, GP
                gs_plugin_job_set_permission (self, g_value_get_object (value));
                break;
        case PROP_PERMISSION_VALUE:
-               gs_plugin_job_set_permission_value (self, g_value_get_boolean (value));
+               gs_plugin_job_set_permission_value (self, g_value_get_object (value));
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
@@ -699,9 +702,9 @@ gs_plugin_job_class_init (GsPluginJobClass *klass)
                                     G_PARAM_READWRITE);
        g_object_class_install_property (object_class, PROP_PERMISSION, pspec);
 
-       pspec = g_param_spec_boolean ("permission-value", NULL, NULL,
-                                     FALSE,
-                                     G_PARAM_READWRITE);
+       pspec = g_param_spec_object ("permission-value", NULL, NULL,
+                                    GS_TYPE_PERMISSION_VALUE,
+                                    G_PARAM_READWRITE);
        g_object_class_install_property (object_class, PROP_PERMISSION_VALUE, pspec);
 }
 
diff --git a/lib/gs-plugin-job.h b/lib/gs-plugin-job.h
index 36270fb..d05325b 100644
--- a/lib/gs-plugin-job.h
+++ b/lib/gs-plugin-job.h
@@ -30,6 +30,7 @@
 #include "gs-plugin-types.h"
 #include "gs-price.h"
 #include "gs-permission.h"
+#include "gs-permission-value.h"
 
 G_BEGIN_DECLS
 
@@ -73,8 +74,8 @@ void           gs_plugin_job_set_price                (GsPluginJob    *self,
                                                         GsPrice        *price);
 void            gs_plugin_job_set_permission           (GsPluginJob    *self,
                                                         GsPermission   *permission);
-void            gs_plugin_job_set_permission_value     (GsPluginJob    *self,
-                                                        gboolean        value);
+void            gs_plugin_job_set_permission_value     (GsPluginJob            *self,
+                                                        GsPermissionValue      *value);
 
 #define                 gs_plugin_job_newv(a,...)              
GS_PLUGIN_JOB(g_object_new(GS_TYPE_PLUGIN_JOB, "action", a, __VA_ARGS__))
 
diff --git a/lib/gs-plugin-loader.c b/lib/gs-plugin-loader.c
index f498300..9a85d51 100644
--- a/lib/gs-plugin-loader.c
+++ b/lib/gs-plugin-loader.c
@@ -128,12 +128,12 @@ typedef gboolean   (*GsPluginPurchaseFunc)        (GsPlugin       *plugin,
                                                         GsPrice        *price,
                                                         GCancellable   *cancellable,
                                                         GError         **error);
-typedef gboolean        (*GsPluginSetPermissionFunc)   (GsPlugin       *plugin,
-                                                        GsApp          *app,
-                                                        GsPermission   *permission,
-                                                        gboolean        value,
-                                                        GCancellable   *cancellable,
-                                                        GError         **error);
+typedef gboolean        (*GsPluginSetPermissionFunc)   (GsPlugin               *plugin,
+                                                        GsApp                  *app,
+                                                        GsPermission           *permission,
+                                                        GsPermissionValue      *value,
+                                                        GCancellable           *cancellable,
+                                                        GError                 **error);
 typedef gboolean        (*GsPluginReviewFunc)          (GsPlugin       *plugin,
                                                         GsApp          *app,
                                                         AsReview       *review,
diff --git a/lib/gs-plugin-vfuncs.h b/lib/gs-plugin-vfuncs.h
index 8f0c623..dcef79b 100644
--- a/lib/gs-plugin-vfuncs.h
+++ b/lib/gs-plugin-vfuncs.h
@@ -741,12 +741,12 @@ gboolean   gs_plugin_app_upgrade_trigger          (GsPlugin       *plugin,
  *
  * Returns: %TRUE for success or if not relevant
  **/
-gboolean        gs_plugin_app_set_permission           (GsPlugin       *plugin,
-                                                        GsApp          *app,
-                                                        GsPermission   *permission,
-                                                        gboolean        value,
-                                                        GCancellable   *cancellable,
-                                                        GError         **error);
+gboolean        gs_plugin_app_set_permission           (GsPlugin               *plugin,
+                                                        GsApp                  *app,
+                                                        GsPermission           *permission,
+                                                        GsPermissionValue      *value,
+                                                        GCancellable           *cancellable,
+                                                        GError                 **error);
 
 /**
  * gs_plugin_review_submit:
diff --git a/lib/meson.build b/lib/meson.build
index d55b73f..05d3ae8 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -44,6 +44,7 @@ install_headers([
     'gs-category.h',
     'gs-os-release.h',
     'gs-permission.h',
+    'gs-permission-value.h',
     'gs-plugin.h',
     'gs-plugin-event.h',
     'gs-plugin-types.h',
@@ -80,6 +81,7 @@ libgnomesoftware = static_library(
     'gs-debug.c',
     'gs-os-release.c',
     'gs-permission.c',
+    'gs-permission-value.c',
     'gs-plugin.c',
     'gs-plugin-event.c',
     'gs-plugin-job.c',
diff --git a/plugins/snap/gs-plugin-snap.c b/plugins/snap/gs-plugin-snap.c
index 89347d5..a1b5f54 100644
--- a/plugins/snap/gs-plugin-snap.c
+++ b/plugins/snap/gs-plugin-snap.c
@@ -601,8 +601,9 @@ gs_plugin_refine_app (GsPlugin *plugin,
                for (i = 0; i < plugs->len; i++) {
                        SnapdPlug *plug = plugs->pdata[i];
                        const gchar *name;
-                       gboolean is_connected;
+                       SnapdConnection *connection = NULL;
                        g_autoptr(GsPermission) permission = NULL;
+                       guint j;
 
                        /* skip if not relating to this snap */
                        if (g_strcmp0 (snapd_plug_get_snap (plug), gs_app_get_name (app)) != 0)
@@ -610,8 +611,27 @@ gs_plugin_refine_app (GsPlugin *plugin,
 
                        /* map interfaces to known permissions */
                        name = snapd_plug_get_name (plug);
-                       is_connected = snapd_plug_get_connections (plug)->len > 0;
-                       permission = gs_permission_new (name, is_connected);
+                       if (snapd_plug_get_connections (plug)->len > 0)
+                               connection = g_ptr_array_index (snapd_plug_get_connections (plug), 0);
+                       permission = gs_permission_new (name);
+                       for (j = 0; j < slots->len; j++) {
+                               SnapdSlot *slot = slots->pdata[j];
+                               g_autoptr(GsPermissionValue) value = NULL;
+                               g_autofree gchar *label = NULL;
+
+                               /* skip slots we can't connect to */
+                               if (g_strcmp0 (snapd_plug_get_interface (plug), snapd_slot_get_interface 
(slot)) != 0)
+                                       continue;
+
+                               label = g_strdup_printf ("%s:%s", snapd_slot_get_snap (slot), 
snapd_slot_get_name (slot));
+                               value = gs_permission_value_new (label);
+                               gs_permission_add_value (permission, value);
+
+                               if (connection != NULL &&
+                                   g_strcmp0 (snapd_slot_get_snap (slot), snapd_connection_get_snap 
(connection)) == 0 &&
+                                   g_strcmp0 (snapd_slot_get_name (slot), snapd_connection_get_name 
(connection)) == 0)
+                                       gs_permission_set_value (permission, value);
+                       }
                        gs_app_add_permission (app, permission);
                }
        }
@@ -761,7 +781,7 @@ gboolean
 gs_plugin_app_set_permission (GsPlugin *plugin,
                              GsApp *app,
                              GsPermission *permission,
-                             gboolean value,
+                             GsPermissionValue *value,
                              GCancellable *cancellable,
                              GError **error)
 {
@@ -769,6 +789,8 @@ gs_plugin_app_set_permission (GsPlugin *plugin,
        if (g_strcmp0 (gs_app_get_management_plugin (app), "snap") != 0)
                return TRUE;
 
+       // FIXME
+       g_printerr ("PERMISSION %s=%s\n", gs_permission_get_label (permission), gs_permission_value_get_label 
(value));
        return TRUE;
 }
 
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index 9add994..39cf4fc 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -1753,7 +1753,7 @@ gs_details_page_app_cancel_button_cb (GtkWidget *widget, GsDetailsPage *self)
 }
 
 static void
-gs_details_page_permission_changed_cb (GsPermissionDialog *dialog, GsPermission *permission, gboolean value, 
GsDetailsPage *self)
+gs_details_page_permission_changed_cb (GsPermissionDialog *dialog, GsPermission *permission, 
GsPermissionValue *value, GsDetailsPage *self)
 {
        g_autoptr(GCancellable) cancellable = g_cancellable_new ();
        g_set_object (&self->cancellable, cancellable);
diff --git a/src/gs-page.c b/src/gs-page.c
index eaee346..9e9648b 100644
--- a/src/gs-page.c
+++ b/src/gs-page.c
@@ -747,7 +747,7 @@ gs_page_app_permission_set_cb (GObject *source,
 }
 
 void
-gs_page_set_app_permission (GsPage *page, GsApp *app, GsPermission *permission, gboolean value, GCancellable 
*cancellable)
+gs_page_set_app_permission (GsPage *page, GsApp *app, GsPermission *permission, GsPermissionValue *value, 
GCancellable *cancellable)
 {
        GsPagePrivate *priv = gs_page_get_instance_private (page);
        g_autoptr(GsPluginJob) plugin_job = NULL;
diff --git a/src/gs-page.h b/src/gs-page.h
index df1b0ee..ab6f899 100644
--- a/src/gs-page.h
+++ b/src/gs-page.h
@@ -70,11 +70,11 @@ void                 gs_page_update_app                     (GsPage         *page,
 void            gs_page_launch_app                     (GsPage         *page,
                                                         GsApp          *app,
                                                         GCancellable   *cancellable);
-void            gs_page_set_app_permission             (GsPage         *page,
-                                                        GsApp          *app,
-                                                        GsPermission   *permission,
-                                                        gboolean        value,
-                                                        GCancellable   *cancellable);
+void            gs_page_set_app_permission             (GsPage                 *page,
+                                                        GsApp                  *app,
+                                                        GsPermission           *permission,
+                                                        GsPermissionValue      *value,
+                                                        GCancellable           *cancellable);
 void            gs_page_shortcut_add                   (GsPage         *page,
                                                         GsApp          *app,
                                                         GCancellable   *cancellable);
diff --git a/src/gs-permission-dialog.c b/src/gs-permission-dialog.c
index 2740ca8..24e2127 100644
--- a/src/gs-permission-dialog.c
+++ b/src/gs-permission-dialog.c
@@ -80,7 +80,7 @@ gs_permission_dialog_class_init (GsPermissionDialogClass *klass)
                              G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
                              0,
                              NULL, NULL, g_cclosure_marshal_generic,
-                             G_TYPE_NONE, 2, GS_TYPE_PERMISSION, G_TYPE_BOOLEAN);
+                             G_TYPE_NONE, 2, GS_TYPE_PERMISSION, GS_TYPE_PERMISSION_VALUE);
 
        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/Software/gs-permission-dialog.ui");
 
@@ -89,7 +89,7 @@ gs_permission_dialog_class_init (GsPermissionDialogClass *klass)
 }
 
 static void
-switch_changed_cb (GsPermissionSwitch *sw, gboolean value, GsPermissionDialog *dialog)
+switch_changed_cb (GsPermissionSwitch *sw, GsPermissionValue *value, GsPermissionDialog *dialog)
 {
        g_signal_emit (dialog, signals[SIGNAL_PERMISSION_CHANGED], 0,
                       gs_permission_switch_get_permission (sw),
diff --git a/src/gs-permission-switch.c b/src/gs-permission-switch.c
index 3ba85ac..ea41969 100644
--- a/src/gs-permission-switch.c
+++ b/src/gs-permission-switch.c
@@ -49,8 +49,11 @@ gs_permission_switch_get_permission (GsPermissionSwitch *sw)
 static void
 active_changed_cb (GsPermissionSwitch *sw)
 {
+       GsPermissionValue *value;
+
+       value = g_ptr_array_index (gs_permission_get_values (sw->permission), 0);
        g_signal_emit (sw, signals[SIGNAL_CHANGED], 0,
-                      gtk_switch_get_active (GTK_SWITCH (sw)));
+                      gtk_switch_get_active (GTK_SWITCH (sw)) ? value : NULL);
 }
 
 static void
@@ -75,7 +78,7 @@ gs_permission_switch_class_init (GsPermissionSwitchClass *klass)
                              G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
                              0,
                              NULL, NULL, g_cclosure_marshal_generic,
-                             G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+                             G_TYPE_NONE, 1, GS_TYPE_PERMISSION_VALUE);
 }
 
 static void
@@ -90,7 +93,7 @@ gs_permission_switch_new (GsPermission *permission)
 
        sw = g_object_new (GS_TYPE_PERMISSION_SWITCH, NULL);
        sw->permission = g_object_ref (permission);
-       gtk_switch_set_active (GTK_SWITCH (sw), gs_permission_get_enabled (permission));
+       gtk_switch_set_active (GTK_SWITCH (sw), gs_permission_get_value (permission) != NULL);
        g_signal_connect (sw, "notify::active", G_CALLBACK (active_changed_cb), NULL);
 
        return sw;


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