telepathy-mission-control: mcd_keyfile_escape_value, mcd_keyfile_unescape_value: add

Simon McVittie smcv at kemper.freedesktop.org
Wed Feb 13 06:18:21 PST 2013


Module: telepathy-mission-control
Branch: master
Commit: fd9f5784098d774076a12a5dd0da693f2b417cca
URL:    http://cgit.freedesktop.org/telepathy/telepathy-mission-control/commit/?id=fd9f5784098d774076a12a5dd0da693f2b417cca

Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date:   Thu Sep  6 12:23:53 2012 +0100

mcd_keyfile_escape_value, mcd_keyfile_unescape_value: add

Also make them available to account storage plugins.

Signed-off-by: Simon McVittie <simon.mcvittie at collabora.co.uk>

---

 mission-control-plugins/account.c        |   59 +++++++++++++++++++++++++
 mission-control-plugins/account.h        |   10 ++++
 mission-control-plugins/implementation.h |    8 +++
 src/mcd-storage.c                        |   70 ++++++++++++++++++++++++++++++
 src/mcd-storage.h                        |    5 ++
 5 files changed, 152 insertions(+), 0 deletions(-)

diff --git a/mission-control-plugins/account.c b/mission-control-plugins/account.c
index a026d15..63892ed 100644
--- a/mission-control-plugins/account.c
+++ b/mission-control-plugins/account.c
@@ -237,3 +237,62 @@ mcp_account_manager_get_unique_name (McpAccountManager *mcpa,
 
   return iface->unique_name (mcpa, manager, protocol, params);
 }
+
+/**
+ * mcp_account_manager_escape_value_from_keyfile:
+ * @mcpa: a #McpAccountManager
+ * @value: a value with a supported #GType
+ *
+ * Escape @value so it could be passed to g_key_file_set_value().
+ * For instance, escaping the boolean value TRUE returns "true",
+ * and escaping the string value containing one space returns "\s".
+ *
+ * It is a programming error to use an unsupported type.
+ * The supported types are currently %G_TYPE_STRING, %G_TYPE_BOOLEAN,
+ * %G_TYPE_INT, %G_TYPE_UINT, %G_TYPE_INT64, %G_TYPE_UINT64, %G_TYPE_UCHAR,
+ * %G_TYPE_STRV, %DBUS_TYPE_G_OBJECT_PATH and %TP_ARRAY_TYPE_OBJECT_PATH_LIST.
+ *
+ * Returns: the escaped form of @value
+ */
+gchar *
+mcp_account_manager_escape_value_for_keyfile (const McpAccountManager *mcpa,
+    const GValue *value)
+{
+  McpAccountManagerIface *iface = MCP_ACCOUNT_MANAGER_GET_IFACE (mcpa);
+
+  g_return_val_if_fail (iface != NULL, NULL);
+  g_return_val_if_fail (iface->escape_value_for_keyfile != NULL, NULL);
+
+  return iface->escape_value_for_keyfile (mcpa, value);
+}
+
+/**
+ * mcp_account_manager_unescape_value_from_keyfile:
+ * @mcpa: a #McpAccountManager
+ * @escaped: an escaped string as returned by g_key_file_get_value()
+ * @value: a value to populate, with a supported #GType
+ * @error: used to raise an error if %FALSE is returned
+ *
+ * Attempt to interpret @escaped as a value of @value's type.
+ * If successful, put it in @value and return %TRUE.
+ *
+ * It is a programming error to try to escape an unsupported type.
+ * The supported types are currently %G_TYPE_STRING, %G_TYPE_BOOLEAN,
+ * %G_TYPE_INT, %G_TYPE_UINT, %G_TYPE_INT64, %G_TYPE_UINT64, %G_TYPE_UCHAR,
+ * %G_TYPE_STRV, %DBUS_TYPE_G_OBJECT_PATH and %TP_ARRAY_TYPE_OBJECT_PATH_LIST.
+ *
+ * Returns: %TRUE if @value was filled in
+ */
+gboolean
+mcp_account_manager_unescape_value_from_keyfile (const McpAccountManager *mcpa,
+    const gchar *escaped,
+    GValue *value,
+    GError **error)
+{
+  McpAccountManagerIface *iface = MCP_ACCOUNT_MANAGER_GET_IFACE (mcpa);
+
+  g_return_val_if_fail (iface != NULL, FALSE);
+  g_return_val_if_fail (iface->unescape_value_from_keyfile != NULL, FALSE);
+
+  return iface->unescape_value_from_keyfile (mcpa, escaped, value, error);
+}
diff --git a/mission-control-plugins/account.h b/mission-control-plugins/account.h
index d281f62..7f670fd 100644
--- a/mission-control-plugins/account.h
+++ b/mission-control-plugins/account.h
@@ -70,6 +70,16 @@ gchar * mcp_account_manager_get_unique_name (McpAccountManager *mcpa,
 GStrv mcp_account_manager_list_keys (const McpAccountManager *mcpa,
     const gchar *account);
 
+gchar *mcp_account_manager_escape_value_for_keyfile (
+    const McpAccountManager *mcpa,
+    const GValue *value);
+
+gboolean mcp_account_manager_unescape_value_from_keyfile (
+    const McpAccountManager *mcpa,
+    const gchar *escaped,
+    GValue *value,
+    GError **error);
+
 G_END_DECLS
 
 #endif
diff --git a/mission-control-plugins/implementation.h b/mission-control-plugins/implementation.h
index 918f830..2924f44 100644
--- a/mission-control-plugins/implementation.h
+++ b/mission-control-plugins/implementation.h
@@ -104,6 +104,14 @@ struct _McpAccountManagerIface {
 
   GStrv (* list_keys) (const McpAccountManager *ma,
       const gchar *acct);
+
+  gchar * (* escape_value_for_keyfile) (const McpAccountManager *mcpa,
+      const GValue *value);
+
+  gboolean (* unescape_value_from_keyfile) (const McpAccountManager *mcpa,
+      const gchar *escaped,
+      GValue *value,
+      GError **error);
 };
 
 G_END_DECLS
diff --git a/src/mcd-storage.c b/src/mcd-storage.c
index e2b84a6..36344cf 100644
--- a/src/mcd-storage.c
+++ b/src/mcd-storage.c
@@ -589,6 +589,43 @@ mcd_storage_get_parameter (McdStorage *self,
       value, error);
 }
 
