mirror of
https://gitlab.gnome.org/GNOME/libsecret.git
synced 2025-01-18 09:58:33 +00:00
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()
This commit is contained in:
parent
3f0c69d862
commit
153dfcec5f
@ -3,9 +3,13 @@
|
|||||||
<INCLUDE>secret/secret-unstable.h</INCLUDE>
|
<INCLUDE>secret/secret-unstable.h</INCLUDE>
|
||||||
SecretCollection
|
SecretCollection
|
||||||
SecretCollectionClass
|
SecretCollectionClass
|
||||||
|
SecretCollectionFlags
|
||||||
secret_collection_new
|
secret_collection_new
|
||||||
secret_collection_new_finish
|
secret_collection_new_finish
|
||||||
secret_collection_new_sync
|
secret_collection_new_sync
|
||||||
|
secret_collection_load_items
|
||||||
|
secret_collection_load_items_finish
|
||||||
|
secret_collection_load_items_sync
|
||||||
secret_collection_create
|
secret_collection_create
|
||||||
secret_collection_create_finish
|
secret_collection_create_finish
|
||||||
secret_collection_create_sync
|
secret_collection_create_sync
|
||||||
@ -14,6 +18,7 @@ secret_collection_delete_finish
|
|||||||
secret_collection_delete_sync
|
secret_collection_delete_sync
|
||||||
secret_collection_get_created
|
secret_collection_get_created
|
||||||
secret_collection_get_service
|
secret_collection_get_service
|
||||||
|
secret_collection_get_flags
|
||||||
secret_collection_get_items
|
secret_collection_get_items
|
||||||
secret_collection_get_label
|
secret_collection_get_label
|
||||||
secret_collection_set_label
|
secret_collection_set_label
|
||||||
@ -29,8 +34,10 @@ SECRET_COLLECTION_GET_CLASS
|
|||||||
SECRET_IS_COLLECTION
|
SECRET_IS_COLLECTION
|
||||||
SECRET_IS_COLLECTION_CLASS
|
SECRET_IS_COLLECTION_CLASS
|
||||||
SECRET_TYPE_COLLECTION
|
SECRET_TYPE_COLLECTION
|
||||||
|
SECRET_TYPE_COLLECTION_FLAGS
|
||||||
SecretCollectionPrivate
|
SecretCollectionPrivate
|
||||||
secret_collection_get_type
|
secret_collection_get_type
|
||||||
|
secret_collection_flags_get_type
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
@ -183,9 +190,9 @@ secret_service_get_session_path
|
|||||||
secret_service_ensure_session
|
secret_service_ensure_session
|
||||||
secret_service_ensure_session_finish
|
secret_service_ensure_session_finish
|
||||||
secret_service_ensure_session_sync
|
secret_service_ensure_session_sync
|
||||||
secret_service_ensure_collections
|
secret_service_load_collections
|
||||||
secret_service_ensure_collections_finish
|
secret_service_load_collections_finish
|
||||||
secret_service_ensure_collections_sync
|
secret_service_load_collections_sync
|
||||||
SecretSearchFlags
|
SecretSearchFlags
|
||||||
secret_service_search
|
secret_service_search
|
||||||
secret_service_search_finish
|
secret_service_search_finish
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include "secret-collection.h"
|
#include "secret-collection.h"
|
||||||
#include "secret-dbus-generated.h"
|
#include "secret-dbus-generated.h"
|
||||||
|
#include "secret-enum-types.h"
|
||||||
#include "secret-item.h"
|
#include "secret-item.h"
|
||||||
#include "secret-paths.h"
|
#include "secret-paths.h"
|
||||||
#include "secret-private.h"
|
#include "secret-private.h"
|
||||||
@ -55,9 +56,20 @@
|
|||||||
* The class for #SecretCollection.
|
* 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 {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_SERVICE,
|
PROP_SERVICE,
|
||||||
|
PROP_FLAGS,
|
||||||
PROP_ITEMS,
|
PROP_ITEMS,
|
||||||
PROP_LABEL,
|
PROP_LABEL,
|
||||||
PROP_LOCKED,
|
PROP_LOCKED,
|
||||||
@ -70,6 +82,7 @@ struct _SecretCollectionPrivate {
|
|||||||
SecretService *service;
|
SecretService *service;
|
||||||
GCancellable *cancellable;
|
GCancellable *cancellable;
|
||||||
gboolean constructing;
|
gboolean constructing;
|
||||||
|
SecretCollectionFlags init_flags;
|
||||||
|
|
||||||
/* Protected by mutex */
|
/* Protected by mutex */
|
||||||
GMutex mutex;
|
GMutex mutex;
|
||||||
@ -141,6 +154,9 @@ secret_collection_set_property (GObject *obj,
|
|||||||
g_object_add_weak_pointer (G_OBJECT (self->pv->service),
|
g_object_add_weak_pointer (G_OBJECT (self->pv->service),
|
||||||
(gpointer *)&self->pv->service);
|
(gpointer *)&self->pv->service);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FLAGS:
|
||||||
|
self->pv->init_flags = g_value_get_flags (value);
|
||||||
|
break;
|
||||||
case PROP_LABEL:
|
case PROP_LABEL:
|
||||||
secret_collection_set_label (self, g_value_get_string (value),
|
secret_collection_set_label (self, g_value_get_string (value),
|
||||||
self->pv->cancellable, on_set_label,
|
self->pv->cancellable, on_set_label,
|
||||||
@ -164,6 +180,9 @@ secret_collection_get_property (GObject *obj,
|
|||||||
case PROP_SERVICE:
|
case PROP_SERVICE:
|
||||||
g_value_set_object (value, self->pv->service);
|
g_value_set_object (value, self->pv->service);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FLAGS:
|
||||||
|
g_value_set_flags (value, secret_collection_get_flags (self));
|
||||||
|
break;
|
||||||
case PROP_ITEMS:
|
case PROP_ITEMS:
|
||||||
g_value_take_boxed (value, secret_collection_get_items (self));
|
g_value_take_boxed (value, secret_collection_get_items (self));
|
||||||
break;
|
break;
|
||||||
@ -245,175 +264,33 @@ collection_update_items (SecretCollection *self,
|
|||||||
g_object_notify (G_OBJECT (self), "items");
|
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
|
static void
|
||||||
handle_property_changed (SecretCollection *self,
|
handle_property_changed (SecretCollection *self,
|
||||||
const gchar *property_name,
|
const gchar *property_name,
|
||||||
GVariant *value)
|
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");
|
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");
|
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");
|
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");
|
g_object_notify (G_OBJECT (self), "modified");
|
||||||
|
|
||||||
else if (g_str_equal (property_name, "Items") && !self->pv->constructing)
|
} else if (g_str_equal (property_name, "Items") && !self->pv->constructing) {
|
||||||
collection_load_items_async (self, self->pv->cancellable, NULL, NULL);
|
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
|
static void
|
||||||
@ -542,6 +419,17 @@ secret_collection_class_init (SecretCollectionClass *klass)
|
|||||||
g_param_spec_object ("service", "Service", "Secret Service",
|
g_param_spec_object ("service", "Service", "Secret Service",
|
||||||
SECRET_TYPE_SERVICE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
|
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:
|
* SecretCollection:items:
|
||||||
*
|
*
|
||||||
@ -622,8 +510,10 @@ secret_collection_initable_init (GInitable *initable,
|
|||||||
|
|
||||||
self = SECRET_COLLECTION (initable);
|
self = SECRET_COLLECTION (initable);
|
||||||
|
|
||||||
if (!collection_load_items_sync (self, cancellable, error))
|
if (self->pv->init_flags & SECRET_COLLECTION_LOAD_ITEMS) {
|
||||||
return FALSE;
|
if (!secret_collection_load_items_sync (self, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
self->pv->constructing = FALSE;
|
self->pv->constructing = FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -658,7 +548,7 @@ on_init_items (GObject *source,
|
|||||||
SecretCollection *self = SECRET_COLLECTION (source);
|
SecretCollection *self = SECRET_COLLECTION (source);
|
||||||
GError *error = NULL;
|
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_take_error (res, error);
|
||||||
|
|
||||||
g_simple_async_result_complete (res);
|
g_simple_async_result_complete (res);
|
||||||
@ -687,9 +577,12 @@ on_init_base (GObject *source,
|
|||||||
g_dbus_proxy_get_object_path (proxy));
|
g_dbus_proxy_get_object_path (proxy));
|
||||||
g_simple_async_result_complete (res);
|
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 {
|
} else {
|
||||||
collection_load_items_async (self, closure->cancellable,
|
g_simple_async_result_complete (res);
|
||||||
on_init_items, g_object_ref (res));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref (res);
|
g_object_unref (res);
|
||||||
@ -749,6 +642,7 @@ secret_collection_async_initable_iface (GAsyncInitableIface *iface)
|
|||||||
* secret_collection_new:
|
* secret_collection_new:
|
||||||
* @service: a secret service object
|
* @service: a secret service object
|
||||||
* @collection_path: the D-Bus path of the collection
|
* @collection_path: the D-Bus path of the collection
|
||||||
|
* @flags: options for the collection initialization
|
||||||
* @cancellable: optional cancellation object
|
* @cancellable: optional cancellation object
|
||||||
* @callback: called when the operation completes
|
* @callback: called when the operation completes
|
||||||
* @user_data: data to be passed to the callback
|
* @user_data: data to be passed to the callback
|
||||||
@ -760,6 +654,7 @@ secret_collection_async_initable_iface (GAsyncInitableIface *iface)
|
|||||||
void
|
void
|
||||||
secret_collection_new (SecretService *service,
|
secret_collection_new (SecretService *service,
|
||||||
const gchar *collection_path,
|
const gchar *collection_path,
|
||||||
|
SecretCollectionFlags flags,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@ -781,6 +676,7 @@ secret_collection_new (SecretService *service,
|
|||||||
"g-object-path", collection_path,
|
"g-object-path", collection_path,
|
||||||
"g-interface-name", SECRET_COLLECTION_INTERFACE,
|
"g-interface-name", SECRET_COLLECTION_INTERFACE,
|
||||||
"service", service,
|
"service", service,
|
||||||
|
"flags", flags,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,6 +716,7 @@ secret_collection_new_finish (GAsyncResult *result,
|
|||||||
* secret_collection_new_sync:
|
* secret_collection_new_sync:
|
||||||
* @service: a secret service object
|
* @service: a secret service object
|
||||||
* @collection_path: the D-Bus path of the collection
|
* @collection_path: the D-Bus path of the collection
|
||||||
|
* @flags: options for the collection initialization
|
||||||
* @cancellable: optional cancellation object
|
* @cancellable: optional cancellation object
|
||||||
* @error: location to place an error on failure
|
* @error: location to place an error on failure
|
||||||
*
|
*
|
||||||
@ -834,6 +731,7 @@ secret_collection_new_finish (GAsyncResult *result,
|
|||||||
SecretCollection *
|
SecretCollection *
|
||||||
secret_collection_new_sync (SecretService *service,
|
secret_collection_new_sync (SecretService *service,
|
||||||
const gchar *collection_path,
|
const gchar *collection_path,
|
||||||
|
SecretCollectionFlags flags,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
@ -855,9 +753,218 @@ secret_collection_new_sync (SecretService *service,
|
|||||||
"g-object-path", collection_path,
|
"g-object-path", collection_path,
|
||||||
"g-interface-name", SECRET_COLLECTION_INTERFACE,
|
"g-interface-name", SECRET_COLLECTION_INTERFACE,
|
||||||
"service", service,
|
"service", service,
|
||||||
|
"flags", flags,
|
||||||
NULL);
|
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:
|
* secret_collection_refresh:
|
||||||
* @self: the collection
|
* @self: the collection
|
||||||
@ -922,7 +1029,8 @@ on_create_path (GObject *source,
|
|||||||
|
|
||||||
path = secret_service_create_collection_path_finish (service, result, &error);
|
path = secret_service_create_collection_path_finish (service, result, &error);
|
||||||
if (error == NULL) {
|
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));
|
on_create_collection, g_object_ref (res));
|
||||||
} else {
|
} else {
|
||||||
g_simple_async_result_take_error (res, error);
|
g_simple_async_result_take_error (res, error);
|
||||||
@ -1082,7 +1190,9 @@ secret_collection_create_sync (SecretService *service,
|
|||||||
if (path == NULL)
|
if (path == NULL)
|
||||||
return 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);
|
g_free (path);
|
||||||
|
|
||||||
return collection;
|
return collection;
|
||||||
@ -1220,6 +1330,35 @@ secret_collection_get_service (SecretCollection *self)
|
|||||||
return self->pv->service;
|
return self->pv->service;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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:
|
* secret_collection_get_items:
|
||||||
* @self: a collection
|
* @self: a collection
|
||||||
|
@ -25,6 +25,11 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
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_TYPE_COLLECTION (secret_collection_get_type ())
|
||||||
#define SECRET_COLLECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), SECRET_TYPE_COLLECTION, SecretCollection))
|
#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))
|
#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,
|
void secret_collection_new (SecretService *service,
|
||||||
const gchar *collection_path,
|
const gchar *collection_path,
|
||||||
|
SecretCollectionFlags flags,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
@ -62,6 +68,20 @@ SecretCollection * secret_collection_new_finish (GAsyncResult *re
|
|||||||
|
|
||||||
SecretCollection * secret_collection_new_sync (SecretService *service,
|
SecretCollection * secret_collection_new_sync (SecretService *service,
|
||||||
const gchar *collection_path,
|
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,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
@ -98,6 +118,8 @@ gboolean secret_collection_delete_sync (SecretCollection
|
|||||||
|
|
||||||
SecretService * secret_collection_get_service (SecretCollection *self);
|
SecretService * secret_collection_get_service (SecretCollection *self);
|
||||||
|
|
||||||
|
SecretCollectionFlags secret_collection_get_flags (SecretCollection *self);
|
||||||
|
|
||||||
GList * secret_collection_get_items (SecretCollection *self);
|
GList * secret_collection_get_items (SecretCollection *self);
|
||||||
|
|
||||||
gchar * secret_collection_get_label (SecretCollection *self);
|
gchar * secret_collection_get_label (SecretCollection *self);
|
||||||
|
@ -1532,7 +1532,8 @@ on_read_alias_path (GObject *source,
|
|||||||
|
|
||||||
/* No collection loaded, but valid path, load */
|
/* No collection loaded, but valid path, load */
|
||||||
} else {
|
} 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));
|
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 */
|
/* No collection loaded, but valid path, load */
|
||||||
if (collection == NULL) {
|
if (collection == NULL) {
|
||||||
collection = secret_collection_new_sync (self, collection_path,
|
collection = secret_collection_new_sync (self, collection_path,
|
||||||
|
SECRET_COLLECTION_LOAD_ITEMS,
|
||||||
cancellable, error);
|
cancellable, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
* represent those collections while initializing a #SecretService then pass
|
* represent those collections while initializing a #SecretService then pass
|
||||||
* the %SECRET_SERVICE_LOAD_COLLECTIONS flag to the secret_service_get() or
|
* 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
|
* 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().
|
* To access the list of collections use secret_service_get_collections().
|
||||||
*
|
*
|
||||||
* Certain actions on the Secret Service require user prompting to complete,
|
* 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);
|
g_mutex_unlock (&self->pv->mutex);
|
||||||
|
|
||||||
if (perform)
|
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);
|
g_variant_unref (value);
|
||||||
@ -455,7 +455,7 @@ secret_service_class_init (SecretServiceClass *klass)
|
|||||||
*
|
*
|
||||||
* To load the collections, specify the %SECRET_SERVICE_LOAD_COLLECTIONS
|
* To load the collections, specify the %SECRET_SERVICE_LOAD_COLLECTIONS
|
||||||
* initialization flag when calling the secret_service_get() or
|
* 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.
|
* method.
|
||||||
*/
|
*/
|
||||||
g_object_class_install_property (object_class, PROP_COLLECTIONS,
|
g_object_class_install_property (object_class, PROP_COLLECTIONS,
|
||||||
@ -489,22 +489,22 @@ service_ensure_for_flags_sync (SecretService *self,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (flags & SECRET_SERVICE_LOAD_COLLECTIONS)
|
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 FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_ensure_collections (GObject *source,
|
on_load_collections (GObject *source,
|
||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
|
GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
|
||||||
SecretService *self = SECRET_SERVICE (source);
|
SecretService *self = SECRET_SERVICE (source);
|
||||||
GError *error = NULL;
|
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_take_error (res, error);
|
||||||
|
|
||||||
g_simple_async_result_complete (res);
|
g_simple_async_result_complete (res);
|
||||||
@ -526,8 +526,8 @@ on_ensure_session (GObject *source,
|
|||||||
g_simple_async_result_complete (res);
|
g_simple_async_result_complete (res);
|
||||||
|
|
||||||
} else if (closure->flags & SECRET_SERVICE_LOAD_COLLECTIONS) {
|
} else if (closure->flags & SECRET_SERVICE_LOAD_COLLECTIONS) {
|
||||||
secret_service_ensure_collections (self, closure->cancellable,
|
secret_service_load_collections (self, closure->cancellable,
|
||||||
on_ensure_collections, g_object_ref (res));
|
on_load_collections, g_object_ref (res));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
g_simple_async_result_complete_in_idle (res);
|
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));
|
on_ensure_session, g_object_ref (res));
|
||||||
|
|
||||||
else if (closure->flags & SECRET_SERVICE_LOAD_COLLECTIONS)
|
else if (closure->flags & SECRET_SERVICE_LOAD_COLLECTIONS)
|
||||||
secret_service_ensure_collections (self, closure->cancellable,
|
secret_service_load_collections (self, closure->cancellable,
|
||||||
on_ensure_collections, g_object_ref (res));
|
on_load_collections, g_object_ref (res));
|
||||||
|
|
||||||
else
|
else
|
||||||
g_simple_async_result_complete_in_idle (res);
|
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
|
* Get the flags representing what features of the #SecretService proxy
|
||||||
* have been initialized.
|
* 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.
|
* to initialize further features and change the flags.
|
||||||
*
|
*
|
||||||
* Returns: the flags for features initialized
|
* 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
|
* If the %SECRET_SERVICE_LOAD_COLLECTIONS flag was not specified when
|
||||||
* initializing #SecretService proxy object, then this method will return
|
* 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
|
* Returns: (transfer full) (element-type Secret.Collection) (allow-none): a
|
||||||
* list of the collections in the secret service
|
* 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
|
* @self: the secret service
|
||||||
* @cancellable: optional cancellation object
|
* @cancellable: optional cancellation object
|
||||||
* @callback: called when the operation completes
|
* @callback: called when the operation completes
|
||||||
@ -1396,10 +1396,10 @@ on_ensure_collection (GObject *source,
|
|||||||
* This method will return immediately and complete asynchronously.
|
* This method will return immediately and complete asynchronously.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
secret_service_ensure_collections (SecretService *self,
|
secret_service_load_collections (SecretService *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
EnsureClosure *closure;
|
EnsureClosure *closure;
|
||||||
SecretCollection *collection;
|
SecretCollection *collection;
|
||||||
@ -1415,7 +1415,7 @@ secret_service_ensure_collections (SecretService *self,
|
|||||||
g_return_if_fail (paths != NULL);
|
g_return_if_fail (paths != NULL);
|
||||||
|
|
||||||
res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
|
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 = g_slice_new0 (EnsureClosure);
|
||||||
closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
|
closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
|
||||||
closure->collections = collections_table_new ();
|
closure->collections = collections_table_new ();
|
||||||
@ -1427,7 +1427,7 @@ secret_service_ensure_collections (SecretService *self,
|
|||||||
|
|
||||||
/* No such collection yet create a new one */
|
/* No such collection yet create a new one */
|
||||||
if (collection == NULL) {
|
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));
|
on_ensure_collection, g_object_ref (res));
|
||||||
closure->collections_loading++;
|
closure->collections_loading++;
|
||||||
} else {
|
} 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
|
* @self: the secret service
|
||||||
* @result: the asynchronous result passed to the callback
|
* @result: the asynchronous result passed to the callback
|
||||||
* @error: location to place an error on failure
|
* @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
|
* Returns: whether the load was successful or not
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
secret_service_ensure_collections_finish (SecretService *self,
|
secret_service_load_collections_finish (SecretService *self,
|
||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (SECRET_IS_SERVICE (self), FALSE);
|
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 (error == NULL || *error == NULL, FALSE);
|
||||||
g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
|
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))
|
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
|
||||||
return FALSE;
|
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
|
* @self: the secret service
|
||||||
* @cancellable: optional cancellation object
|
* @cancellable: optional cancellation object
|
||||||
* @error: location to place an error on failure
|
* @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
|
* Returns: whether the load was successful or not
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
secret_service_ensure_collections_sync (SecretService *self,
|
secret_service_load_collections_sync (SecretService *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
SecretCollection *collection;
|
SecretCollection *collection;
|
||||||
GHashTable *collections;
|
GHashTable *collections;
|
||||||
@ -1517,7 +1517,9 @@ secret_service_ensure_collections_sync (SecretService *self,
|
|||||||
|
|
||||||
/* No such collection yet create a new one */
|
/* No such collection yet create a new one */
|
||||||
if (collection == NULL) {
|
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) {
|
if (collection == NULL) {
|
||||||
ret = FALSE;
|
ret = FALSE;
|
||||||
break;
|
break;
|
||||||
|
@ -137,16 +137,16 @@ const gchar * secret_service_ensure_session_sync (SecretService
|
|||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
void secret_service_ensure_collections (SecretService *self,
|
void secret_service_load_collections (SecretService *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
gboolean secret_service_ensure_collections_finish (SecretService *self,
|
gboolean secret_service_load_collections_finish (SecretService *self,
|
||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
gboolean secret_service_ensure_collections_sync (SecretService *self,
|
gboolean secret_service_load_collections_sync (SecretService *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
@ -88,7 +88,8 @@ test_new_sync (Test *test,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
SecretCollection *collection;
|
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_no_error (error);
|
||||||
|
|
||||||
g_assert_cmpstr (g_dbus_proxy_get_object_path (G_DBUS_PROXY (collection)), ==, collection_path);
|
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;
|
SecretCollection *collection;
|
||||||
GAsyncResult *result = NULL;
|
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);
|
g_assert (result == NULL);
|
||||||
|
|
||||||
egg_test_wait ();
|
egg_test_wait ();
|
||||||
@ -129,7 +131,8 @@ test_new_sync_noexist (Test *test,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
SecretCollection *collection;
|
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_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
|
||||||
g_assert (collection == NULL);
|
g_assert (collection == NULL);
|
||||||
}
|
}
|
||||||
@ -143,7 +146,8 @@ test_new_async_noexist (Test *test,
|
|||||||
SecretCollection *collection;
|
SecretCollection *collection;
|
||||||
GAsyncResult *result = NULL;
|
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);
|
g_assert (result == NULL);
|
||||||
|
|
||||||
egg_test_wait ();
|
egg_test_wait ();
|
||||||
@ -211,7 +215,8 @@ test_properties (Test *test,
|
|||||||
gboolean locked;
|
gboolean locked;
|
||||||
gchar *label;
|
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_no_error (error);
|
||||||
|
|
||||||
g_assert (secret_collection_get_locked (collection) == FALSE);
|
g_assert (secret_collection_get_locked (collection) == FALSE);
|
||||||
@ -281,7 +286,8 @@ test_items (Test *test,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GList *items;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
items = secret_collection_get_items (collection);
|
items = secret_collection_get_items (collection);
|
||||||
@ -312,7 +318,8 @@ test_items_empty (Test *test,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GList *items;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
items = secret_collection_get_items (collection);
|
items = secret_collection_get_items (collection);
|
||||||
@ -336,7 +343,9 @@ test_items_empty_async (Test *test,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GList *items;
|
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);
|
g_assert (result == NULL);
|
||||||
|
|
||||||
egg_test_wait ();
|
egg_test_wait ();
|
||||||
@ -366,7 +375,8 @@ test_set_label_sync (Test *test,
|
|||||||
gboolean ret;
|
gboolean ret;
|
||||||
gchar *label;
|
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_no_error (error);
|
||||||
|
|
||||||
label = secret_collection_get_label (collection);
|
label = secret_collection_get_label (collection);
|
||||||
@ -395,7 +405,8 @@ test_set_label_async (Test *test,
|
|||||||
gboolean ret;
|
gboolean ret;
|
||||||
gchar *label;
|
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_no_error (error);
|
||||||
|
|
||||||
label = secret_collection_get_label (collection);
|
label = secret_collection_get_label (collection);
|
||||||
@ -429,7 +440,8 @@ test_set_label_prop (Test *test,
|
|||||||
guint sigs = 2;
|
guint sigs = 2;
|
||||||
gchar *label;
|
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_no_error (error);
|
||||||
|
|
||||||
label = secret_collection_get_label (collection);
|
label = secret_collection_get_label (collection);
|
||||||
@ -458,7 +470,8 @@ test_delete_sync (Test *test,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
gboolean ret;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
ret = secret_collection_delete_sync (collection, NULL, &error);
|
ret = secret_collection_delete_sync (collection, NULL, &error);
|
||||||
@ -467,7 +480,8 @@ test_delete_sync (Test *test,
|
|||||||
|
|
||||||
g_object_unref (collection);
|
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_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
|
||||||
g_assert (collection == NULL);
|
g_assert (collection == NULL);
|
||||||
}
|
}
|
||||||
@ -482,7 +496,8 @@ test_delete_async (Test *test,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
gboolean ret;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
secret_collection_delete (collection, NULL, on_async_result, &result);
|
secret_collection_delete (collection, NULL, on_async_result, &result);
|
||||||
@ -497,7 +512,8 @@ test_delete_async (Test *test,
|
|||||||
|
|
||||||
g_object_unref (collection);
|
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_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD);
|
||||||
g_assert (collection == NULL);
|
g_assert (collection == NULL);
|
||||||
}
|
}
|
||||||
|
@ -166,7 +166,8 @@ test_create_sync (Test *test,
|
|||||||
GHashTable *attributes;
|
GHashTable *attributes;
|
||||||
SecretValue *value;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
attributes = g_hash_table_new (g_str_hash, g_str_equal);
|
attributes = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
@ -204,7 +205,8 @@ test_create_async (Test *test,
|
|||||||
GHashTable *attributes;
|
GHashTable *attributes;
|
||||||
SecretValue *value;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
attributes = g_hash_table_new (g_str_hash, g_str_equal);
|
attributes = g_hash_table_new (g_str_hash, g_str_equal);
|
||||||
|
@ -397,7 +397,8 @@ test_lock_sync (Test *test,
|
|||||||
GList *objects;
|
GList *objects;
|
||||||
gboolean ret;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
objects = g_list_append (NULL, collection);
|
objects = g_list_append (NULL, collection);
|
||||||
@ -426,7 +427,8 @@ test_unlock_sync (Test *test,
|
|||||||
GList *objects;
|
GList *objects;
|
||||||
gboolean ret;
|
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);
|
g_assert_no_error (error);
|
||||||
|
|
||||||
objects = g_list_append (NULL, collection);
|
objects = g_list_append (NULL, collection);
|
||||||
@ -922,7 +924,8 @@ test_set_alias_sync (Test *test,
|
|||||||
g_assert_no_error (error);
|
g_assert_no_error (error);
|
||||||
g_assert (blah == NULL);
|
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_no_error (error);
|
||||||
g_assert (SECRET_IS_COLLECTION (collection));
|
g_assert (SECRET_IS_COLLECTION (collection));
|
||||||
|
|
||||||
|
@ -479,7 +479,7 @@ test_ensure_sync (Test *test,
|
|||||||
flags = secret_service_get_flags (service);
|
flags = secret_service_get_flags (service);
|
||||||
g_assert_cmpuint (flags, ==, SECRET_SERVICE_NONE);
|
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_no_error (error);
|
||||||
g_assert (ret == TRUE);
|
g_assert (ret == TRUE);
|
||||||
|
|
||||||
@ -517,12 +517,12 @@ test_ensure_async (Test *test,
|
|||||||
flags = secret_service_get_flags (service);
|
flags = secret_service_get_flags (service);
|
||||||
g_assert_cmpuint (flags, ==, SECRET_SERVICE_NONE);
|
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);
|
g_assert (result == NULL);
|
||||||
|
|
||||||
egg_test_wait ();
|
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_no_error (error);
|
||||||
g_assert (ret == TRUE);
|
g_assert (ret == TRUE);
|
||||||
g_object_unref (result);
|
g_object_unref (result);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user