aboutsummaryrefslogtreecommitdiffstats
path: root/composer/e-composer-private.c
diff options
context:
space:
mode:
Diffstat (limited to 'composer/e-composer-private.c')
-rw-r--r--composer/e-composer-private.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/composer/e-composer-private.c b/composer/e-composer-private.c
index a5282afe2b..b35c84d4c8 100644
--- a/composer/e-composer-private.c
+++ b/composer/e-composer-private.c
@@ -639,6 +639,87 @@ e_composer_get_default_charset (void)
return charset;
}
+gchar *
+e_composer_decode_clue_value (const gchar *encoded_value)
+{
+ GString *buffer;
+ const gchar *cp;
+
+ /* Decode a GtkHtml "ClueFlow" value. */
+
+ g_return_val_if_fail (encoded_value != NULL, NULL);
+
+ buffer = g_string_sized_new (strlen (encoded_value));
+
+ /* Copy the value, decoding escaped characters as we go. */
+ cp = encoded_value;
+ while (*cp != '\0') {
+ if (*cp == '.') {
+ cp++;
+ switch (*cp) {
+ case '.':
+ g_string_append_c (buffer, '.');
+ break;
+ case '1':
+ g_string_append_c (buffer, '"');
+ break;
+ case '2':
+ g_string_append_c (buffer, '=');
+ break;
+ default:
+ /* Invalid escape sequence. */
+ g_string_free (buffer, TRUE);
+ return NULL;
+ }
+ } else
+ g_string_append_c (buffer, *cp);
+ cp++;
+ }
+
+ return g_string_free (buffer, FALSE);
+}
+
+gchar *
+e_composer_encode_clue_value (const gchar *decoded_value)
+{
+ gchar *encoded_value;
+ gchar **strv;
+
+ /* Encode a GtkHtml "ClueFlow" value. */
+
+ g_return_val_if_fail (decoded_value != NULL, NULL);
+
+ /* XXX This is inefficient but easy to understand. */
+
+ encoded_value = g_strdup (decoded_value);
+
+ /* Substitution: '.' --> '..' (do this first) */
+ if (strchr (encoded_value, '.') != NULL) {
+ strv = g_strsplit (encoded_value, ".", 0);
+ g_free (encoded_value);
+ encoded_value = g_strjoinv ("..", strv);
+ g_strfreev (strv);
+ }
+
+ /* Substitution: '"' --> '.1' */
+ if (strchr (encoded_value, '"') != NULL) {
+ strv = g_strsplit (encoded_value, """", 0);
+ g_free (encoded_value);
+ encoded_value = g_strjoinv (".1", strv);
+ g_strfreev (strv);
+ }
+
+ /* Substitution: '=' --> '.2' */
+ if (strchr (encoded_value, '=') != NULL) {
+ strv = g_strsplit (encoded_value, "=", 0);
+ g_free (encoded_value);
+ encoded_value = g_strjoinv (".2", strv);
+ g_strfreev (strv);
+ }
+
+ return encoded_value;
+}
+
gboolean
e_composer_paste_html (EMsgComposer *composer,
GtkClipboard *clipboard)