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;