diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2012-01-01 03:43:58 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2012-01-01 03:57:30 +0800 |
commit | 70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe (patch) | |
tree | a389e21805c4e1909f0c3bdd21de57f36e60c648 /composer/e-composer-private.c | |
parent | a7abe3ac594dd3324f473b8200641e03cf64f774 (diff) | |
download | gsoc2013-evolution-70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe.tar gsoc2013-evolution-70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe.tar.gz gsoc2013-evolution-70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe.tar.bz2 gsoc2013-evolution-70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe.tar.lz gsoc2013-evolution-70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe.tar.xz gsoc2013-evolution-70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe.tar.zst gsoc2013-evolution-70b27af74ecaf38a1567ff1a7d483f7a65d7f2fe.zip |
Move gtkhtml data encoding/decoding to e-composer-private.c.
Simplify the algorithms, trading efficiency for readability.
Diffstat (limited to 'composer/e-composer-private.c')
-rw-r--r-- | composer/e-composer-private.c | 81 |
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) |