+static gboolean
+mcpa_unescape_value_from_keyfile (const McpAccountManager *unused G_GNUC_UNUSED,
+    const gchar *escaped,
+    GValue *value,
+    GError **error)
+{
+  return mcd_keyfile_unescape_value (escaped, value, error);
+}
+
+/*
+ * @escaped: a keyfile-escaped string
+ * @value: a #GValue initialized with a supported #GType
+ * @error: used to raise an error if %FALSE is returned
+ *
+ * Try to interpret @escaped as a value of the type of @value. If we can,
+ * write the resulting value into @value and return %TRUE.
+ *
+ * Returns: %TRUE if @escaped could be interpreted as a value of that type
+ */
+gboolean
+mcd_keyfile_unescape_value (const gchar *escaped,
+    GValue *value,
+    GError **error)
+{
+  GKeyFile *keyfile;
+  gboolean ret;
+
+  g_return_val_if_fail (escaped != NULL, FALSE);
+  g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+
+  keyfile = g_key_file_new ();
+  g_key_file_set_value (keyfile, "g", "k", escaped);
+  ret = mcd_keyfile_get_value (keyfile, "g", "k", value, error);
+  g_key_file_free (keyfile);
+  return ret;
+}
+
 /*
  * mcd_keyfile_get_value:
  * @keyfile: A #GKeyFile
@@ -1092,6 +1129,37 @@ mcd_storage_set_parameter (McdStorage *self,
   return updated;
 }
 
+static gchar *
+mcpa_escape_value_for_keyfile (const McpAccountManager *unused G_GNUC_UNUSED,
+    const GValue *value)
+{
+  return mcd_keyfile_escape_value (value);
+}
+
+/*
+ * @value: a populated #GValue of a supported #GType
+ *
+ * Escape the contents of @value to go in a #GKeyFile. Return the
+ * value that would go in the keyfile.
+ *
+ * For instance, for a boolean value TRUE this would return "true",
+ * and for a string containing one space, it would return "\s".
+ */
+gchar *
+mcd_keyfile_escape_value (const GValue *value)
+{
+  GKeyFile *keyfile;
+  gchar *ret;
+
+  g_return_val_if_fail (G_IS_VALUE (value), NULL);
+
+  keyfile = g_key_file_new ();
+  mcd_keyfile_set_value (keyfile, "g", "k", value);
+  ret = g_key_file_get_value (keyfile, "g", "k", NULL);
+  g_key_file_free (keyfile);
+  return ret;
+}
+
 /*
  * mcd_keyfile_set_value:
  * @keyfile: a keyfile
@@ -1460,6 +1528,8 @@ plugin_iface_init (McpAccountManagerIface *iface,
   iface->make_secret = make_secret;
   iface->unique_name = unique_name;
   iface->list_keys = list_keys;
+  iface->escape_value_for_keyfile = mcpa_escape_value_for_keyfile;
+  iface->unescape_value_from_keyfile = mcpa_unescape_value_from_keyfile;
 }
 
 gboolean
diff --git a/src/mcd-storage.h b/src/mcd-storage.h
index 0c99e3f..f69bc5d 100644
--- a/src/mcd-storage.h
+++ b/src/mcd-storage.h
@@ -146,6 +146,11 @@ gboolean mcd_keyfile_set_value (GKeyFile *keyfile,
     const gchar *key,
     const GValue *value);
 
+gchar *mcd_keyfile_escape_value (const GValue *value);
+gboolean mcd_keyfile_unescape_value (const gchar *escaped,
+    GValue *value,
+    GError **error);
+
 G_END_DECLS
 
 #endif /* MCD_STORAGE_H */



More information about the telepathy-commits mailing list