[libsecret] Add secret_collection_load_items()



commit 153dfcec5ff7f9799ae6bbd1d053fa58cc49eb7e
Author: Stef Walter <stefw gnome org>
Date:   Thu Jul 5 21:26:20 2012 +0200

    Add secret_collection_load_items()
    
     * And flags to prevent loading of items when creating a
       SecretCollection object
     * Rename secret_service_ensure_collections() to
       secret_service_load_collections()

 docs/reference/libsecret/libsecret-sections.txt |   13 +-
 library/secret-collection.c                     |  465 +++++++++++++++--------
 library/secret-collection.h                     |   22 +
 library/secret-methods.c                        |    4 +-
 library/secret-service.c                        |   64 ++--
 library/secret-service.h                        |    6 +-
 library/tests/test-collection.c                 |   46 ++-
 library/tests/test-item.c                       |    6 +-
 library/tests/test-methods.c                    |    9 +-
 library/tests/test-service.c                    |    6 +-
 10 files changed, 417 insertions(+), 224 deletions(-)
---
diff --git a/docs/reference/libsecret/libsecret-sections.txt b/docs/reference/libsecret/libsecret-sections.txt
index 805ee22..d53e2db 100644
--- a/docs/reference/libsecret/libsecret-sections.txt
+++ b/docs/reference/libsecret/libsecret-sections.txt
@@ -3,9 +3,13 @@
 <INCLUDE>secret/secret-unstable.h</INCLUDE>
 SecretCollection
 SecretCollectionClass
+SecretCollectionFlags
 secret_collection_new
 secret_collection_new_finish
 secret_collection_new_sync
+secret_collection_load_items
+secret_collection_load_items_finish
+secret_collection_load_items_sync
 secret_collection_create
 secret_collection_create_finish
 secret_collection_create_sync
@@ -14,6 +18,7 @@ secret_collection_delete_finish
 secret_collection_delete_sync
 secret_collection_get_created
 secret_collection_get_service
+secret_collection_get_flags
 secret_collection_get_items
 secret_collection_get_label
 secret_collection_set_label
@@ -29,8 +34,10 @@ SECRET_COLLECTION_GET_CLASS
 SECRET_IS_COLLECTION
 SECRET_IS_COLLECTION_CLASS
 SECRET_TYPE_COLLECTION
+SECRET_TYPE_COLLECTION_FLAGS
 SecretCollectionPrivate
 secret_collection_get_type
+secret_collection_flags_get_type
 </SECTION>
 
 <SECTION>
@@ -183,9 +190,9 @@ secret_service_get_session_path
 secret_service_ensure_session
 secret_service_ensure_session_finish
 secret_service_ensure_session_sync
-secret_service_ensure_collections
-secret_service_ensure_collections_finish
-secret_service_ensure_collections_sync
+secret_service_load_collections
+secret_service_load_collections_finish
+secret_service_load_collections_sync
 SecretSearchFlags
 secret_service_search
 secret_service_search_finish
diff --git a/library/secret-collection.c b/library/secret-collection.c
index 95e8b22..cdf87b2 100644
--- a/library/secret-collection.c
+++ b/library/secret-collection.c
@@ -16,6 +16,7 @@
 
 #include "secret-collection.h"
 #include "secret-dbus-generated.h"
+#include "secret-enum-types.h"
 #include "secret-item.h"
 #include "secret-paths.h"
 #include "secret-private.h"
@@ -55,9 +56,20 @@
  * The class for #SecretCollection.
  */
 
