Mercurial > pidgin
diff libpurple/util.c @ 27999:901476dc70b9
propagate from branch 'im.pidgin.pidgin' (head dd712fa84e46b2d78adf28e914d3e1a5c18a5154)
to branch 'im.pidgin.cpw.darkrain42.2.6.1' (head bbfae195c9c51fc001abbf89a084b54d4ec4b549)
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Wed, 19 Aug 2009 00:37:01 +0000 |
parents | 703b20fa6c5c |
children | c9c038529f38 39716f7d2c93 |
line wrap: on
line diff
--- a/libpurple/util.c Mon Aug 17 15:56:16 2009 +0000 +++ b/libpurple/util.c Wed Aug 19 00:37:01 2009 +0000 @@ -405,7 +405,7 @@ encoded_word_state_t state = state_start; const char *cur, *mark; const char *charset0 = NULL, *encoding0 = NULL, *encoded_text0 = NULL; - char *n, *new; + GString *new; /* token can be any CHAR (supposedly ISO8859-1/ISO2022), not just ASCII */ #define token_char_p(c) \ @@ -415,16 +415,9 @@ #define encoded_text_char_p(c) \ ((c & 0x80) == 0 && c != '?' && c != ' ' && isgraph(c)) - #define RECOVER_MARKED_TEXT strncpy(n, mark, cur - mark + 1); \ - n += cur - mark + 1 - g_return_val_if_fail(str != NULL, NULL); - /* NOTE: Assuming that we need just strlen(str)+1 *may* be wrong. - * It would be wrong if one byte (in some unknown encoding) could - * expand to >=4 bytes of UTF-8; I don't know if there are such things. - */ - n = new = g_malloc(strlen(str) + 1); + new = g_string_new(NULL); /* Here we will be looking for encoded words and if they seem to be * valid then decode them. @@ -437,7 +430,7 @@ if (*cur == '?') { state = state_question1; } else { - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -446,7 +439,7 @@ charset0 = cur; state = state_charset; } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -454,7 +447,7 @@ if (*cur == '?') { state = state_question2; } else if (!token_char_p(*cur)) { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -463,7 +456,7 @@ encoding0 = cur; state = state_encoding; } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -471,7 +464,7 @@ if (*cur == '?') { state = state_question3; } else if (!token_char_p(*cur)) { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -483,7 +476,7 @@ encoded_text0 = cur; state = state_question4; } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -491,7 +484,7 @@ if (*cur == '?') { state = state_question4; } else if (!encoded_text_char_p(*cur)) { - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -513,7 +506,7 @@ char *converted = g_convert((const gchar *)decoded, dec_len, "utf-8", charset, NULL, &len, NULL); if (converted) { - n = strncpy(n, converted, len) + len; + g_string_append_len(new, converted, len); g_free(converted); } g_free(decoded); @@ -523,7 +516,7 @@ g_free(encoded_text); state = state_equal2; /* Restart the FSM */ } else { /* This should never happen */ - RECOVER_MARKED_TEXT; + g_string_append_len(new, mark, cur - mark + 1); state = state_start; } break; @@ -533,19 +526,16 @@ state = state_equal1; } else { /* Some unencoded text. */ - *n = *cur; - n += 1; + g_string_append_c(new, *cur); } break; } /* switch */ } /* for */ - if (state != state_start) { - RECOVER_MARKED_TEXT; - } - *n = '\0'; - - return new; + if (state != state_start) + g_string_append_len(new, mark, cur - mark + 1); + + return g_string_free(new, FALSE);; } @@ -3519,6 +3509,7 @@ void purple_got_protocol_handler_uri(const char *uri) { char proto[11]; + char delimiter; const char *tmp, *param_string; char *cmd; GHashTable *params = NULL; @@ -3534,7 +3525,13 @@ proto[len] = '\0'; tmp++; - purple_debug_info("util", "Processing message '%s' for protocol '%s'.\n", tmp, proto); + + if (g_str_equal(proto, "xmpp")) + delimiter = ';'; + else + delimiter = '&'; + + purple_debug_info("util", "Processing message '%s' for protocol '%s' using delimiter '%c'.\n", tmp, proto, delimiter); if ((param_string = strchr(tmp, '?'))) { const char *keyend = NULL, *pairstart; @@ -3547,7 +3544,7 @@ pairstart = tmp = param_string; while (*tmp || *pairstart) { - if (*tmp == '&' || !(*tmp)) { + if (*tmp == delimiter || !(*tmp)) { /* If there is no explicit value */ if (keyend == NULL) keyend = tmp; @@ -3823,7 +3820,7 @@ /* Note: data is _not_ nul-terminated. */ if (data_len > header_len) { if (header[0] == '\n') - p = (g_strncasecmp(data, header + 1, header_len - 1) == 0) ? data : NULL; + p = (g_ascii_strncasecmp(data, header + 1, header_len - 1) == 0) ? data : NULL; if (!p) p = purple_strcasestr(data, header); if (p) @@ -3860,7 +3857,7 @@ content_is_chunked(const char *data, size_t data_len) { const char *p = find_header_content(data, data_len, "\nTransfer-Encoding: ", sizeof("\nTransfer-Encoding: ") - 1); - if (p && g_strncasecmp(p, "chunked", 7) == 0) + if (p && g_ascii_strncasecmp(p, "chunked", 7) == 0) return TRUE; return FALSE;