From d6367b1de0985005f576440abdad7bee34f093f4 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Fri, 21 Jun 2013 12:35:54 +0200 Subject: [PATCH] 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,