+/**
+ * SecretCollectionFlags:
+ * @SECRET_COLLECTION_NONE: no flags for initializing the #SecretCollection
+ * @SECRET_COLLECTION_LOAD_ITEMS: load items while initializing the
+ *                                #SecretCollection
+ *
+ * Flags which determine which parts of the #SecretCollection proxy are initialized
+ * during a secret_collection_new() or secret_collection_new_sync() operation.
+ */
+
 enum {
 	PROP_0,
 	PROP_SERVICE,
+	PROP_FLAGS,
 	PROP_ITEMS,
 	PROP_LABEL,
 	PROP_LOCKED,
@@ -70,6 +82,7 @@ struct _SecretCollectionPrivate {
 	SecretService *service;
 	GCancellable *cancellable;
 	gboolean constructing;
+	SecretCollectionFlags init_flags;
 
 	/* Protected by mutex */
 	GMutex mutex;
@@ -141,6 +154,9 @@ secret_collection_set_property (GObject *obj,
 			g_object_add_weak_pointer (G_OBJECT (self->pv->service),
 			                           (gpointer *)&self->pv->service);
 		break;
+	case PROP_FLAGS:
+		self->pv->init_flags = g_value_get_flags (value);
+		break;
 	case PROP_LABEL:
 		secret_collection_set_label (self, g_value_get_string (value),
 		                             self->pv->cancellable, on_set_label,
@@ -164,6 +180,9 @@ secret_collection_get_property (GObject *obj,
 	case PROP_SERVICE:
 		g_value_set_object (value, self->pv->service);
 		break;
+	case PROP_FLAGS:
+		g_value_set_flags (value, secret_collection_get_flags (self));
+		break;
 	case PROP_ITEMS:
 		g_value_take_boxed (value, secret_collection_get_items (self));
 		break;
@@ -245,175 +264,33 @@ collection_update_items (SecretCollection *self,
 	g_object_notify (G_OBJECT (self), "items");
 }
 
-typedef struct {
-	GCancellable *cancellable;
-	GHashTable *items;
-	gint items_loading;
-} ItemsClosure;
-
-static void
-items_closure_free (gpointer data)
-{
-	ItemsClosure *closure = data;
-	g_clear_object (&closure->cancellable);
-	g_hash_table_unref (closure->items);
-	g_slice_free (ItemsClosure, closure);
-}
-
-static void
-on_load_item (GObject *source,
-              GAsyncResult *result,
-              gpointer user_data)
-{
-	GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
-	ItemsClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
-	SecretCollection *self = SECRET_COLLECTION (g_async_result_get_source_object (user_data));
-	const gchar *path;
-	GError *error = NULL;
-	SecretItem *item;
-
-	closure->items_loading--;
-
-	item = secret_item_new_finish (result, &error);
-
-	if (error != NULL)
-		g_simple_async_result_take_error (res, error);
-
-	if (item != NULL) {
-		path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (item));
-		g_hash_table_insert (closure->items, g_strdup (path), item);
-	}
-
-	if (closure->items_loading == 0) {
-		collection_update_items (self, closure->items);
-		g_simple_async_result_complete_in_idle (res);
-	}
-
-	g_object_unref (self);
-	g_object_unref (res);
-}
-
-static void
-collection_load_items_async (SecretCollection *self,
-                             GCancellable *cancellable,
-                             GAsyncReadyCallback callback,
-                             gpointer user_data)
-{
-	ItemsClosure *closure;
-	SecretItem *item;
-	GSimpleAsyncResult *res;
-	const gchar *path;
-	GVariant *paths;
-	GVariantIter iter;
-
-	paths = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Items");
-	g_return_if_fail (paths != NULL);
-
-	res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-	                                 collection_load_items_async);
-	closure = g_slice_new0 (ItemsClosure);
-	closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
-	closure->items = items_table_new ();
-	g_simple_async_result_set_op_res_gpointer (res, closure, items_closure_free);
-
-	g_variant_iter_init (&iter, paths);
-	while (g_variant_iter_loop (&iter, "&o", &path)) {
-		item = collection_lookup_item (self, path);
-
-		/* No such collection yet create a new one */
-		if (item == NULL) {
-			secret_item_new (self->pv->service, path, SECRET_ITEM_NONE,
-			                 cancellable, on_load_item, g_object_ref (res));
-			closure->items_loading++;
-
-		} else {
-			g_hash_table_insert (closure->items, g_strdup (path), item);
-		}
-	}
-
-	if (closure->items_loading == 0) {
-		collection_update_items (self, closure->items);
-		g_simple_async_result_complete_in_idle (res);
-	}
-
-	g_variant_unref (paths);
-	g_object_unref (res);
-}
-
-static gboolean
-collection_load_items_finish (SecretCollection *self,
-                              GAsyncResult *result,
-                              GError **error)
-{
-	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
-		return FALSE;
-
-	return TRUE;
-}
-
-
-static gboolean
-collection_load_items_sync (SecretCollection *self,
-                            GCancellable *cancellable,
-                            GError **error)
-{
-	SecretItem *item;
-	GHashTable *items;
-	GVariant *paths;
-	GVariantIter iter;
-	const gchar *path;
-	gboolean ret = TRUE;
-
-	paths = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Items");
-	g_return_val_if_fail (paths != NULL, FALSE);
-
-	items = items_table_new ();
-
-	g_variant_iter_init (&iter, paths);
-	while (g_variant_iter_next (&iter, "&o", &path)) {
-		item = collection_lookup_item (self, path);
-
-		/* No such collection yet create a new one */
-		if (item == NULL) {
-			item = secret_item_new_sync (self->pv->service, path,
-			                             SECRET_ITEM_NONE,
-			                             cancellable, error);
-			if (item == NULL) {
-				ret = FALSE;
-				break;
-			}
-		}
-
-		g_hash_table_insert (items, g_strdup (path), item);
-	}
-
-	if (ret)
-		collection_update_items (self, items);
-
-	g_hash_table_unref (items);
-	g_variant_unref (paths);
-	return ret;
-}
-
 static void
 handle_property_changed (SecretCollection *self,
                          const gchar *property_name,
                          GVariant *value)
 {
-	if (g_str_equal (property_name, "Label"))
+	gboolean perform;
+
+	if (g_str_equal (property_name, "Label")) {
 		g_object_notify (G_OBJECT (self), "label");
 
-	else if (g_str_equal (property_name, "Locked"))
+	} else if (g_str_equal (property_name, "Locked")) {
 		g_object_notify (G_OBJECT (self), "locked");
 
-	else if (g_str_equal (property_name, "Created"))
+	} else if (g_str_equal (property_name, "Created")) {
 		g_object_notify (G_OBJECT (self), "created");
 
-	else if (g_str_equal (property_name, "Modified"))
+	} else if (g_str_equal (property_name, "Modified")) {
 		g_object_notify (G_OBJECT (self), "modified");
 
-	else if (g_str_equal (property_name, "Items") && !self->pv->constructing)
-		collection_load_items_async (self, self->pv->cancellable, NULL, NULL);
+	} else if (g_str_equal (property_name, "Items") && !self->pv->constructing) {
+		g_mutex_lock (&self->pv->mutex);
+		perform = self->pv->items != NULL;
+		g_mutex_unlock (&self->pv->mutex);
+
+		if (perform)
+			secret_collection_load_items (self, self->pv->cancellable, NULL, NULL);
+	}
 }
 
 static void
@@ -543,6 +420,17 @@ secret_collection_class_init (SecretCollectionClass *klass)
 	                                 SECRET_TYPE_SERVICE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
 
 	/**
+	 * SecretCollection:flags:
+	 *
+	 * A set of flags describing which parts of the secret collection have
+	 * been initialized.
+	 */
+	g_object_class_install_property (gobject_class, PROP_FLAGS,
+	             g_param_spec_flags ("flags", "Flags", "Collection flags",
+	                                 secret_collection_flags_get_type (), SECRET_COLLECTION_NONE,
+	                                 G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+	/**
 	 * SecretCollection:items:
 	 *
 	 * A list of #SecretItem objects representing the items that are in
@@ -622,8 +510,10 @@ secret_collection_initable_init (GInitable *initable,
 
 	self = SECRET_COLLECTION (initable);
 
-	if (!collection_load_items_sync (self, cancellable, error))
-		return FALSE;
+	if (self->pv->init_flags & SECRET_COLLECTION_LOAD_ITEMS) {
+		if (!secret_collection_load_items_sync (self, cancellable, error))
+			return FALSE;
+	}
 
 	self->pv->constructing = FALSE;
 	return TRUE;
@@ -658,7 +548,7 @@ on_init_items (GObject *source,
 	SecretCollection *self = SECRET_COLLECTION (source);
 	GError *error = NULL;
 
-	if (!collection_load_items_finish (self, result, &error))
+	if (!secret_collection_load_items_finish (self, result, &error))
 		g_simple_async_result_take_error (res, error);
 
 	g_simple_async_result_complete (res);
@@ -687,9 +577,12 @@ on_init_base (GObject *source,
 		                                 g_dbus_proxy_get_object_path (proxy));
 		g_simple_async_result_complete (res);
 
+	} else if (self->pv->init_flags & SECRET_COLLECTION_LOAD_ITEMS) {
+		secret_collection_load_items (self, closure->cancellable,
+		                              on_init_items, g_object_ref (res));
+
 	} else {
-		collection_load_items_async (self, closure->cancellable,
-		                             on_init_items, g_object_ref (res));
+		g_simple_async_result_complete (res);
 	}
 
 	g_object_unref (res);
@@ -749,6 +642,7 @@ secret_collection_async_initable_iface (GAsyncInitableIface *iface)
  * secret_collection_new:
  * @service: a secret service object
  * @collection_path: the D-Bus path of the collection
+ * @flags: options for the collection initialization
  * @cancellable: optional cancellation object
  * @callback: called when the operation completes
  * @user_data: data to be passed to the callback
@@ -760,6 +654,7 @@ secret_collection_async_initable_iface (GAsyncInitableIface *iface)
 void
 secret_collection_new (SecretService *service,
                        const gchar *collection_path,
+                       SecretCollectionFlags flags,
                        GCancellable *cancellable,
                        GAsyncReadyCallback callback,
                        gpointer user_data)
@@ -781,6 +676,7 @@ secret_collection_new (SecretService *service,
 	                            "g-object-path", collection_path,
 	                            "g-interface-name", SECRET_COLLECTION_INTERFACE,
 	                            "service", service,
+	                            "flags", flags,
 	                            NULL);
 }
 
@@ -820,6 +716,7 @@ secret_collection_new_finish (GAsyncResult *result,
  * secret_collection_new_sync:
  * @service: a secret service object
  * @collection_path: the D-Bus path of the collection
+ * @flags: options for the collection initialization
  * @cancellable: optional cancellation object
  * @error: location to place an error on failure
  *
@@ -834,6 +731,7 @@ secret_collection_new_finish (GAsyncResult *result,
 SecretCollection *
 secret_collection_new_sync (SecretService *service,
                             const gchar *collection_path,
+                            SecretCollectionFlags flags,
                             GCancellable *cancellable,
                             GError **error)
 {
@@ -855,9 +753,218 @@ secret_collection_new_sync (SecretService *service,
 	                       "g-object-path", collection_path,
 	                       "g-interface-name", SECRET_COLLECTION_INTERFACE,
 	                       "service", service,
+	                       "flags", flags,
 	                       NULL);
 }
 
+typedef struct {
+	GCancellable *cancellable;
+	GHashTable *items;
+	gint items_loading;
+} ItemsClosure;
+
+static void
+items_closure_free (gpointer data)
+{
+	ItemsClosure *closure = data;
+	g_clear_object (&closure->cancellable);
+	g_hash_table_unref (closure->items);
+	g_slice_free (ItemsClosure, closure);
+}
+
+static void
+on_load_item (GObject *source,
+              GAsyncResult *result,
+              gpointer user_data)
+{
+	GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
+	ItemsClosure *closure = g_simple_async_result_get_op_res_gpointer (res);
+	SecretCollection *self = SECRET_COLLECTION (g_async_result_get_source_object (user_data));
+	const gchar *path;
+	GError *error = NULL;
+	SecretItem *item;
+
+	closure->items_loading--;
+
+	item = secret_item_new_finish (result, &error);
+
+	if (error != NULL)
+		g_simple_async_result_take_error (res, error);
+
+	if (item != NULL) {
+		path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (item));
+		g_hash_table_insert (closure->items, g_strdup (path), item);
+	}
+
+	if (closure->items_loading == 0) {
+		collection_update_items (self, closure->items);
+		g_simple_async_result_complete_in_idle (res);
+	}
+
+	g_object_unref (self);
+	g_object_unref (res);
+}
+
+/**
+ * secret_collection_load_items:
+ * @self: the secret collection
+ * @cancellable: optional cancellation object
+ * @callback: called when the operation completes
+ * @user_data: data to be passed to the callback
+ *
+ * Ensure that the #SecretCollection proxy has loaded all the items present
+ * in the Secret Service. This affects the result of
+ * secret_collection_get_items().
+ *
+ * You can also pass the %SECRET_COLLECTION_LOAD_ITEMS to
+ * secret_collection_new() in order to ensure that the collections have been
+ * loaded by the time you get the #SecretCollection proxy.
+ *
+ * This method will return immediately and complete asynchronously.
+ */
+void
+secret_collection_load_items (SecretCollection *self,
+                              GCancellable *cancellable,
+                              GAsyncReadyCallback callback,
+                              gpointer user_data)
+{
+	ItemsClosure *closure;
+	SecretItem *item;
+	GSimpleAsyncResult *res;
+	const gchar *path;
+	GVariant *paths;
+	GVariantIter iter;
+
+	g_return_if_fail (SECRET_IS_COLLECTION (self));
+	g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+
+	paths = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Items");
+	g_return_if_fail (paths != NULL);
+
+	res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
+	                                 secret_collection_load_items);
+	closure = g_slice_new0 (ItemsClosure);
+	closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
+	closure->items = items_table_new ();
+	g_simple_async_result_set_op_res_gpointer (res, closure, items_closure_free);
+
+	g_variant_iter_init (&iter, paths);
+	while (g_variant_iter_loop (&iter, "&o", &path)) {
+		item = collection_lookup_item (self, path);
+
+		/* No such collection yet create a new one */
+		if (item == NULL) {
+			secret_item_new (self->pv->service, path, SECRET_ITEM_NONE,
+			                 cancellable, on_load_item, g_object_ref (res));
+			closure->items_loading++;
+
+		} else {
+			g_hash_table_insert (closure->items, g_strdup (path), item);
+		}
+	}
+
+	if (closure->items_loading == 0) {
+		collection_update_items (self, closure->items);
+		g_simple_async_result_complete_in_idle (res);
+	}
+
+	g_variant_unref (paths);
+	g_object_unref (res);
+}
+
+/**
+ * secret_collection_load_items_finish:
+ * @self: the secret collection
+ * @result: the asynchronous result passed to the callback
+ * @error: location to place an error on failure
+ *
+ * Complete an asynchronous operation to ensure that the #SecretCollection proxy
+ * has loaded all the items present in the Secret Service.
+ *
+ * Returns: whether the load was successful or not
+ */
+gboolean
+secret_collection_load_items_finish (SecretCollection *self,
+                                     GAsyncResult *result,
+                                     GError **error)
+{
+	g_return_val_if_fail (SECRET_IS_COLLECTION (self), FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+	g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
+	                      secret_collection_load_items), FALSE);
+
+	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
+		return FALSE;
+
+	return TRUE;
+}
+
+/**
+ * secret_collection_load_items_sync:
+ * @self: the secret collection
+ * @cancellable: optional cancellation object
+ * @error: location to place an error on failure
+ *
+ * Ensure that the #SecretCollection proxy has loaded all the items present
+ * in the Secret Service. This affects the result of
+ * secret_collection_get_items().
+ *
+ * You can also pass the %SECRET_COLLECTION_LOAD_ITEMS to
+ * secret_collection_new_sync() in order to ensure that the items have been
+ * loaded by the time you get the #SecretCollection proxy.
+ *
+ * This method may block indefinitely and should not be used in user interface
+ * threads.
+ *
+ * Returns: whether the load was successful or not
+ */
+gboolean
+secret_collection_load_items_sync (SecretCollection *self,
+                                   GCancellable *cancellable,
+                                   GError **error)
+{
+	SecretItem *item;
+	GHashTable *items;
+	GVariant *paths;
+	GVariantIter iter;
+	const gchar *path;
+	gboolean ret = TRUE;
+
+	g_return_val_if_fail (SECRET_IS_COLLECTION (self), FALSE);
+	g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
+	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+	paths = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (self), "Items");
+	g_return_val_if_fail (paths != NULL, FALSE);
+
+	items = items_table_new ();
+
+	g_variant_iter_init (&iter, paths);
+	while (g_variant_iter_next (&iter, "&o", &path)) {
+		item = collection_lookup_item (self, path);
+
+		/* No such collection yet create a new one */
+		if (item == NULL) {
+			item = secret_item_new_sync (self->pv->service, path,
+			                             SECRET_ITEM_NONE,
+			                             cancellable, error);
+			if (item == NULL) {
+				ret = FALSE;
+				break;
+			}
+		}
+
+		g_hash_table_insert (items, g_strdup (path), item);
+	}
+
+	if (ret)
+		collection_update_items (self, items);
+
+	g_hash_table_unref (items);
+	g_variant_unref (paths);
+	return ret;
+}
+
 /**
  * secret_collection_refresh:
  * @self: the collection
@@ -922,7 +1029,8 @@ on_create_path (GObject *source,
 
 	path = secret_service_create_collection_path_finish (service, result, &error);
 	if (error == NULL) {
-		secret_collection_new (service, path, closure->cancellable,
+		secret_collection_new (service, path, SECRET_COLLECTION_LOAD_ITEMS,
+		                       closure->cancellable,
 		                       on_create_collection, g_object_ref (res));
 	} else {
 		g_simple_async_result_take_error (res, error);
@@ -1082,7 +1190,9 @@ secret_collection_create_sync (SecretService *service,
 	if (path == NULL)
 		return NULL;
 
-	collection = secret_collection_new_sync (service, path, cancellable, error);
+	collection = secret_collection_new_sync (service, path,
+	                                         SECRET_COLLECTION_LOAD_ITEMS,
+	                                         cancellable, error);
 	g_free (path);
 
 	return collection;
@@ -1221,6 +1331,35 @@ secret_collection_get_service (SecretCollection *self)
 }
 
 /**
+ * secret_collection_get_flags:
+ * @self: the secret collection proxy
+ *
+ * Get the flags representing what features of the #SecretCollection proxy
+ * have been initialized.
+ *
+ * Use secret_collection_load_items()  to initialize further features
+ * and change the flags.
+ *
+ * Returns: the flags for features initialized
+ */
+SecretCollectionFlags
+secret_collection_get_flags (SecretCollection *self)
+{
+	SecretCollectionFlags flags = 0;
+
+	g_return_val_if_fail (SECRET_IS_COLLECTION (self), SECRET_COLLECTION_NONE);
+
+	g_mutex_lock (&self->pv->mutex);
+
+	if (self->pv->items)
+		flags |= SECRET_COLLECTION_LOAD_ITEMS;
+
+	g_mutex_unlock (&self->pv->mutex);
+
+	return flags;
+}
+
+/**
  * secret_collection_get_items:
  * @self: a collection
  *
diff --git a/library/secret-collection.h b/library/secret-collection.h
index 9f9b617..89fb111 100644
--- a/library/secret-collection.h
+++ b/library/secret-collection.h
@@ -25,6 +25,11 @@
 
 G_BEGIN_DECLS
 
+typedef enum {
+	SECRET_COLLECTION_NONE = 0,
+	SECRET_COLLECTION_LOAD_ITEMS = 1 << 1,
+} SecretCollectionFlags;
+
 #define SECRET_TYPE_COLLECTION            (secret_collection_get_type ())
 #define SECRET_COLLECTION(inst)           (G_TYPE_CHECK_INSTANCE_CAST ((inst), SECRET_TYPE_COLLECTION, SecretCollection))
 #define SECRET_COLLECTION_CLASS(class)    (G_TYPE_CHECK_CLASS_CAST ((class), SECRET_TYPE_COLLECTION, SecretCollectionClass))
@@ -53,6 +58,7 @@ GType               secret_collection_get_type                 (void) G_GNUC_CON
 
 void                secret_collection_new                      (SecretService *service,
                                                                 const gchar *collection_path,
+                                                                SecretCollectionFlags flags,
                                                                 GCancellable *cancellable,
                                                                 GAsyncReadyCallback callback,
                                                                 gpointer user_data);
@@ -62,6 +68,20 @@ SecretCollection *  secret_collection_new_finish               (GAsyncResult *re
 
 SecretCollection *  secret_collection_new_sync                 (SecretService *service,
                                                                 const gchar *collection_path,
+                                                                SecretCollectionFlags flags,
+                                                                GCancellable *cancellable,
+                                                                GError **error);
+
+void                secret_collection_load_items               (SecretCollection *self,
+                                                                GCancellable *cancellable,
+                                                                GAsyncReadyCallback callback,
+                                                                gpointer user_data);
+
+gboolean            secret_collection_load_items_finish        (SecretCollection *self,
+                                                                GAsyncResult *result,
+                                                                GError **error);
+
+gboolean            secret_collection_load_items_sync          (SecretCollection *self,
                                                                 GCancellable *cancellable,
                                                                 GError **error);
 
@@ -98,6 +118,8 @@ gboolean            secret_collection_delete_sync              (SecretCollection
 
 SecretService *     secret_collection_get_service              (SecretCollection *self);
 
+SecretCollectionFlags secret_collection_get_flags              (SecretCollection *self);
+
 GList *             secret_collection_get_items                (SecretCollection *self);
 
 gchar *             secret_collection_get_label                (SecretCollection *self);
diff --git a/library/secret-methods.c b/library/secret-methods.c
index aeeb614..d0e2558 100644
--- a/library/secret-methods.c
+++ b/library/secret-methods.c
@@ -1532,7 +1532,8 @@ on_read_alias_path (GObject *source,
 
 			/* No collection loaded, but valid path, load */
 			} else {
-				secret_collection_new (self, collection_path, read->cancellable,
+				secret_collection_new (self, collection_path, SECRET_COLLECTION_NONE,
+				                       read->cancellable,
 				                       on_read_alias_collection, g_object_ref (async));
 			}
 		}
@@ -1662,6 +1663,7 @@ secret_service_read_alias_sync (SecretService *self,
 		/* No collection loaded, but valid path, load */
 		if (collection == NULL) {
 			collection = secret_collection_new_sync (self, collection_path,
+			                                         SECRET_COLLECTION_LOAD_ITEMS,
 			                                         cancellable, error);
 		}
 	}
diff --git a/library/secret-service.c b/library/secret-service.c
index 9a6eb16..4a2a273 100644
--- a/library/secret-service.c
+++ b/library/secret-service.c
@@ -54,7 +54,7 @@
  * represent those collections while initializing a #SecretService then pass
  * the %SECRET_SERVICE_LOAD_COLLECTIONS flag to the secret_service_get() or
  * secret_service_new() functions. In order to establish a session on an already
- * existing #SecretService, use the secret_service_ensure_collections() function.
+ * existing #SecretService, use the secret_service_load_collections() function.
  * To access the list of collections use secret_service_get_collections().
  *
  * Certain actions on the Secret Service require user prompting to complete,
@@ -306,7 +306,7 @@ handle_property_changed (SecretService *self,
 		g_mutex_unlock (&self->pv->mutex);
 
 		if (perform)
-			secret_service_ensure_collections (self, self->pv->cancellable, NULL, NULL);
+			secret_service_load_collections (self, self->pv->cancellable, NULL, NULL);
 	}
 
 	g_variant_unref (value);
@@ -455,7 +455,7 @@ secret_service_class_init (SecretServiceClass *klass)
 	 *
 	 * To load the collections, specify the %SECRET_SERVICE_LOAD_COLLECTIONS
 	 * initialization flag when calling the secret_service_get() or
-	 * secret_service_new() functions. Or call the secret_service_ensure_collections()
+	 * secret_service_new() functions. Or call the secret_service_load_collections()
 	 * method.
 	 */
 	g_object_class_install_property (object_class, PROP_COLLECTIONS,
@@ -489,22 +489,22 @@ service_ensure_for_flags_sync (SecretService *self,
 			return FALSE;
 
 	if (flags & SECRET_SERVICE_LOAD_COLLECTIONS)
-		if (!secret_service_ensure_collections_sync (self, cancellable, error))
+		if (!secret_service_load_collections_sync (self, cancellable, error))
 			return FALSE;
 
 	return TRUE;
 }
 
 static void
-on_ensure_collections (GObject *source,
-                       GAsyncResult *result,
-                       gpointer user_data)
+on_load_collections (GObject *source,
+                     GAsyncResult *result,
+                     gpointer user_data)
 {
 	GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
 	SecretService *self = SECRET_SERVICE (source);
 	GError *error = NULL;
 
-	if (!secret_service_ensure_collections_finish (self, result, &error))
+	if (!secret_service_load_collections_finish (self, result, &error))
 		g_simple_async_result_take_error (res, error);
 
 	g_simple_async_result_complete (res);
@@ -526,8 +526,8 @@ on_ensure_session (GObject *source,
 		g_simple_async_result_complete (res);
 
 	} else if (closure->flags & SECRET_SERVICE_LOAD_COLLECTIONS) {
-		secret_service_ensure_collections (self, closure->cancellable,
-		                                   on_ensure_collections, g_object_ref (res));
+		secret_service_load_collections (self, closure->cancellable,
+		                                 on_load_collections, g_object_ref (res));
 
 	} else {
 		g_simple_async_result_complete_in_idle (res);
@@ -550,8 +550,8 @@ service_ensure_for_flags_async (SecretService *self,
 		                               on_ensure_session, g_object_ref (res));
 
 	else if (closure->flags & SECRET_SERVICE_LOAD_COLLECTIONS)
-		secret_service_ensure_collections (self, closure->cancellable,
-		                                   on_ensure_collections, g_object_ref (res));
+		secret_service_load_collections (self, closure->cancellable,
+		                                 on_load_collections, g_object_ref (res));
 
 	else
 		g_simple_async_result_complete_in_idle (res);
@@ -973,7 +973,7 @@ secret_service_new_sync (GType service_gtype,
  * Get the flags representing what features of the #SecretService proxy
  * have been initialized.
  *
- * Use secret_service_ensure_session() or secret_service_ensure_collections()
+ * Use secret_service_ensure_session() or secret_service_load_collections()
  * to initialize further features and change the flags.
  *
  * Returns: the flags for features initialized
@@ -1006,7 +1006,7 @@ secret_service_get_flags (SecretService *self)
  *
  * If the %SECRET_SERVICE_LOAD_COLLECTIONS flag was not specified when
  * initializing #SecretService proxy object, then this method will return
- * %NULL. Use secret_service_ensure_collections() to load the collections.
+ * %NULL. Use secret_service_load_collections() to load the collections.
  *
  * Returns: (transfer full) (element-type Secret.Collection) (allow-none): a
  *          list of the collections in the secret service
@@ -1379,7 +1379,7 @@ on_ensure_collection (GObject *source,
 }
 
 /**
- * secret_service_ensure_collections:
+ * secret_service_load_collections:
  * @self: the secret service
  * @cancellable: optional cancellation object
  * @callback: called when the operation completes
@@ -1396,10 +1396,10 @@ on_ensure_collection (GObject *source,
  * This method will return immediately and complete asynchronously.
  */
 void
-secret_service_ensure_collections (SecretService *self,
-                                   GCancellable *cancellable,
-                                   GAsyncReadyCallback callback,
-                                   gpointer user_data)
+secret_service_load_collections (SecretService *self,
+                                 GCancellable *cancellable,
+                                 GAsyncReadyCallback callback,
+                                 gpointer user_data)
 {
 	EnsureClosure *closure;
 	SecretCollection *collection;
@@ -1415,7 +1415,7 @@ secret_service_ensure_collections (SecretService *self,
 	g_return_if_fail (paths != NULL);
 
 	res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
-	                                 secret_service_ensure_collections);
+	                                 secret_service_load_collections);
 	closure = g_slice_new0 (EnsureClosure);
 	closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
 	closure->collections = collections_table_new ();
@@ -1427,7 +1427,7 @@ secret_service_ensure_collections (SecretService *self,
 
 		/* No such collection yet create a new one */
 		if (collection == NULL) {
-			secret_collection_new (self, path, cancellable,
+			secret_collection_new (self, path, SECRET_COLLECTION_LOAD_ITEMS, cancellable,
 			                       on_ensure_collection, g_object_ref (res));
 			closure->collections_loading++;
 		} else {
@@ -1445,7 +1445,7 @@ secret_service_ensure_collections (SecretService *self,
 }
 
 /**
- * secret_service_ensure_collections_finish:
+ * secret_service_load_collections_finish:
  * @self: the secret service
  * @result: the asynchronous result passed to the callback
  * @error: location to place an error on failure
@@ -1456,14 +1456,14 @@ secret_service_ensure_collections (SecretService *self,
  * Returns: whether the load was successful or not
  */
 gboolean
-secret_service_ensure_collections_finish (SecretService *self,
-                                          GAsyncResult *result,
-                                          GError **error)
+secret_service_load_collections_finish (SecretService *self,
+                                        GAsyncResult *result,
+                                        GError **error)
 {
 	g_return_val_if_fail (SECRET_IS_SERVICE (self), FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 	g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
-	                      secret_service_ensure_collections), FALSE);
+	                      secret_service_load_collections), FALSE);
 
 	if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
 		return FALSE;
@@ -1472,7 +1472,7 @@ secret_service_ensure_collections_finish (SecretService *self,
 }
 
 /**
- * secret_service_ensure_collections_sync:
+ * secret_service_load_collections_sync:
  * @self: the secret service
  * @cancellable: optional cancellation object
  * @error: location to place an error on failure
@@ -1491,9 +1491,9 @@ secret_service_ensure_collections_finish (SecretService *self,
  * Returns: whether the load was successful or not
  */
 gboolean
-secret_service_ensure_collections_sync (SecretService *self,
-                                        GCancellable *cancellable,
-                                        GError **error)
+secret_service_load_collections_sync (SecretService *self,
+                                      GCancellable *cancellable,
+                                      GError **error)
 {
 	SecretCollection *collection;
 	GHashTable *collections;
@@ -1517,7 +1517,9 @@ secret_service_ensure_collections_sync (SecretService *self,
 
 		/* No such collection yet create a new one */
 		if (collection == NULL) {
-			collection = secret_collection_new_sync (self, path, cancellable, error);
+			collection = secret_collection_new_sync (self, path,
+			                                         SECRET_COLLECTION_LOAD_ITEMS,
+			                                         cancellable, error);
 			if (collection == NULL) {
 				ret = FALSE;
 				break;
diff --git a/library/secret-service.h b/library/secret-service.h
index 01de1df..6fae768 100644
--- a/library/secret-service.h
+++ b/library/secret-service.h
@@ -137,16 +137,16 @@ const gchar *        secret_service_ensure_session_sync           (SecretService
                                                                    GCancellable *cancellable,
                                                                    GError **error);
 
-void                 secret_service_ensure_collections            (SecretService *self,
+void                 secret_service_load_collections              (SecretService *self,
                                                                    GCancellable *cancellable,
                                                                    GAsyncReadyCallback callback,
                                                                    gpointer user_data);
 
-gboolean             secret_service_ensure_collections_finish     (SecretService *self,
+gboolean             secret_service_load_collections_finish       (SecretService *self,
                                                                    GAsyncResult *result,
                                                                    GError **error);
 
-gboolean             secret_service_ensure_collections_sync       (SecretService *self,
+gboolean             secret_service_load_collections_sync         (SecretService *self,
                                                                    GCancellable *cancellable,
                                                                    GError **error);
 
diff --git a/library/tests/test-collection.c b/library/tests/test-collection.c
index b3bc1c8..85acf8c 100644
--- a/library/tests/test-collection.c
+++ b/library/tests/test-collection.c
@@ -88,7 +88,8 @@ test_new_sync (Test *test,
 	GError *error = NULL;
 	SecretCollection *collection;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	g_assert_cmpstr (g_dbus_proxy_get_object_path (G_DBUS_PROXY (collection)), ==, collection_path);
@@ -106,7 +107,8 @@ test_new_async (Test *test,
 	SecretCollection *collection;
 	GAsyncResult *result = NULL;
 
-	secret_collection_new (test->service, collection_path, NULL, on_async_result, &result);
+	secret_collection_new (test->service, collection_path,
+	                       SECRET_COLLECTION_NONE, NULL, on_async_result, &result);
 	g_assert (result == NULL);
 
 	egg_test_wait ();
@@ -129,7 +131,8 @@ test_new_sync_noexist (Test *test,
 	GError *error = NULL;
 	SecretCollection *collection;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
 	g_assert (collection == NULL);
 }
@@ -143,7 +146,8 @@ test_new_async_noexist (Test *test,
 	SecretCollection *collection;
 	GAsyncResult *result = NULL;
 
-	secret_collection_new (test->service, collection_path, NULL, on_async_result, &result);
+	secret_collection_new (test->service, collection_path,
+	                       SECRET_COLLECTION_NONE, NULL, on_async_result, &result);
 	g_assert (result == NULL);
 
 	egg_test_wait ();
@@ -211,7 +215,8 @@ test_properties (Test *test,
 	gboolean locked;
 	gchar *label;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	g_assert (secret_collection_get_locked (collection) == FALSE);
@@ -281,7 +286,8 @@ test_items (Test *test,
 	GError *error = NULL;
 	GList *items;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_LOAD_ITEMS, NULL, &error);
 	g_assert_no_error (error);
 
 	items = secret_collection_get_items (collection);
@@ -312,7 +318,8 @@ test_items_empty (Test *test,
 	GError *error = NULL;
 	GList *items;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_LOAD_ITEMS, NULL, &error);
 	g_assert_no_error (error);
 
 	items = secret_collection_get_items (collection);
@@ -336,7 +343,9 @@ test_items_empty_async (Test *test,
 	GError *error = NULL;
 	GList *items;
 
-	secret_collection_new (test->service, collection_path, NULL, on_async_result, &result);
+	secret_collection_new (test->service, collection_path,
+	                       SECRET_COLLECTION_LOAD_ITEMS,
+	                       NULL, on_async_result, &result);
 	g_assert (result == NULL);
 
 	egg_test_wait ();
@@ -366,7 +375,8 @@ test_set_label_sync (Test *test,
 	gboolean ret;
 	gchar *label;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	label = secret_collection_get_label (collection);
@@ -395,7 +405,8 @@ test_set_label_async (Test *test,
 	gboolean ret;
 	gchar *label;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	label = secret_collection_get_label (collection);
@@ -429,7 +440,8 @@ test_set_label_prop (Test *test,
 	guint sigs = 2;
 	gchar *label;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	label = secret_collection_get_label (collection);
@@ -458,7 +470,8 @@ test_delete_sync (Test *test,
 	GError *error = NULL;
 	gboolean ret;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	ret = secret_collection_delete_sync (collection, NULL, &error);
@@ -467,7 +480,8 @@ test_delete_sync (Test *test,
 
 	g_object_unref (collection);
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
 	g_assert (collection == NULL);
 }
@@ -482,7 +496,8 @@ test_delete_async (Test *test,
 	GError *error = NULL;
 	gboolean ret;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	secret_collection_delete (collection, NULL, on_async_result, &result);
@@ -497,7 +512,8 @@ test_delete_async (Test *test,
 
 	g_object_unref (collection);
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
 	g_assert (collection == NULL);
 }
diff --git a/library/tests/test-item.c b/library/tests/test-item.c
index bf29584..d0c55c0 100644
--- a/library/tests/test-item.c
+++ b/library/tests/test-item.c
@@ -166,7 +166,8 @@ test_create_sync (Test *test,
 	GHashTable *attributes;
 	SecretValue *value;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	attributes = g_hash_table_new (g_str_hash, g_str_equal);
@@ -204,7 +205,8 @@ test_create_async (Test *test,
 	GHashTable *attributes;
 	SecretValue *value;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	attributes = g_hash_table_new (g_str_hash, g_str_equal);
diff --git a/library/tests/test-methods.c b/library/tests/test-methods.c
index b7a5ccc..0cefcd4 100644
--- a/library/tests/test-methods.c
+++ b/library/tests/test-methods.c
@@ -397,7 +397,8 @@ test_lock_sync (Test *test,
 	GList *objects;
 	gboolean ret;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	objects = g_list_append (NULL, collection);
@@ -426,7 +427,8 @@ test_unlock_sync (Test *test,
 	GList *objects;
 	gboolean ret;
 
-	collection = secret_collection_new_sync (test->service, collection_path, NULL, &error);
+	collection = secret_collection_new_sync (test->service, collection_path,
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 
 	objects = g_list_append (NULL, collection);
@@ -922,7 +924,8 @@ test_set_alias_sync (Test *test,
 	g_assert_no_error (error);
 	g_assert (blah == NULL);
 
-	collection = secret_collection_new_sync (test->service, "/org/freedesktop/secrets/collection/english", NULL, &error);
+	collection = secret_collection_new_sync (test->service, "/org/freedesktop/secrets/collection/english",
+	                                         SECRET_COLLECTION_NONE, NULL, &error);
 	g_assert_no_error (error);
 	g_assert (SECRET_IS_COLLECTION (collection));
 
diff --git a/library/tests/test-service.c b/library/tests/test-service.c
index ec6d797..e78fbe6 100644
--- a/library/tests/test-service.c
+++ b/library/tests/test-service.c
@@ -479,7 +479,7 @@ test_ensure_sync (Test *test,
 	flags = secret_service_get_flags (service);
 	g_assert_cmpuint (flags, ==, SECRET_SERVICE_NONE);
 
-	ret = secret_service_ensure_collections_sync (service, NULL, &error);
+	ret = secret_service_load_collections_sync (service, NULL, &error);
 	g_assert_no_error (error);
 	g_assert (ret == TRUE);
 
@@ -517,12 +517,12 @@ test_ensure_async (Test *test,
 	flags = secret_service_get_flags (service);
 	g_assert_cmpuint (flags, ==, SECRET_SERVICE_NONE);
 
-	secret_service_ensure_collections (service, NULL, on_complete_get_result, &result);
+	secret_service_load_collections (service, NULL, on_complete_get_result, &result);
 	g_assert (result == NULL);
 
 	egg_test_wait ();
 
-	ret = secret_service_ensure_collections_finish (service, result, &error);
+	ret = secret_service_load_collections_finish (service, result, &error);
 	g_assert_no_error (error);
 	g_assert (ret == TRUE);
 	g_object_unref (result);



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