[libsecret] Simpler way to use custom service/collection/item types



commit d6367b1de0985005f576440abdad7bee34f093f4
Author: Stef Walter <stefw gnome org>
Date:   Fri Jun 21 12:35:54 2013 +0200

    Simpler way to use custom service/collection/item types
    
    The previous way of setting collection_gtype and item_gtype
    on SecretServiceClass was not very bindings friendly. Instead
    allow per instance virtual functions to return the GTypes.

 libsecret/secret-paths.c   |    8 ++--
 libsecret/secret-service.c |   76 ++++++++++++++++++++++++++++++++++++++++++++
 libsecret/secret-service.h |   10 +++++-
 3 files changed, 89 insertions(+), 5 deletions(-)
---
diff --git a/libsecret/secret-paths.c b/libsecret/secret-paths.c
index deed0d4..49ebe26 100644
--- a/libsecret/secret-paths.c
+++ b/libsecret/secret-paths.c
@@ -74,7 +74,7 @@ secret_collection_new_for_dbus_path (SecretService *service,
 
        proxy = G_DBUS_PROXY (service);
 
-       g_async_initable_new_async (SECRET_SERVICE_GET_CLASS (service)->collection_gtype,
+       g_async_initable_new_async (secret_service_get_collection_gtype (service),
                                    G_PRIORITY_DEFAULT, cancellable, callback, user_data,
                                    "g-flags", G_DBUS_CALL_FLAGS_NONE,
                                    "g-interface-info", _secret_gen_collection_interface_info (),
@@ -154,7 +154,7 @@ secret_collection_new_for_dbus_path_sync (SecretService *service,
 
        proxy = G_DBUS_PROXY (service);
 
-       return g_initable_new (SECRET_SERVICE_GET_CLASS (service)->collection_gtype,
+       return g_initable_new (secret_service_get_collection_gtype (service),
                               cancellable, error,
                               "g-flags", G_DBUS_CALL_FLAGS_NONE,
                               "g-interface-info", _secret_gen_collection_interface_info (),
@@ -199,7 +199,7 @@ secret_item_new_for_dbus_path (SecretService *service,
 
        proxy = G_DBUS_PROXY (service);
 
-       g_async_initable_new_async (SECRET_SERVICE_GET_CLASS (service)->item_gtype,
+       g_async_initable_new_async (secret_service_get_item_gtype (service),
                                    G_PRIORITY_DEFAULT, cancellable, callback, user_data,
                                    "g-flags", G_DBUS_CALL_FLAGS_NONE,
                                    "g-interface-info", _secret_gen_item_interface_info (),
@@ -276,7 +276,7 @@ secret_item_new_for_dbus_path_sync (SecretService *service,
 
        proxy = G_DBUS_PROXY (service);
 
-       return g_initable_new (SECRET_SERVICE_GET_CLASS (service)->item_gtype,
+       return g_initable_new (secret_service_get_item_gtype (service),
                               cancellable, error,
                               "g-flags", G_DBUS_CALL_FLAGS_NONE,
                               "g-interface-info", _secret_gen_item_interface_info (),
diff --git a/libsecret/secret-service.c b/libsecret/secret-service.c
index a6df85e..55a4e21 100644
--- a/libsecret/secret-service.c
+++ b/libsecret/secret-service.c
@@ -496,6 +496,24 @@ secret_service_signal (GDBusProxy *proxy,
        g_variant_unref (paths);
 }
 
+static GType
+secret_service_real_get_collection_gtype (SecretService *self)
+{
+       SecretServiceClass *klass;
+
+       klass = SECRET_SERVICE_GET_CLASS (self);
+       return klass->collection_gtype;
+}
+
+static GType
+secret_service_real_get_item_gtype (SecretService *self)
+{
+       SecretServiceClass *klass;
+
+       klass = SECRET_SERVICE_GET_CLASS (self);
+       return klass->item_gtype;
+}
+
 static void
 secret_service_class_init (SecretServiceClass *klass)
 {
@@ -516,6 +534,8 @@ secret_service_class_init (SecretServiceClass *klass)
 
        klass->item_gtype = SECRET_TYPE_ITEM;
        klass->collection_gtype = SECRET_TYPE_COLLECTION;
+       klass->get_item_gtype = secret_service_real_get_item_gtype;
+       klass->get_collection_gtype = secret_service_real_get_collection_gtype;
 
        /**
         * SecretService:flags:
@@ -1729,3 +1749,59 @@ secret_service_prompt_finish (SecretService *self,
 
        return (klass->prompt_finish) (self, result, return_type, error);
 }
+
+/**
+ * secret_service_get_collection_gtype:
+ * @self: the secret service
+ *
+ * Get the GObject type for collections instantiated by this service.
+ * This will always be either #SecretCollection or derived from it.
+ *
+ * Returns: the gobject type for collections
+ */
+GType
+secret_service_get_collection_gtype (SecretService *self)
+{
+       SecretServiceClass *klass;
+       GType type;
+
+       g_return_val_if_fail (SECRET_IS_SERVICE (self), 0);
+
+       klass = SECRET_SERVICE_GET_CLASS (self);
+       g_return_val_if_fail (klass->get_collection_gtype != NULL,
+                             SECRET_TYPE_COLLECTION);
+
+       type = (klass->get_collection_gtype) (self);
+       g_return_val_if_fail (g_type_is_a (type, SECRET_TYPE_COLLECTION),
+                             SECRET_TYPE_COLLECTION);
+
+       return type;
+}
+
+/**
+ * secret_service_get_item_gtype:
+ * @self: the collection
+ *
+ * Get the GObject type for items instantiated by this collection.
+ * This will always be either #SecretItem or derived from it.
+ *
+ * Returns: the gobject type for items
+ */
+GType
+secret_service_get_item_gtype (SecretService *self)
+{
+       SecretServiceClass *klass;
+       GType type;
+
+       g_return_val_if_fail (SECRET_IS_SERVICE (self), 0);
+
+       klass = SECRET_SERVICE_GET_CLASS (self);
+       g_return_val_if_fail (klass->get_item_gtype != NULL,
+                             SECRET_TYPE_ITEM);
+
+       type = (klass->get_item_gtype) (self);
+       g_return_val_if_fail (g_type_is_a (type, SECRET_TYPE_ITEM),
+                             SECRET_TYPE_ITEM);
+
+       return type;
+}
diff --git a/libsecret/secret-service.h b/libsecret/secret-service.h
index cb11ff6..bceaf92 100644
--- a/libsecret/secret-service.h
+++ b/libsecret/secret-service.h
@@ -84,12 +84,20 @@ struct _SecretServiceClass {
                                          const GVariantType *return_type,
                                          GError **error);
 
+       GType       (* get_collection_gtype)  (SecretService *self);
+
+       GType       (* get_item_gtype)        (SecretService *self);
+
        /*< private >*/
-       gpointer padding[16];
+       gpointer padding[14];
 };
 
 GType                secret_service_get_type                      (void) G_GNUC_CONST;
 
+GType                secret_service_get_collection_gtype          (SecretService *self);
+
+GType                secret_service_get_item_gtype                (SecretService *self);
+
 void                 secret_service_get                           (SecretServiceFlags flags,
                                                                    GCancellable *cancellable,
                                                                    GAsyncReadyCallback callback,


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