summaryrefslogtreecommitdiff
path: root/src/mcd-storage.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mcd-storage.c')
-rw-r--r--src/mcd-storage.c388
1 files changed, 388 insertions, 0 deletions
diff --git a/src/mcd-storage.c b/src/mcd-storage.c
new file mode 100644
index 00000000..7ca0feff
--- /dev/null
+++ b/src/mcd-storage.c
@@ -0,0 +1,388 @@
+/* Mission Control storage API - interface which provides access to account
+ * parameter/setting storage
+ *
+ * Copyright © 2010 Nokia Corporation
+ * Copyright © 2010 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "mcd-storage-priv.h"
+#include "mcd-master.h"
+#include "mcd-account-manager-priv.h"
+
+GType
+mcd_storage_get_type (void)
+{
+ static gsize once = 0;
+ static GType type = 0;
+
+ if (g_once_init_enter (&once))
+ {
+ static const GTypeInfo info = {
+ sizeof (McdStorageIface),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL /* value_table */
+ };
+
+ type = g_type_register_static (G_TYPE_INTERFACE, "McdStorage", &info, 0);
+ g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
+ g_once_init_leave (&once, 1);
+ }
+
+ return type;
+}
+
+/**
+ * mcd_storage_set_string:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: the unique name of an account
+ * @key: the key (name) of the parameter or setting
+ * @value: the value to be stored (or %NULL to erase it)
+ * @secret: whether the value is confidential (might get stored in the
+ * keyring, for example)
+ *
+ * Copies and stores the supplied @value (or removes it if %NULL) to the
+ * internal cache.
+ *
+ * Returns: a #gboolean indicating whether the cache actually required an
+ * update (so that the caller can decide whether to request a commit to
+ * long term storage or not). %TRUE indicates the cache was updated and
+ * may not be in sync with the store any longer, %FALSE indicates we already
+ * held the value supplied.
+ */
+gboolean
+mcd_storage_set_string (McdStorage *storage,
+ const gchar *account,
+ const gchar *key,
+ const gchar *value,
+ gboolean secret)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_return_val_if_fail (account != NULL, FALSE);
+ g_return_val_if_fail (key != NULL, FALSE);
+ g_return_val_if_fail (iface->set_string != NULL, FALSE);
+
+ return iface->set_string (storage, account, key, value, secret);
+}
+
+/**
+ * mcd_storage_set_value:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: the unique name of an account
+ * @key: the key (name) of the parameter or setting
+ * @value: the value to be stored (or %NULL to erase it)
+ * @secret: whether the value is confidential (might get stored in the
+ * keyring, for example)
+ *
+ * Copies and stores the supplied @value (or removes it if %NULL) to the
+ * internal cache.
+ *
+ * Returns: a #gboolean indicating whether the cache actually required an
+ * update (so that the caller can decide whether to request a commit to
+ * long term storage or not). %TRUE indicates the cache was updated and
+ * may not be in sync with the store any longer, %FALSE indicates we already
+ * held the value supplied.
+ */
+gboolean
+mcd_storage_set_value (McdStorage *storage,
+ const gchar *account,
+ const gchar *key,
+ const GValue *value,
+ gboolean secret)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_return_val_if_fail (account != NULL, FALSE);
+ g_return_val_if_fail (key != NULL, FALSE);
+ g_return_val_if_fail (iface->set_value != NULL, FALSE);
+
+ return iface->set_value (storage, account, key, value, secret);
+}
+
+/**
+ * mcd_storage_commit:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: the unique name of an account
+ *
+ * Sync the long term storage (whatever it might be) with the current
+ * state of our internal cache.
+ */
+void
+mcd_storage_commit (McdStorage *storage, const gchar *account)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_return_if_fail (iface->commit != NULL);
+
+ iface->commit (storage, account);
+}
+
+/**
+ * mcd_storage_load:
+ * @storage: An object implementing the #McdStorage interface
+ *
+ * Load the long term account settings storage into our internal cache.
+ * Should only really be called during startup, ie before our DBus names
+ * have been claimed and other people might be relying on responses from us.
+ */
+void
+mcd_storage_load (McdStorage *storage)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_return_if_fail (iface->load != NULL);
+
+ iface->load (storage);
+}
+
+/**
+ * mcd_storage_dup_accounts:
+ * @storage: An object implementing the #McdStorage interface
+ * @n: place for the number of accounts to be written to (or %NULL)
+ *
+ * Returns: a newly allocated GStrv containing the unique account names,
+ * which must be freed by the caller with g_strfreev().
+ **/
+GStrv
+mcd_storage_dup_accounts (McdStorage *storage, gsize *n)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_return_val_if_fail (iface->dup_accounts != NULL, NULL);
+
+ return iface->dup_accounts (storage, n);
+}
+
+/**
+ * mcd_storage_dup_settings:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ * @n: place for the number of settings to be written to (or %NULL)
+ *
+ * Returns: a newly allocated GStrv containing the names of all the
+ * settings or parameters currently stored for @account. Must be
+ * freed by the caller with g_strfreev().
+ **/
+GStrv
+mcd_storage_dup_settings (McdStorage *storage, const gchar *account, gsize *n)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_return_val_if_fail (account != NULL, NULL);
+ g_return_val_if_fail (iface->dup_settings != NULL, NULL);
+
+ return iface->dup_settings (storage, account, n);
+}
+
+/**
+ * mcd_storage_dup_string:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ * @key: name of the setting to be retrieved
+ *
+ * Returns: a newly allocated gchar * which must be freed with g_free().
+ **/
+gchar *
+mcd_storage_dup_string (McdStorage *storage,
+ const gchar *account,
+ const gchar *key)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_assert (iface->dup_string != NULL);
+ g_return_val_if_fail (account != NULL, NULL);
+
+ return iface->dup_string (storage, account, key);
+}
+
+/**
+ * mcd_storage_dup_value:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ * @key: name of the setting to be retrieved
+ * @type: the type of #GValue to retrieve
+ * @error: a place to store any #GError<!-- -->s that occur
+ *
+ * Returns: a newly allocated #GValue of type @type, whihc should be freed
+ * with tp_g_value_slice_free() or g_slice_free() depending on whether the
+ * the value itself should be freed (the former frees everything, the latter
+ * only the #GValue container.
+ *
+ * If @error is set, but a non-%NULL value was returned, this indicates
+ * that no value for the @key was found for @account, and the default
+ * value for @type has been returned.
+ **/
+GValue *
+mcd_storage_dup_value (McdStorage *storage,
+ const gchar *account,
+ const gchar *key,
+ GType type,
+ GError **error)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_assert (iface->dup_value != NULL);
+ g_return_val_if_fail (account != NULL, NULL);
+
+ return iface->dup_value (storage, account, key, type, error);
+}
+
+/**
+ * mcd_storage_get_boolean:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ * @key: name of the setting to be retrieved
+ *
+ * Returns: a #gboolean. Unset/unparseable values are returned as %FALSE
+ **/
+gboolean
+mcd_storage_get_boolean (McdStorage *storage,
+ const gchar *account,
+ const gchar *key)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_assert (iface->get_boolean != NULL);
+ g_return_val_if_fail (account != NULL, FALSE);
+
+ return iface->get_boolean (storage, account, key);
+}
+
+/**
+ * mcd_storage_get_integer:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ * @key: name of the setting to be retrieved
+ *
+ * Returns: a #gint. Unset or non-numeric values are returned as 0
+ **/
+gint
+mcd_storage_get_integer (McdStorage *storage,
+ const gchar *account,
+ const gchar *key)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_assert (iface->get_integer != NULL);
+ g_return_val_if_fail (account != NULL, 0);
+
+ return iface->get_integer (storage, account, key);
+}
+
+
+/**
+ * mcd_storage_has_value:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ * @key: name of the setting to be retrieved
+ *
+ * Returns: a #gboolean: %TRUE if the setting is present in the store,
+ * %FALSE otherwise.
+ **/
+gboolean
+mcd_storage_has_value (McdStorage *storage,
+ const gchar *account,
+ const gchar *key)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_assert (iface->has_value != NULL);
+ g_return_val_if_fail (account != NULL, FALSE);
+ g_return_val_if_fail (key != NULL, FALSE);
+
+ return iface->has_value (storage, account, key);
+}
+
+/**
+ * mcd_storage_get_plugin:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ *
+ * Returns: the #McpAccountStorage object which is handling the account,
+ * if any (if a new account has not yet been flushed to storage this can
+ * be %NULL).
+ *
+ * Plugins are kept in permanent storage and can never be unloaded, so
+ * the returned pointer need not be reffed or unreffed. (Indeed, it's
+ * probably safer not to)
+ **/
+McpAccountStorage *
+mcd_storage_get_plugin (McdStorage *storage, const gchar *account)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_assert (iface->get_storage_plugin != NULL);
+ g_return_val_if_fail (account != NULL, NULL);
+
+ return iface->get_storage_plugin (storage, account);
+}
+
+/**
+ * mcd_storage_delete_account:
+ * @storage: An object implementing the #McdStorage interface
+ * @account: unique name of the account
+ *
+ * Removes an account's settings from long term storage.
+ * This does not handle any of the other logic to do with removing
+ * accounts, it merely ensures that no trace of the account remains
+ * in long term storage once mcd_storage_commit() has been called.
+ */
+void
+mcd_storage_delete_account (McdStorage *storage, const gchar *account)
+{
+ McdStorageIface *iface = MCD_STORAGE_GET_IFACE (storage);
+
+ g_assert (iface != NULL);
+ g_assert (iface->delete_account != NULL);
+ g_return_if_fail (account != NULL);
+
+ iface->delete_account (storage, account);
+}
+
+void
+_mcd_storage_store_connections (McdStorage *storage)
+{
+ McdMaster *master = mcd_master_get_default ();
+ McdAccountManager *account_manager = NULL;
+
+ g_object_get (master, "account-manager", &account_manager, NULL);
+
+ if (account_manager != NULL)
+ {
+ _mcd_account_manager_store_account_connections (account_manager);
+ g_object_unref (account_manager);
+ }
+}