changeset 17253:7befa48ab574

merge of '4e303e0d82031bfb84148de1b35be7efabbb36f7' and '522048c8056ba8571da0e228fa9b9570d65da0eb'
author Mark Doliner <mark@kingant.net>
date Wed, 23 May 2007 06:28:36 +0000
parents 9235189117c0 (diff) c72295a65f7a (current diff)
children 0d9fba04fc85
files libpurple/protocols/oscar/family_auth.c
diffstat 35 files changed, 339 insertions(+), 613 deletions(-) [+]
line wrap: on
line diff
--- a/AUTHORS	Wed May 23 06:24:15 2007 +0000
+++ b/AUTHORS	Wed May 23 06:28:36 2007 +0000
@@ -3,8 +3,7 @@
 
 For a complete list of all contributors, see the COPYRIGHT file.
 
-We've got an IRC room now too, #pidgin on irc.freenode.net
-(#pidgin-win32 for Windows users). Come check us out.
+We've got an IRC room now too, #pidgin on irc.freenode.net. Come check us out.
 
 Current Developers:
 ------------------
--- a/libpurple/ft.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/ft.c	Wed May 23 06:28:36 2007 +0000
@@ -891,7 +891,7 @@
 		r = purple_xfer_read(xfer, &buffer);
 		if (r > 0) {
 			fwrite(buffer, 1, r, xfer->dest_fp);
-		} else if(r <= 0) {
+		} else if(r < 0) {
 			purple_xfer_cancel_remote(xfer);
 			return;
 		}
--- a/libpurple/protocols/msn/msn.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/msn/msn.c	Wed May 23 06:28:36 2007 +0000
@@ -1297,7 +1297,12 @@
 
 	conv = swboard->conv;
 
-	msn_switchboard_release(swboard, MSN_SB_FLAG_IM);
+	/* If we release the switchboard here, it may still have messages
+	   pending ACK which would result in incorrect unsent message errors.
+	   Just let it timeout... This is *so* going to screw with people who
+	   use dumb clients that report "User has closed the conversation window" */
+	/* msn_switchboard_release(swboard, MSN_SB_FLAG_IM); */
+	swboard->conv = NULL;
 
 	/* If other switchboards managed to associate themselves with this
 	 * conv, make sure they know it's gone! */
--- a/libpurple/protocols/oscar/bstream.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/bstream.c	Wed May 23 06:28:36 2007 +0000
@@ -172,10 +172,10 @@
 {
 	guint8 *ob;
 
-	ob = malloc(len);
+	ob = g_malloc(len);
 
 	if (byte_stream_getrawbuf(bs, ob, len) < len) {
-		free(ob);
+		g_free(ob);
 		return NULL;
 	}
 
@@ -186,10 +186,10 @@
 {
 	char *ob;
 
-	ob = malloc(len + 1);
+	ob = g_malloc(len + 1);
 
 	if (byte_stream_getrawbuf(bs, (guint8 *)ob, len) < len) {
-		free(ob);
+		g_free(ob);
 		return NULL;
 	}
 
--- a/libpurple/protocols/oscar/family_admin.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_admin.c	Wed May 23 06:28:36 2007 +0000
@@ -81,12 +81,12 @@
 
 		switch (type) {
 			case 0x0001: {
-				free(sn);
+				g_free(sn);
 				sn = byte_stream_getstr(bs, length);
 			} break;
 
 			case 0x0004: {
-				free(url);
+				g_free(url);
 				url = byte_stream_getstr(bs, length);
 			} break;
 
@@ -95,7 +95,7 @@
 			} break;
 
 			case 0x0011: {
-				free(email);
+				g_free(email);
 				if (length == 0)
 					email = g_strdup("*suppressed");
 				else
@@ -109,9 +109,9 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		userfunc(od, conn, frame, (snac->subtype == 0x0005) ? 1 : 0, perms, err, url, sn, email);
 
-	free(sn);
-	free(url);
-	free(email);
+	g_free(sn);
+	g_free(url);
+	g_free(email);
 
 	return 1;
 }
--- a/libpurple/protocols/oscar/family_alert.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_alert.c	Wed May 23 06:28:36 2007 +0000
@@ -111,10 +111,10 @@
 	for (new = od->emailinfo; (new && memcmp(cookie16, new->cookie16, 16)); new = new->next);
 	if (new) {
 		/* Free some of the old info, if it exists */
-		free(new->cookie8);
-		free(new->cookie16);
-		free(new->url);
-		free(new->domain);
+		g_free(new->cookie8);
+		g_free(new->cookie16);
+		g_free(new->url);
+		g_free(new->domain);
 	} else {
 		/* We don't already have info, so create a new struct for it */
 		new = g_new0(struct aim_emailinfo, 1);
@@ -154,8 +154,8 @@
 
 	aim_tlvlist_free(&tlvlist);
 
-	free(alertitle);
-	free(alerturl);
+	g_free(alertitle);
+	g_free(alerturl);
 
 	return ret;
 }
@@ -210,11 +210,11 @@
 	{
 		struct aim_emailinfo *tmp = od->emailinfo;
 		od->emailinfo = od->emailinfo->next;
-		free(tmp->cookie16);
-		free(tmp->cookie8);
-		free(tmp->url);
-		free(tmp->domain);
-		free(tmp);
+		g_free(tmp->cookie16);
+		g_free(tmp->cookie8);
+		g_free(tmp->url);
+		g_free(tmp->domain);
+		g_free(tmp);
 	}
 
 	return;
--- a/libpurple/protocols/oscar/family_auth.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_auth.c	Wed May 23 06:28:36 2007 +0000
@@ -134,7 +134,7 @@
 	guint8 *password_encoded;
 
 	passwdlen = strlen(password);
-	password_encoded = (guint8 *)malloc(passwdlen+1);
+	password_encoded = (guint8 *)g_malloc(passwdlen+1);
 	if (passwdlen > MAXICQPASSLEN)
 		passwdlen = MAXICQPASSLEN;
 
@@ -159,7 +159,7 @@
 
 	aim_tlvlist_write(&frame->data, &tl);
 
-	free(password_encoded);
+	g_free(password_encoded);
 	aim_tlvlist_free(&tl);
 
 	flap_connection_send(conn, frame);
@@ -224,12 +224,10 @@
 
 	/* Truncate ICQ and AOL passwords, if necessary */
 	password_len = strlen(password);
-fprintf(stderr, "1 password_len=%zu\n", password_len);
 	if (isdigit(sn[0]) && (password_len > MAXICQPASSLEN))
 		password_len = MAXICQPASSLEN;
 	else if (truncate_pass && password_len > 8)
 		password_len = 8;
-fprintf(stderr, "2 password_len=%zu\n", password_len);
 
 	aim_encode_password_md5(password, password_len, key, digest);
 
@@ -540,7 +538,7 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, keystr, (int)truncate_pass);
 
-	free(keystr);
+	g_free(keystr);
 	aim_tlvlist_free(&tlvlist);
 
 	return ret;
--- a/libpurple/protocols/oscar/family_bart.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_bart.c	Wed May 23 06:28:36 2007 +0000
@@ -151,9 +151,9 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, sn, iconcsumtype, iconcsum, iconcsumlen, icon, iconlen);
 
-	free(sn);
-	free(iconcsum);
-	free(icon);
+	g_free(sn);
+	g_free(iconcsum);
+	g_free(icon);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/family_bos.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_bos.c	Wed May 23 06:28:36 2007 +0000
@@ -136,7 +136,7 @@
 	else
 		return -EINVAL;
 
-	localcpy = strdup(denylist);
+	localcpy = g_strdup(denylist);
 
 	listcount = aimutil_itemcnt(localcpy, '&');
 	packlen = aimutil_tokslen(localcpy, 99, '&') + listcount + 9;
@@ -152,9 +152,9 @@
 		byte_stream_put8(&frame->data, strlen(tmpptr));
 		byte_stream_putstr(&frame->data, tmpptr);
 
-		free(tmpptr);
+		g_free(tmpptr);
 	}
-	free(localcpy);
+	g_free(localcpy);
 
 	flap_connection_send(conn, frame);
 
--- a/libpurple/protocols/oscar/family_buddy.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_buddy.c	Wed May 23 06:28:36 2007 +0000
@@ -135,7 +135,7 @@
 	char *localcpy = NULL;
 	char *tmpptr = NULL;
 
-	if (!buddy_list || !(localcpy = strdup(buddy_list)))
+	if (!buddy_list || !(localcpy = g_strdup(buddy_list)))
 		return -EINVAL;
 
 	for (tmpptr = strtok(localcpy, "&"); tmpptr; ) {
@@ -162,7 +162,7 @@
 
 	flap_connection_send(conn, frame);
 
-	free(localcpy);
+	g_free(localcpy);
 
 	return 0;
 }
--- a/libpurple/protocols/oscar/family_chat.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_chat.c	Wed May 23 06:28:36 2007 +0000
@@ -41,8 +41,8 @@
 	struct chatconnpriv *ccp = (struct chatconnpriv *)conn->internal;
 
 	if (ccp)
-		free(ccp->name);
-	free(ccp);
+		g_free(ccp->name);
+	g_free(ccp);
 
 	return;
 }
@@ -100,12 +100,12 @@
 		return -EINVAL;
 
 	if (conn->internal)
-		free(conn->internal);
+		g_free(conn->internal);
 
 	ccp = g_new(struct chatconnpriv, 1);
 
 	ccp->exchange = exchange;
-	ccp->name = strdup(roomname);
+	ccp->name = g_strdup(roomname);
 	ccp->instance = instance;
 
 	conn->internal = (void *)ccp;
@@ -203,7 +203,7 @@
 		ByteStream occbs;
 
 		/* Allocate enough userinfo structs for all occupants */
-		userinfo = calloc(usercount, sizeof(aim_userinfo_t));
+		userinfo = g_new0(aim_userinfo_t, usercount);
 
 		byte_stream_init(&occbs, tlv->value, tlv->length);
 
@@ -301,14 +301,14 @@
 				maxvisiblemsglen);
 	}
 
-	free(roominfo.name);
+	g_free(roominfo.name);
 
 	while (usercount > 0)
 		aim_info_free(&userinfo[--usercount]);
 
-	free(userinfo);
-	free(roomname);
-	free(roomdesc);
+	g_free(userinfo);
+	g_free(roomname);
+	g_free(roomdesc);
 	aim_tlvlist_free(&tlvlist);
 
 	return ret;
@@ -324,7 +324,7 @@
 
 	while (byte_stream_empty(bs)) {
 		curcount++;
-		userinfo = realloc(userinfo, curcount * sizeof(aim_userinfo_t));
+		userinfo = g_realloc(userinfo, curcount * sizeof(aim_userinfo_t));
 		aim_info_extract(od, bs, &userinfo[curcount-1]);
 	}
 
@@ -332,7 +332,7 @@
 		ret = userfunc(od, conn, frame, curcount, userinfo);
 
 	aim_info_free(userinfo);
-	free(userinfo);
+	g_free(userinfo);
 
 	return ret;
 }
@@ -488,8 +488,8 @@
 		cookie[i] = byte_stream_get8(bs);
 
 	if ((ck = aim_uncachecookie(od, cookie, AIM_COOKIETYPE_CHAT))) {
-		free(ck->data);
-		free(ck);
+		g_free(ck->data);
+		g_free(ck);
 	}
 
 	/*
@@ -569,9 +569,9 @@
 		ret = userfunc(od, conn, frame, &userinfo, len, msg, encoding, language);
 
 	aim_info_free(&userinfo);
-	free(msg);
-	free(encoding);
-	free(language);
+	g_free(msg);
+	g_free(encoding);
+	g_free(language);
 	aim_tlvlist_free(&tlvlist);
 
 	return ret;
--- a/libpurple/protocols/oscar/family_chatnav.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_chatnav.c	Wed May 23 06:28:36 2007 +0000
@@ -133,7 +133,7 @@
 
 		curexchange++;
 
-		exchanges = realloc(exchanges, curexchange * sizeof(struct aim_chat_exchangeinfo));
+		exchanges = g_realloc(exchanges, curexchange * sizeof(struct aim_chat_exchangeinfo));
 
 		/* exchange number */
 		exchanges[curexchange-1].number = byte_stream_get16(&tbs);
@@ -300,13 +300,13 @@
 		ret = userfunc(od, conn, frame, snac2->type, maxrooms, curexchange, exchanges);
 
 	for (curexchange--; curexchange >= 0; curexchange--) {
-		free(exchanges[curexchange].name);
-		free(exchanges[curexchange].charset1);
-		free(exchanges[curexchange].lang1);
-		free(exchanges[curexchange].charset2);
-		free(exchanges[curexchange].lang2);
+		g_free(exchanges[curexchange].name);
+		g_free(exchanges[curexchange].charset1);
+		g_free(exchanges[curexchange].lang1);
+		g_free(exchanges[curexchange].charset2);
+		g_free(exchanges[curexchange].lang2);
 	}
-	free(exchanges);
+	g_free(exchanges);
 	aim_tlvlist_free(&tlvlist);
 
 	return ret;
@@ -345,7 +345,7 @@
 	if (detaillevel != 0x02) {
 		purple_debug_misc("oscar", "unknown detaillevel in create room response (0x%02x)\n", detaillevel);
 		aim_tlvlist_free(&tlvlist);
-		free(ck);
+		g_free(ck);
 		return 0;
 	}
 
@@ -378,9 +378,9 @@
 		ret = userfunc(od, conn, frame, snac2->type, fqcn, instance, exchange, flags, createtime, maxmsglen, maxoccupancy, createperms, unknown, name, ck);
 	}
 
-	free(ck);
-	free(name);
-	free(fqcn);
+	g_free(ck);
+	g_free(name);
+	g_free(fqcn);
 	aim_tlvlist_free(&innerlist);
 	aim_tlvlist_free(&tlvlist);
 
@@ -442,8 +442,8 @@
 		purple_debug_misc("oscar", "chatnav_parse_info: unknown request subtype (%04x)\n", snac2->type);
 
 	if (snac2)
-		free(snac2->data);
-	free(snac2);
+		g_free(snac2->data);
+	g_free(snac2);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/family_feedbag.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_feedbag.c	Wed May 23 06:28:36 2007 +0000
@@ -81,7 +81,7 @@
 	if (newlen > 0) {
 		guint8 *newdata;
 
-		newdata = (guint8 *)malloc((newlen)*sizeof(guint8));
+		newdata = (guint8 *)g_malloc((newlen)*sizeof(guint8));
 		newlen = 0;
 		if (group->gid == 0x0000) {
 			for (cur=list; cur; cur=cur->next)
@@ -94,7 +94,7 @@
 		}
 		aim_tlvlist_replace_raw(&group->data, 0x00c8, newlen, newdata);
 
-		free(newdata);
+		g_free(newdata);
 	}
 }
 
@@ -115,11 +115,11 @@
 	gboolean exists;
 	struct aim_ssi_item *cur, *new;
 
-	new = (struct aim_ssi_item *)malloc(sizeof(struct aim_ssi_item));
+	new = (struct aim_ssi_item *)g_malloc(sizeof(struct aim_ssi_item));
 
 	/* Set the name */
 	if (name) {
-		new->name = (char *)malloc((strlen(name)+1)*sizeof(char));
+		new->name = (char *)g_malloc((strlen(name)+1)*sizeof(char));
 		strcpy(new->name, name);
 	} else
 		new->name = NULL;
@@ -213,9 +213,9 @@
 	}
 
 	/* Free the removed item */
-	free(del->name);
+	g_free(del->name);
 	aim_tlvlist_free(&del->data);
-	free(del);
+	g_free(del);
 
 	return 0;
 }
@@ -510,7 +510,7 @@
 		for (cur1=od->ssi.local; cur1 && (n < 15); cur1=cur1->next) {
 			if (!aim_ssi_itemlist_find(od->ssi.official, cur1->gid, cur1->bid)) {
 				n++;
-				new = (struct aim_ssi_tmp *)malloc(sizeof(struct aim_ssi_tmp));
+				new = (struct aim_ssi_tmp *)g_malloc(sizeof(struct aim_ssi_tmp));
 				new->action = SNAC_SUBTYPE_FEEDBAG_ADD;
 				new->ack = 0xffff;
 				new->name = NULL;
@@ -530,7 +530,7 @@
 		for (cur1=od->ssi.official; cur1 && (n < 15); cur1=cur1->next) {
 			if (!aim_ssi_itemlist_find(od->ssi.local, cur1->gid, cur1->bid)) {
 				n++;
-				new = (struct aim_ssi_tmp *)malloc(sizeof(struct aim_ssi_tmp));
+				new = (struct aim_ssi_tmp *)g_malloc(sizeof(struct aim_ssi_tmp));
 				new->action = SNAC_SUBTYPE_FEEDBAG_DEL;
 				new->ack = 0xffff;
 				new->name = NULL;
@@ -551,7 +551,7 @@
 			cur2 = aim_ssi_itemlist_find(od->ssi.official, cur1->gid, cur1->bid);
 			if (cur2 && (aim_ssi_itemlist_cmp(cur1, cur2))) {
 				n++;
-				new = (struct aim_ssi_tmp *)malloc(sizeof(struct aim_ssi_tmp));
+				new = (struct aim_ssi_tmp *)g_malloc(sizeof(struct aim_ssi_tmp));
 				new->action = SNAC_SUBTYPE_FEEDBAG_MOD;
 				new->ack = 0xffff;
 				new->name = NULL;
@@ -609,25 +609,25 @@
 	while (cur) {
 		del = cur;
 		cur = cur->next;
-		free(del->name);
+		g_free(del->name);
 		aim_tlvlist_free(&del->data);
-		free(del);
+		g_free(del);
 	}
 
 	cur = od->ssi.local;
 	while (cur) {
 		del = cur;
 		cur = cur->next;
-		free(del->name);
+		g_free(del->name);
 		aim_tlvlist_free(&del->data);
-		free(del);
+		g_free(del);
 	}
 
 	curtmp = od->ssi.pending;
 	while (curtmp) {
 		deltmp = curtmp;
 		curtmp = curtmp->next;
-		free(deltmp);
+		g_free(deltmp);
 	}
 
 	od->ssi.numitems = 0;
@@ -672,7 +672,7 @@
 			char *alias = aim_ssi_getalias(od->ssi.local, NULL, cur->name);
 			aim_ssi_addbuddy(od, cur->name, "orphans", alias, NULL, NULL, 0);
 			aim_ssi_delbuddy(od, cur->name, NULL);
-			free(alias);
+			g_free(alias);
 		}
 		cur = next;
 	}
@@ -929,7 +929,7 @@
 	aim_ssi_delbuddy(od, sn, oldgn);
 	aim_ssi_addbuddy(od, sn, newgn, alias, NULL, NULL, waitingforauth);
 
-	free(alias);
+	g_free(alias);
 
 	return 0;
 }
@@ -1012,8 +1012,8 @@
 	if (!(group = aim_ssi_itemlist_finditem(od->ssi.local, oldgn, NULL, AIM_SSI_TYPE_GROUP)))
 		return -EINVAL;
 
-	free(group->name);
-	group->name = (char *)malloc((strlen(newgn)+1)*sizeof(char));
+	g_free(group->name);
+	group->name = (char *)g_malloc((strlen(newgn)+1)*sizeof(char));
 	strcpy(group->name, newgn);
 
 	/* Sync our local list with the server list */
@@ -1086,12 +1086,12 @@
 	}
 
 	/* Need to add the 0x00d5 TLV to the TLV chain */
-	csumdata = (guint8 *)malloc((iconsumlen+2)*sizeof(guint8));
+	csumdata = (guint8 *)g_malloc((iconsumlen+2)*sizeof(guint8));
 	aimutil_put8(&csumdata[0], 0x00);
 	aimutil_put8(&csumdata[1], iconsumlen);
 	memcpy(&csumdata[2], iconsum, iconsumlen);
 	aim_tlvlist_replace_raw(&tmp->data, 0x00d5, (iconsumlen+2) * sizeof(guint8), csumdata);
-	free(csumdata);
+	g_free(csumdata);
 
 	/* Need to add the 0x0131 TLV to the TLV chain, used to cache the icon */
 	aim_tlvlist_replace_noval(&tmp->data, 0x0131);
@@ -1188,7 +1188,7 @@
 
 	byte_stream_init(&bstream, tlv->value, tlv->length);
 
-	maxitems = (guint16 *)malloc((tlv->length/2)*sizeof(guint16));
+	maxitems = (guint16 *)g_malloc((tlv->length/2)*sizeof(guint16));
 
 	for (i=0; i<(tlv->length/2); i++)
 		maxitems[i] = byte_stream_get16(&bstream);
@@ -1197,7 +1197,7 @@
 		ret = userfunc(od, conn, frame, tlv->length/2, maxitems);
 
 	aim_tlvlist_free(&tlvlist);
-	free(maxitems);
+	g_free(maxitems);
 
 	return ret;
 }
@@ -1283,7 +1283,7 @@
 		type = byte_stream_get16(bs);
 		data = aim_tlvlist_readlen(bs, byte_stream_get16(bs));
 		aim_ssi_itemlist_add(&od->ssi.official, name, gid, bid, type, data);
-		free(name);
+		g_free(name);
 		aim_tlvlist_free(&data);
 	}
 
@@ -1411,7 +1411,7 @@
 		if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 			ret = userfunc(od, conn, frame, type, name);
 
-		free(name);
+		g_free(name);
 	}
 
 	return ret;
@@ -1447,9 +1447,9 @@
 		/* Replace the 2 local items with the given one */
 		if ((item = aim_ssi_itemlist_find(od->ssi.local, gid, bid))) {
 			item->type = type;
-			free(item->name);
+			g_free(item->name);
 			if (name) {
-				item->name = (char *)malloc((strlen(name)+1)*sizeof(char));
+				item->name = (char *)g_malloc((strlen(name)+1)*sizeof(char));
 				strcpy(item->name, name);
 			} else
 				item->name = NULL;
@@ -1459,9 +1459,9 @@
 
 		if ((item = aim_ssi_itemlist_find(od->ssi.official, gid, bid))) {
 			item->type = type;
-			free(item->name);
+			g_free(item->name);
 			if (name) {
-				item->name = (char *)malloc((strlen(name)+1)*sizeof(char));
+				item->name = (char *)g_malloc((strlen(name)+1)*sizeof(char));
 				strcpy(item->name, name);
 			} else
 				item->name = NULL;
@@ -1472,7 +1472,7 @@
 		if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 			ret = userfunc(od, conn, frame);
 
-		free(name);
+		g_free(name);
 		aim_tlvlist_free(&data);
 	}
 
@@ -1543,7 +1543,7 @@
 				/* Make sure cur->item is still valid memory */
 				if (aim_ssi_itemlist_valid(od->ssi.local, cur->item)) {
 					if (cur->item->name) {
-						cur->name = (char *)malloc((strlen(cur->item->name)+1)*sizeof(char));
+						cur->name = (char *)g_malloc((strlen(cur->item->name)+1)*sizeof(char));
 						strcpy(cur->name, cur->item->name);
 					}
 					aim_ssi_itemlist_del(&od->ssi.local, cur->item);
@@ -1555,9 +1555,9 @@
 				if (aim_ssi_itemlist_valid(od->ssi.local, cur->item)) {
 					struct aim_ssi_item *cur1;
 					if ((cur1 = aim_ssi_itemlist_find(od->ssi.official, cur->item->gid, cur->item->bid))) {
-						free(cur->item->name);
+						g_free(cur->item->name);
 						if (cur1->name) {
-							cur->item->name = (char *)malloc((strlen(cur1->name)+1)*sizeof(char));
+							cur->item->name = (char *)g_malloc((strlen(cur1->name)+1)*sizeof(char));
 							strcpy(cur->item->name, cur1->name);
 						} else
 							cur->item->name = NULL;
@@ -1589,9 +1589,9 @@
 				if (aim_ssi_itemlist_valid(od->ssi.local, cur->item)) {
 					struct aim_ssi_item *cur1;
 					if ((cur1 = aim_ssi_itemlist_find(od->ssi.official, cur->item->gid, cur->item->bid))) {
-						free(cur1->name);
+						g_free(cur1->name);
 						if (cur->item->name) {
-							cur1->name = (char *)malloc((strlen(cur->item->name)+1)*sizeof(char));
+							cur1->name = (char *)g_malloc((strlen(cur->item->name)+1)*sizeof(char));
 							strcpy(cur1->name, cur->item->name);
 						} else
 							cur1->name = NULL;
@@ -1620,8 +1620,8 @@
 	while (cur && (cur->ack != 0xffff)) {
 		del = cur;
 		cur = cur->next;
-		free(del->name);
-		free(del);
+		g_free(del->name);
+		g_free(del);
 	}
 	od->ssi.pending = cur;
 
@@ -1757,8 +1757,8 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, sn, msg);
 
-	free(sn);
-	free(msg);
+	g_free(sn);
+	g_free(msg);
 
 	return ret;
 }
@@ -1831,8 +1831,8 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, sn, msg);
 
-	free(sn);
-	free(msg);
+	g_free(sn);
+	g_free(msg);
 
 	return ret;
 }
@@ -1918,8 +1918,8 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, sn, reply, msg);
 
-	free(sn);
-	free(msg);
+	g_free(sn);
+	g_free(msg);
 
 	return ret;
 }
@@ -1943,7 +1943,7 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, sn);
 
-	free(sn);
+	g_free(sn);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/family_icbm.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_icbm.c	Wed May 23 06:28:36 2007 +0000
@@ -468,16 +468,16 @@
 	aim_putsnac(&frame->data, 0x0004, 0x0006, 0x0000, snacid);
 
 	/* XXX should be uncached by an unwritten 'invite accept' handler */
-	priv = malloc(sizeof(struct aim_invite_priv));
-	priv->sn = strdup(sn);
-	priv->roomname = strdup(roomname);
+	priv = g_malloc(sizeof(struct aim_invite_priv));
+	priv->sn = g_strdup(sn);
+	priv->roomname = g_strdup(roomname);
 	priv->exchange = exchange;
 	priv->instance = instance;
 
 	if ((msgcookie = aim_mkcookie(cookie, AIM_COOKIETYPE_INVITE, priv)))
 		aim_cachecookie(od, msgcookie);
 	else
-		free(priv);
+		g_free(priv);
 
 	/* ICBM Header */
 	aim_im_puticbm(&frame->data, cookie, 0x0002, sn);
@@ -1279,8 +1279,8 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, channel, sn, msg, icbmflags, flag1, flag2);
 
-	free(sn);
-	free(msg);
+	g_free(sn);
+	g_free(msg);
 	aim_tlvlist_free(&tlvlist);
 
 	return ret;
@@ -1335,7 +1335,7 @@
 {
 	aim_mpmsg_section_t *sec;
 
-	sec = malloc(sizeof(aim_mpmsg_section_t));
+	sec = g_malloc(sizeof(aim_mpmsg_section_t));
 
 	sec->charset = charset;
 	sec->charsubset = charsubset;
@@ -1362,11 +1362,11 @@
 {
 	gchar *dup;
 
-	dup = malloc(datalen);
+	dup = g_malloc(datalen);
 	memcpy(dup, data, datalen);
 
 	if (mpmsg_addsection(od, mpm, charset, charsubset, dup, datalen) == -1) {
-		free(dup);
+		g_free(dup);
 		return -1;
 	}
 
@@ -1378,11 +1378,11 @@
 {
 	gchar *dup;
 
-	if (!(dup = strdup(ascii)))
+	if (!(dup = g_strdup(ascii)))
 		return -1;
 
 	if (mpmsg_addsection(od, mpm, 0x0000, 0x0000, dup, strlen(ascii)) == -1) {
-		free(dup);
+		g_free(dup);
 		return -1;
 	}
 
@@ -1395,7 +1395,7 @@
 	ByteStream bs;
 	int i;
 
-	buf = malloc(unicodelen * 2);
+	buf = g_malloc(unicodelen * 2);
 
 	byte_stream_init(&bs, (guchar *)buf, unicodelen * 2);
 
@@ -1404,7 +1404,7 @@
 		byte_stream_put16(&bs, unicode[i]);
 
 	if (mpmsg_addsection(od, mpm, 0x0002, 0x0000, buf, byte_stream_curpos(&bs)) == -1) {
-		free(buf);
+		g_free(buf);
 		return -1;
 	}
 
@@ -1419,8 +1419,8 @@
 		aim_mpmsg_section_t *tmp;
 
 		tmp = cur->next;
-		free(cur->data);
-		free(cur);
+		g_free(cur->data);
+		g_free(cur);
 		cur = tmp;
 	}
 
@@ -1659,7 +1659,7 @@
 				purple_debug_misc("oscar", "Received an IM containing an invalid message part from %s.  They are probably trying to do something malicious.\n", userinfo->sn);
 				break;
 			}
-			free(args.extdata);
+			g_free(args.extdata);
 			args.extdatalen = length;
 			if (args.extdatalen == 0)
 				args.extdata = NULL;
@@ -1686,8 +1686,8 @@
 		ret = userfunc(od, conn, frame, channel, userinfo, &args);
 
 	aim_mpmsg_free(od, &args.mpmsg);
-	free(args.features);
-	free(args.extdata);
+	g_free(args.features);
+	g_free(args.extdata);
 
 	return ret;
 }
@@ -1733,10 +1733,10 @@
 
 			purple_debug_misc("oscar", "got a buddy list from %s: group %s, buddy %s\n", userinfo->sn, gn, bn);
 
-			free(bn);
+			g_free(bn);
 		}
 
-		free(gn);
+		g_free(gn);
 	}
 
 	return;
@@ -1745,7 +1745,7 @@
 static void
 incomingim_ch2_buddyicon_free(OscarData *od, IcbmArgsCh2 *args)
 {
-	free(args->info.icon.icon);
+	g_free(args->info.icon.icon);
 
 	return;
 }
@@ -1767,7 +1767,7 @@
 incomingim_ch2_chat_free(OscarData *od, IcbmArgsCh2 *args)
 {
 	/* XXX - aim_chat_roominfo_free() */
-	free(args->info.chat.roominfo.name);
+	g_free(args->info.chat.roominfo.name);
 
 	return;
 }
@@ -1786,7 +1786,7 @@
 static void
 incomingim_ch2_icqserverrelay_free(OscarData *od, IcbmArgsCh2 *args)
 {
-	free((char *)args->info.rtfmsg.rtfmsg);
+	g_free((char *)args->info.rtfmsg.rtfmsg);
 }
 
 /*
@@ -1832,7 +1832,7 @@
 static void
 incomingim_ch2_sendfile_free(OscarData *od, IcbmArgsCh2 *args)
 {
-	free(args->info.sendfile.filename);
+	g_free(args->info.sendfile.filename);
 }
 
 /* Someone is sending us a file */
@@ -1918,11 +1918,11 @@
 	{
 		purple_debug_warning("oscar",
 				"Cookies don't match in rendezvous ICBM, bailing out.\n");
-		free(cookie2);
+		g_free(cookie2);
 		return 1;
 	}
 	memcpy(args.cookie, cookie2, 8);
-	free(cookie2);
+	g_free(cookie2);
 
 	/*
 	 * The next 16bytes are a capability block so we can
@@ -2074,9 +2074,9 @@
 	if (args.destructor)
 		((ch2_args_destructor_t)args.destructor)(od, &args);
 
-	free((char *)args.msg);
-	free((char *)args.encoding);
-	free((char *)args.language);
+	g_free((char *)args.msg);
+	g_free((char *)args.encoding);
+	g_free((char *)args.language);
 
 	aim_tlvlist_free(&list2);
 
@@ -2107,7 +2107,7 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, channel, userinfo, &args);
 
-	free(args.msg);
+	g_free(args.msg);
 
 	return ret;
 }
@@ -2210,7 +2210,7 @@
 	}
 
 	aim_info_free(&userinfo);
-	free(cookie);
+	g_free(cookie);
 
 	return ret;
 }
@@ -2379,7 +2379,7 @@
 				if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 					ret = userfunc(od, conn, frame, channel, sn, reason, state, msg);
 
-				free(msg);
+				g_free(msg);
 			} break;
 
 			default: {
@@ -2389,8 +2389,8 @@
 		} /* end switch */
 	}
 
-	free(cookie);
-	free(sn);
+	g_free(cookie);
+	g_free(sn);
 
 	return ret;
 }
@@ -2418,8 +2418,8 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, ch, sn);
 
-	free(sn);
-	free(cookie);
+	g_free(sn);
+	g_free(cookie);
 
 	return ret;
 }
@@ -2502,7 +2502,7 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, type1, sn, type2);
 
-	free(sn);
+	g_free(sn);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/family_icq.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_icq.c	Wed May 23 06:28:36 2007 +0000
@@ -212,7 +212,7 @@
 	flap_connection_send(conn, frame);
 
 	/* Keep track of this request and the ICQ number and request ID */
-	info = (struct aim_icq_info *)calloc(1, sizeof(struct aim_icq_info));
+	info = (struct aim_icq_info *)g_new0(struct aim_icq_info, 1);
 	info->reqid = snacid;
 	info->uin = atoi(uin);
 	info->next = od->icq_info;
@@ -256,7 +256,7 @@
 	flap_connection_send(conn, frame);
 
 	/* Keep track of this request and the ICQ number and request ID */
-	info = (struct aim_icq_info *)calloc(1, sizeof(struct aim_icq_info));
+	info = (struct aim_icq_info *)g_new0(struct aim_icq_info, 1);
 	info->reqid = snacid;
 	info->uin = atoi(uin);
 	info->next = od->icq_info;
@@ -426,7 +426,7 @@
 
 	flap_connection_send(conn, frame);
 
-	free(xml);
+	g_free(xml);
 
 	return 0;
 }
@@ -437,34 +437,34 @@
 
 	if (!info)
 		return;
-	free(info->nick);
-	free(info->first);
-	free(info->last);
-	free(info->email);
-	free(info->homecity);
-	free(info->homestate);
-	free(info->homephone);
-	free(info->homefax);
-	free(info->homeaddr);
-	free(info->mobile);
-	free(info->homezip);
-	free(info->personalwebpage);
+	g_free(info->nick);
+	g_free(info->first);
+	g_free(info->last);
+	g_free(info->email);
+	g_free(info->homecity);
+	g_free(info->homestate);
+	g_free(info->homephone);
+	g_free(info->homefax);
+	g_free(info->homeaddr);
+	g_free(info->mobile);
+	g_free(info->homezip);
+	g_free(info->personalwebpage);
 	if (info->email2)
 		for (i = 0; i < info->numaddresses; i++)
-			free(info->email2[i]);
-	free(info->email2);
-	free(info->workcity);
-	free(info->workstate);
-	free(info->workphone);
-	free(info->workfax);
-	free(info->workaddr);
-	free(info->workzip);
-	free(info->workcompany);
-	free(info->workdivision);
-	free(info->workposition);
-	free(info->workwebpage);
-	free(info->info);
-	free(info);
+			g_free(info->email2[i]);
+	g_free(info->email2);
+	g_free(info->workcity);
+	g_free(info->workstate);
+	g_free(info->workphone);
+	g_free(info->workfax);
+	g_free(info->workaddr);
+	g_free(info->workzip);
+	g_free(info->workcompany);
+	g_free(info->workdivision);
+	g_free(info->workposition);
+	g_free(info->workwebpage);
+	g_free(info->info);
+	g_free(info);
 }
 
 /**
@@ -515,7 +515,7 @@
 		if ((userfunc = aim_callhandler(od, SNAC_FAMILY_ICQ, SNAC_SUBTYPE_ICQ_OFFLINEMSG)))
 			ret = userfunc(od, conn, frame, &msg);
 
-		free(msg.msg);
+		g_free(msg.msg);
 
 	} else if (cmd == 0x0042) {
 		aim_rxcallback_t userfunc;
@@ -534,7 +534,7 @@
 		/* find other data from the same request */
 		for (info = od->icq_info; info && (info->reqid != reqid); info = info->next);
 		if (!info) {
-			info = (struct aim_icq_info *)calloc(1, sizeof(struct aim_icq_info));
+			info = (struct aim_icq_info *)g_new0(struct aim_icq_info, 1);
 			info->reqid = reqid;
 			info->next = od->icq_info;
 			od->icq_info = info;
@@ -603,7 +603,7 @@
 		case 0x00eb: { /* email address(es) */
 			int i;
 			info->numaddresses = byte_stream_getle16(&qbs);
-			info->email2 = (char **)calloc(info->numaddresses, sizeof(char *));
+			info->email2 = (char **)g_new0(char *, info->numaddresses);
 			for (i = 0; i < info->numaddresses; i++) {
 				info->email2[i] = byte_stream_getstr(&qbs, byte_stream_getle16(&qbs));
 				if (i+1 != info->numaddresses)
--- a/libpurple/protocols/oscar/family_locate.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_locate.c	Wed May 23 06:28:36 2007 +0000
@@ -238,8 +238,8 @@
 	cur = aim_locate_finduserinfo(od, userinfo->sn);
 
 	if (cur == NULL) {
-		cur = (aim_userinfo_t *)calloc(1, sizeof(aim_userinfo_t));
-		cur->sn = strdup(userinfo->sn);
+		cur = (aim_userinfo_t *)g_new0(aim_userinfo_t, 1);
+		cur->sn = g_strdup(userinfo->sn);
 		cur->next = od->locate.userinfo;
 		od->locate.userinfo = cur;
 	}
@@ -261,63 +261,63 @@
 	cur->present |= userinfo->present;
 
 	if (userinfo->iconcsumlen > 0) {
-		free(cur->iconcsum);
-		cur->iconcsum = (guint8 *)malloc(userinfo->iconcsumlen);
+		g_free(cur->iconcsum);
+		cur->iconcsum = (guint8 *)g_malloc(userinfo->iconcsumlen);
 		memcpy(cur->iconcsum, userinfo->iconcsum, userinfo->iconcsumlen);
 		cur->iconcsumlen = userinfo->iconcsumlen;
 	}
 
 	if (userinfo->info != NULL) {
-		free(cur->info);
-		free(cur->info_encoding);
+		g_free(cur->info);
+		g_free(cur->info_encoding);
 		if (userinfo->info_len > 0) {
-			cur->info = (char *)malloc(userinfo->info_len);
+			cur->info = (char *)g_malloc(userinfo->info_len);
 			memcpy(cur->info, userinfo->info, userinfo->info_len);
 		} else
 			cur->info = NULL;
-		cur->info_encoding = strdup(userinfo->info_encoding);
+		cur->info_encoding = g_strdup(userinfo->info_encoding);
 		cur->info_len = userinfo->info_len;
 	}
 
 	if (userinfo->status != NULL) {
-		free(cur->status);
-		free(cur->status_encoding);
+		g_free(cur->status);
+		g_free(cur->status_encoding);
 		if (userinfo->status_len > 0) {
-			cur->status = (char *)malloc(userinfo->status_len);
+			cur->status = (char *)g_malloc(userinfo->status_len);
 			memcpy(cur->status, userinfo->status, userinfo->status_len);
 		} else
 			cur->status = NULL;
 		if (userinfo->status_encoding != NULL)
-			cur->status_encoding = strdup(userinfo->status_encoding);
+			cur->status_encoding = g_strdup(userinfo->status_encoding);
 		else
 			cur->status_encoding = NULL;
 		cur->status_len = userinfo->status_len;
 	}
 
 	if (userinfo->itmsurl != NULL) {
-		free(cur->itmsurl);
-		free(cur->itmsurl_encoding);
+		g_free(cur->itmsurl);
+		g_free(cur->itmsurl_encoding);
 		if (userinfo->itmsurl_len > 0) {
-			cur->itmsurl = (char *)malloc(userinfo->itmsurl_len);
+			cur->itmsurl = (char *)g_malloc(userinfo->itmsurl_len);
 			memcpy(cur->itmsurl, userinfo->itmsurl, userinfo->itmsurl_len);
 		} else
 			cur->itmsurl = NULL;
 		if (userinfo->itmsurl_encoding != NULL)
-			cur->itmsurl_encoding = strdup(userinfo->itmsurl_encoding);
+			cur->itmsurl_encoding = g_strdup(userinfo->itmsurl_encoding);
 		else
 			cur->itmsurl_encoding = NULL;
 		cur->itmsurl_len = userinfo->itmsurl_len;
 	}
 
 	if (userinfo->away != NULL) {
-		free(cur->away);
-		free(cur->away_encoding);
+		g_free(cur->away);
+		g_free(cur->away_encoding);
 		if (userinfo->away_len > 0) {
-			cur->away = (char *)malloc(userinfo->away_len);
+			cur->away = (char *)g_malloc(userinfo->away_len);
 			memcpy(cur->away, userinfo->away, userinfo->away_len);
 		} else
 			cur->away = NULL;
-		cur->away_encoding = strdup(userinfo->away_encoding);
+		cur->away_encoding = g_strdup(userinfo->away_encoding);
 		cur->away_len = userinfo->away_len;
 
 	} else if (!(userinfo->flags & AIM_FLAG_AWAY)) {
@@ -326,11 +326,11 @@
 		 * If the user is not away, clear any cached away message now.
 		 */
 		if (cur->away) {
-			free(cur->away);
+			g_free(cur->away);
 			cur->away = NULL;
 		}
 		if (cur->away_encoding) {
-			free(cur->away_encoding);
+			g_free(cur->away_encoding);
 			cur->away_encoding = NULL;
 		}
 		cur->away_len = 0;
@@ -401,8 +401,8 @@
 		del = od->locate.requested;
 		od->locate.requested = del->next;
 		was_explicit = FALSE;
-		free(del->sn);
-		free(del);
+		g_free(del->sn);
+		g_free(del);
 	}
 
 	cur = od->locate.requested;
@@ -411,8 +411,8 @@
 			del = cur->next;
 			cur->next = del->next;
 			was_explicit = FALSE;
-			free(del->sn);
-			free(del);
+			g_free(del->sn);
+			g_free(del);
 		} else
 			cur = cur->next;
 	}
@@ -447,8 +447,8 @@
 	}
 
 	/* Add a new node to our request queue */
-	cur = (struct userinfo_node *)malloc(sizeof(struct userinfo_node));
-	cur->sn = strdup(sn);
+	cur = (struct userinfo_node *)g_malloc(sizeof(struct userinfo_node));
+	cur->sn = g_strdup(sn);
 	cur->next = od->locate.torequest;
 	od->locate.torequest = cur;
 
@@ -502,7 +502,7 @@
 					cap[10], cap[11], cap[12], cap[13],
 					cap[14], cap[15]);
 
-		free(cap);
+		g_free(cap);
 	}
 
 	return flags;
@@ -531,7 +531,7 @@
 		if (!identified)
 			purple_debug_misc("oscar", "unknown short capability: {%02x%02x}\n", cap[0], cap[1]);
 
-		free(cap);
+		g_free(cap);
 	}
 
 	return flags;
@@ -586,16 +586,16 @@
 void
 aim_info_free(aim_userinfo_t *info)
 {
-	free(info->sn);
-	free(info->iconcsum);
-	free(info->info);
-	free(info->info_encoding);
-	free(info->status);
-	free(info->status_encoding);
-	free(info->itmsurl);
-	free(info->itmsurl_encoding);
-	free(info->away);
-	free(info->away_encoding);
+	g_free(info->sn);
+	g_free(info->iconcsum);
+	g_free(info->info);
+	g_free(info->info_encoding);
+	g_free(info->status);
+	g_free(info->status_encoding);
+	g_free(info->itmsurl);
+	g_free(info->itmsurl_encoding);
+	g_free(info->away);
+	g_free(info->away_encoding);
 }
 
 /*
@@ -829,7 +829,7 @@
 
 					case 0x0001: { /* A buddy icon checksum */
 						if ((length2 > 0) && ((number == 0x00) || (number == 0x01))) {
-							free(outinfo->iconcsum);
+							g_free(outinfo->iconcsum);
 							outinfo->iconcsumtype = number;
 							outinfo->iconcsum = byte_stream_getraw(bs, length2);
 							outinfo->iconcsumlen = length2;
@@ -838,8 +838,8 @@
 					} break;
 
 					case 0x0002: { /* A status/available message */
-						free(outinfo->status);
-						free(outinfo->status_encoding);
+						g_free(outinfo->status);
+						g_free(outinfo->status_encoding);
 						if (length2 >= 4) {
 							outinfo->status_len = byte_stream_get16(bs);
 							outinfo->status = byte_stream_getstr(bs, outinfo->status_len);
@@ -859,8 +859,8 @@
 					} break;
 
 					case 0x0009: { /* An iTunes Music Store link */
-						free(outinfo->itmsurl);
-						free(outinfo->itmsurl_encoding);
+						g_free(outinfo->itmsurl);
+						g_free(outinfo->itmsurl_encoding);
 						if (length2 >= 4) {
 							outinfo->itmsurl_len = byte_stream_get16(bs);
 							outinfo->itmsurl = byte_stream_getstr(bs, outinfo->itmsurl_len);
@@ -1013,8 +1013,8 @@
 			ret = userfunc(od, conn, frame, reason, sn);
 
 	if (snac2)
-		free(snac2->data);
-	free(snac2);
+		g_free(snac2->data);
+	g_free(snac2);
 
 	return ret;
 }
@@ -1113,11 +1113,11 @@
 	/* Build the packet first to get real length */
 	if (profile) {
 		/* no + 1 here because of %s */
-		encoding = malloc(strlen(defencoding) + strlen(profile_encoding));
+		encoding = g_malloc(strlen(defencoding) + strlen(profile_encoding));
 		snprintf(encoding, strlen(defencoding) + strlen(profile_encoding), defencoding, profile_encoding);
 		aim_tlvlist_add_str(&tl, 0x0001, encoding);
 		aim_tlvlist_add_raw(&tl, 0x0002, profile_len, (const guchar *)profile);
-		free(encoding);
+		g_free(encoding);
 	}
 
 	/*
@@ -1130,11 +1130,11 @@
 	 */
 	if (awaymsg) {
 		if (awaymsg_len) {
-			encoding = malloc(strlen(defencoding) + strlen(awaymsg_encoding));
+			encoding = g_malloc(strlen(defencoding) + strlen(awaymsg_encoding));
 			snprintf(encoding, strlen(defencoding) + strlen(awaymsg_encoding), defencoding, awaymsg_encoding);
 			aim_tlvlist_add_str(&tl, 0x0003, encoding);
 			aim_tlvlist_add_raw(&tl, 0x0004, awaymsg_len, (const guchar *)awaymsg);
-			free(encoding);
+			g_free(encoding);
 		} else
 			aim_tlvlist_add_noval(&tl, 0x0004);
 	}
@@ -1225,14 +1225,14 @@
 	aim_tlv_t *tlv = NULL;
 	int was_explicit;
 
-	userinfo = (aim_userinfo_t *)malloc(sizeof(aim_userinfo_t));
+	userinfo = (aim_userinfo_t *)g_malloc(sizeof(aim_userinfo_t));
 	aim_info_extract(od, bs, userinfo);
 	tlvlist = aim_tlvlist_read(bs);
 
 	/* Profile will be 1 and 2 */
 	userinfo->info_encoding = aim_tlv_getstr(tlvlist, 0x0001, 1);
 	if ((tlv = aim_tlv_gettlv(tlvlist, 0x0002, 1))) {
-		userinfo->info = (char *)malloc(tlv->length);
+		userinfo->info = (char *)g_malloc(tlv->length);
 		memcpy(userinfo->info, tlv->value, tlv->length);
 		userinfo->info_len = tlv->length;
 	}
@@ -1240,7 +1240,7 @@
 	/* Away message will be 3 and 4 */
 	userinfo->away_encoding = aim_tlv_getstr(tlvlist, 0x0003, 1);
 	if ((tlv = aim_tlv_gettlv(tlvlist, 0x0004, 1))) {
-		userinfo->away = (char *)malloc(tlv->length);
+		userinfo->away = (char *)g_malloc(tlv->length);
 		memcpy(userinfo->away, tlv->value, tlv->length);
 		userinfo->away_len = tlv->length;
 	}
@@ -1257,7 +1257,7 @@
 	aim_locate_adduserinfo(od, userinfo);
 	userinfo2 = aim_locate_finduserinfo(od, userinfo->sn);
 	aim_info_free(userinfo);
-	free(userinfo);
+	g_free(userinfo);
 
 	/*
 	 * Remove this screen name from our queue.  If the client requested
@@ -1454,7 +1454,7 @@
 		del = od->locate.userinfo;
 		od->locate.userinfo = od->locate.userinfo->next;
 		aim_info_free(del);
-		free(del);
+		g_free(del);
 	}
 }
 
--- a/libpurple/protocols/oscar/family_odir.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_odir.c	Wed May 23 06:28:36 2007 +0000
@@ -190,7 +190,7 @@
 	while (numresults) {
 		struct aim_odir *new;
 		aim_tlvlist_t *tl = aim_tlvlist_readnum(bs, byte_stream_get16(bs));
-		new = (struct aim_odir *)malloc(sizeof(struct aim_odir));
+		new = (struct aim_odir *)g_malloc(sizeof(struct aim_odir));
 		new->first = aim_tlv_getstr(tl, 0x0001, 1);
 		new->last = aim_tlv_getstr(tl, 0x0002, 1);
 		new->middle = aim_tlv_getstr(tl, 0x0003, 1);
@@ -217,21 +217,21 @@
 	while (results) {
 		struct aim_odir *del = results;
 		results = results->next;
-		free(del->first);
-		free(del->last);
-		free(del->middle);
-		free(del->maiden);
-		free(del->email);
-		free(del->country);
-		free(del->state);
-		free(del->city);
-		free(del->sn);
-		free(del->interest);
-		free(del->nick);
-		free(del->zip);
-		free(del->region);
-		free(del->address);
-		free(del);
+		g_free(del->first);
+		g_free(del->last);
+		g_free(del->middle);
+		g_free(del->maiden);
+		g_free(del->email);
+		g_free(del->country);
+		g_free(del->state);
+		g_free(del->city);
+		g_free(del->sn);
+		g_free(del->interest);
+		g_free(del->nick);
+		g_free(del->zip);
+		g_free(del->region);
+		g_free(del->address);
+		g_free(del);
 	}
 
 	return ret;
--- a/libpurple/protocols/oscar/family_oservice.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_oservice.c	Wed May 23 06:28:36 2007 +0000
@@ -194,12 +194,12 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, &redir);
 
-	free((void *)redir.ip);
-	free((void *)redir.cookie);
+	g_free((void *)redir.ip);
+	g_free((void *)redir.cookie);
 
 	if (origsnac)
-		free(origsnac->data);
-	free(origsnac);
+		g_free(origsnac->data);
+	g_free(origsnac);
 
 	aim_tlvlist_free(&tlvlist);
 
@@ -588,7 +588,7 @@
 	conn = flap_connection_findbygroup(od, SNAC_FAMILY_BOS);
 	if(!conn)
 		return;
-	
+
 	aim_genericreq_l(od, conn, 0x0001, 0x0011, &idletime);
 }
 
@@ -641,7 +641,7 @@
 		ret = userfunc(od, conn, frame, ip, cktlv ? cktlv->value : NULL);
 
 	aim_tlvlist_free(&tl);
-	free(ip);
+	g_free(ip);
 
 	return ret;
 }
@@ -679,7 +679,7 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, id, msg);
 
-	free(msg);
+	g_free(msg);
 
 	aim_tlvlist_free(&tlvlist);
 
@@ -769,7 +769,7 @@
 	/* This is frivolous. (Thank you SmarterChild.) */
 	vercount = byte_stream_empty(bs)/4;
 	versions = byte_stream_getraw(bs, byte_stream_empty(bs));
-	free(versions);
+	g_free(versions);
 
 	/*
 	 * Now request rates.
@@ -927,7 +927,7 @@
 	if ((userfunc = aim_callhandler(od, snac->family, snac->subtype)))
 		ret = userfunc(od, conn, frame, offset, len, modname);
 
-	free(modname);
+	g_free(modname);
 	aim_tlvlist_free(&list);
 
 	return ret;
@@ -1051,13 +1051,13 @@
 			/* not sure what the difference between 1 and 0 is */
 			guint8 *md5 = byte_stream_getraw(bs, length);
 			ret = userfunc(od, conn, frame, type, flags, length, md5);
-			free(md5);
+			g_free(md5);
 			} break;
 		case 0x0002: { /* available message */
 			/* there is a second length that is just for the message */
 			char *msg = byte_stream_getstr(bs, byte_stream_get16(bs));
 			ret = userfunc(od, conn, frame, msg);
-			free(msg);
+			g_free(msg);
 			} break;
 		}
 	}
--- a/libpurple/protocols/oscar/family_popup.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_popup.c	Wed May 23 06:28:36 2007 +0000
@@ -54,8 +54,8 @@
 		ret = userfunc(od, conn, frame, msg, url, width, height, delay);
 
 	aim_tlvlist_free(&tl);
-	free(msg);
-	free(url);
+	g_free(msg);
+	g_free(url);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/family_userlookup.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/family_userlookup.c	Wed May 23 06:28:36 2007 +0000
@@ -49,8 +49,8 @@
 
 	/* XXX freesnac()? */
 	if (snac2)
-		free(snac2->data);
-	free(snac2);
+		g_free(snac2->data);
+	g_free(snac2);
 
 	return ret;
 }
@@ -107,14 +107,14 @@
 	 */
 	while ((cur = aim_tlv_getstr(tlvlist, 0x0001, j+1)) && j < m)
 	{
-		buf = realloc(buf, (j+1) * (MAXSNLEN+1));
+		buf = g_realloc(buf, (j+1) * (MAXSNLEN+1));
 
 		strncpy(&buf[j * (MAXSNLEN+1)], cur, MAXSNLEN);
-		free(cur);
+		g_free(cur);
 
 		j++;
 	}
-	free(cur);
+	g_free(cur);
 
 	aim_tlvlist_free(&tlvlist);
 
@@ -123,10 +123,10 @@
 
 	/* XXX freesnac()? */
 	if (snac2)
-		free(snac2->data);
-	free(snac2);
+		g_free(snac2->data);
+	g_free(snac2);
 
-	free(buf);
+	g_free(buf);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/flap_connection.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/flap_connection.c	Wed May 23 06:28:36 2007 +0000
@@ -723,7 +723,7 @@
 
 	aim_tlvlist_free(&tlvlist);
 
-	free(msg);
+	g_free(msg);
 }
 
 /**
--- a/libpurple/protocols/oscar/misc.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/misc.c	Wed May 23 06:28:36 2007 +0000
@@ -128,8 +128,8 @@
 		ret = userfunc(od, conn, frame, error, snac2 ? snac2->data : NULL);
 
 	if (snac2)
-		free(snac2->data);
-	free(snac2);
+		g_free(snac2->data);
+	g_free(snac2);
 
 	return ret;
 }
--- a/libpurple/protocols/oscar/msgcookie.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/msgcookie.c	Wed May 23 06:28:36 2007 +0000
@@ -113,7 +113,7 @@
 	if (!c)
 		return NULL;
 
-	cookie = calloc(1, sizeof(IcbmCookie));
+	cookie = g_new0(IcbmCookie, 1);
 
 	cookie->data = data;
 	cookie->type = type;
@@ -172,8 +172,8 @@
 			prev = &cur->next;
 	}
 
-	free(cookie->data);
-	free(cookie);
+	g_free(cookie->data);
+	g_free(cookie);
 
 	return 0;
 }
--- a/libpurple/protocols/oscar/oft.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/oft.c	Wed May 23 06:28:36 2007 +0000
@@ -568,7 +568,7 @@
 			break;
 	}
 
-	free(frame.name);
+	g_free(frame.name);
 }
 
 /*******************************************************************/
--- a/libpurple/protocols/oscar/rxhandlers.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/rxhandlers.c	Wed May 23 06:28:36 2007 +0000
@@ -55,14 +55,14 @@
 	mod = g_new0(aim_module_t, 1);
 
 	if (modfirst(od, mod) == -1) {
-		free(mod);
+		g_free(mod);
 		return -1;
 	}
 
 	if (aim__findmodule(od, mod->name)) {
 		if (mod->shutdown)
 			mod->shutdown(od, mod);
-		free(mod);
+		g_free(mod);
 		return -1;
 	}
 
@@ -86,7 +86,7 @@
 		if (cur->shutdown)
 			cur->shutdown(od, cur);
 
-		free(cur);
+		g_free(cur);
 
 		cur = tmp;
 	}
--- a/libpurple/protocols/oscar/snac.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/snac.c	Wed May 23 06:28:36 2007 +0000
@@ -57,7 +57,7 @@
 	snac.flags = flags;
 
 	if (datalen) {
-		if (!(snac.data = malloc(datalen)))
+		if (!(snac.data = g_malloc(datalen)))
 			return 0; /* er... */
 		memcpy(snac.data, data, datalen);
 	} else
@@ -78,7 +78,7 @@
 	if (!newsnac)
 		return 0;
 
-	if (!(snac = malloc(sizeof(aim_snac_t))))
+	if (!(snac = g_malloc(sizeof(aim_snac_t))))
 		return 0;
 	memcpy(snac, newsnac, sizeof(aim_snac_t));
 	snac->issuetime = time(NULL);
@@ -109,7 +109,7 @@
 		if (cur->id == id) {
 			*prev = cur->next;
 			if (cur->flags & AIM_SNACFLAGS_DESTRUCTOR) {
-				free(cur->data);
+				g_free(cur->data);
 				cur->data = NULL;
 			}
 			return cur;
@@ -145,8 +145,8 @@
 
 				*prev = cur->next;
 
-				free(cur->data);
-				free(cur);
+				g_free(cur->data);
+				g_free(cur);
 			} else
 				prev = &cur->next;
 		}
--- a/libpurple/protocols/oscar/tlv.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/tlv.c	Wed May 23 06:28:36 2007 +0000
@@ -41,8 +41,8 @@
 	if (!oldtlv || !*oldtlv)
 		return;
 
-	free((*oldtlv)->value);
-	free(*oldtlv);
+	g_free((*oldtlv)->value);
+	g_free(*oldtlv);
 	*oldtlv = NULL;
 
 	return;
@@ -103,7 +103,7 @@
 				cur->tlv->value = byte_stream_getraw(bs, length);
 				if (!cur->tlv->value) {
 					freetlv(&cur->tlv);
-					free(cur);
+					g_free(cur);
 					aim_tlvlist_free(&list);
 					return NULL;
 				}
@@ -159,7 +159,7 @@
 			cur->tlv->value = byte_stream_getraw(bs, length);
 			if (!cur->tlv->value) {
 				freetlv(&cur->tlv);
-				free(cur);
+				g_free(cur);
 				aim_tlvlist_free(&list);
 				return NULL;
 			}
@@ -216,7 +216,7 @@
 			cur->tlv->value = byte_stream_getraw(bs, length);
 			if (!cur->tlv->value) {
 				freetlv(&cur->tlv);
-				free(cur);
+				g_free(cur);
 				aim_tlvlist_free(&list);
 				return NULL;
 			}
@@ -271,8 +271,8 @@
 	aim_tlvlist_write(&bs2, &two);
 
 	if (memcmp(bs1.data, bs2.data, bs1.len)) {
-		free(bs1.data);
-		free(bs2.data);
+		g_free(bs1.data);
+		g_free(bs2.data);
 		return 1;
 	}
 
@@ -304,7 +304,7 @@
 		freetlv(&cur->tlv);
 
 		tmp = cur->next;
-		free(cur);
+		g_free(cur);
 		cur = tmp;
 	}
 
@@ -600,7 +600,7 @@
 	if (cur == NULL)
 		return aim_tlvlist_add_raw(list, type, length, value);
 
-	free(cur->tlv->value);
+	g_free(cur->tlv->value);
 	cur->tlv->length = length;
 	if (cur->tlv->length > 0) {
 		cur->tlv->value = g_memdup(value, length);
@@ -705,9 +705,9 @@
 	}
 
 	/* Free the removed item */
-	free(del->tlv->value);
-	free(del->tlv);
-	free(del);
+	g_free(del->tlv->value);
+	g_free(del->tlv);
+	g_free(del);
 }
 
 /**
@@ -808,7 +808,7 @@
 {
 	char *ret;
 
-	ret = malloc(tlv->length + 1);
+	ret = g_malloc(tlv->length + 1);
 	memcpy(ret, tlv->value, tlv->length);
 	ret[tlv->length] = '\0';
 
--- a/libpurple/protocols/oscar/util.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/protocols/oscar/util.c	Wed May 23 06:28:36 2007 +0000
@@ -101,14 +101,14 @@
 	next = strchr(last, dl);
 
 	if (curCount < theindex) {
-		toReturn = malloc(sizeof(char));
+		toReturn = g_malloc(sizeof(char));
 		*toReturn = '\0';
 	} else {
 		if (next == NULL) {
-			toReturn = malloc((strlen(last) + 1) * sizeof(char));
+			toReturn = g_malloc((strlen(last) + 1) * sizeof(char));
 			strcpy(toReturn, last);
 		} else {
-			toReturn = malloc((next - last + 1) * sizeof(char));
+			toReturn = g_malloc((next - last + 1) * sizeof(char));
 			memcpy(toReturn, last, (next - last));
 			toReturn[next - last] = '\0';
 		}
--- a/libpurple/purple-url-handler	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/purple-url-handler	Wed May 23 06:28:36 2007 +0000
@@ -38,257 +38,6 @@
 
 cpurple = CheckedObject(purple)
 
-def extendlist(list, length, fill):
-    if len(list) < length:
-        return list + [fill] * (length - len(list))
-    else:
-        return list
-
-def convert(value):
-    try:
-        return int(value)
-    except:
-        return value
-
-def findaccount(protocolname, accountname=""):
-    # prefer connected accounts
-    account = cpurple.PurpleAccountsFindConnected(accountname, protocolname)
-    if (account != 0):
-	return account
-
-    # try to get any account and connect it
-    account = cpurple.PurpleAccountsFindAny(accountname, protocolname)
-    if (account == 0):
-        print "No matching account found."
-	sys.exit(1)
-
-    purple.PurpleAccountSetStatusVargs(account, "online", 1)
-    purple.PurpleAccountConnect(account)
-    return account
-
-def goim(account, screenname, message=None):
-    # XXX: 1 == PURPLE_CONV_TYPE_IM
-    conversation = cpurple.PurpleConversationNew(1, account, screenname)
-    if message:
-        purple.PurpleConvSendConfirm(conversation, message)
-
-def gochat(account, params, message=None):
-    connection = cpurple.PurpleAccountGetConnection(account)
-    purple.ServJoinChat(connection, params)
-
-    if message != None:
-    	for i in range(20):
-            # XXX: 2 == PURPLE_CONV_TYPE_CHAT
-            conversation = purple.PurpleFindConversationWithAccount(2, params.get("channel", params.get("room")), account)
-            if conversation:
-                purple.PurpleConvSendConfirm(conversation, message)
-                break
-            else:
-                time.sleep(0.5)
-
-def addbuddy(account, screenname, group="", alias=""):
-    cpurple.PurpleBlistRequestAddBuddy(account, screenname, group, alias)
-
-
-def aim(uri):
-    protocol = "prpl-aim"
-    match = re.match(r"^aim:([^?]*)(\?(.*))", uri)
-    if not match:
-        print "Invalid aim URI: %s" % uri
-        return
-
-    command = urllib.unquote_plus(match.group(1))
-    paramstring = match.group(3)
-    params = {}
-    if paramstring:
-        for param in paramstring.split("&"):
-            key, value = extendlist(param.split("=", 1), 2, "")
-            params[key] = urllib.unquote_plus(value)
-    accountname = params.get("account", "")
-    screenname = params.get("screenname", "")
-
-    account = findaccount(protocol, accountname)
-
-    if command.lower() == "goim":
-        goim(account, screenname, params.get("message"))
-    elif command.lower() == "gochat":
-        gochat(account, params)
-    elif command.lower() == "addbuddy":
-        addbuddy(account, screenname, params.get("group", ""))
-
-def gg(uri):
-    protocol = "prpl-gg"
-    match = re.match(r"^gg:(.*)", uri)
-    if not match:
-        print "Invalid gg URI: %s" % uri
-        return
-
-    screenname = urllib.unquote_plus(match.group(1))
-    account = findaccount(protocol)
-    goim(account, screenname)
-
-def icq(uri):
-    protocol = "prpl-icq"
-    match = re.match(r"^icq:([^?]*)(\?(.*))", uri)
-    if not match:
-        print "Invalid icq URI: %s" % uri
-        return
-
-    command = urllib.unquote_plus(match.group(1))
-    paramstring = match.group(3)
-    params = {}
-    if paramstring:
-        for param in paramstring.split("&"):
-            key, value = extendlist(param.split("=", 1), 2, "")
-            params[key] = urllib.unquote_plus(value)
-    accountname = params.get("account", "")
-    screenname = params.get("screenname", "")
-
-    account = findaccount(protocol, accountname)
-
-    if command.lower() == "goim":
-        goim(account, screenname, params.get("message"))
-    elif command.lower() == "gochat":
-        gochat(account, params)
-    elif command.lower() == "addbuddy":
-        addbuddy(account, screenname, params.get("group", ""))
-
-def irc(uri):
-    protocol = "prpl-irc"
-    match = re.match(r"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?", uri)
-    if not match:
-        print "Invalid irc URI: %s" % uri
-        return
-
-    server = urllib.unquote_plus(match.group(2)) or ""
-    target = match.group(3) or ""
-    query = match.group(5) or ""
-
-    modifiers = {}
-    if target:
-        for modifier in target.split(",")[1:]:
-            modifiers[modifier] = True
-
-    isnick = modifiers.has_key("isnick")
-
-    paramstring = match.group(5)
-    params = {}
-    if paramstring:
-        for param in paramstring.split("&"):
-            key, value = extendlist(param.split("=", 1), 2, "")
-            params[key] = urllib.unquote_plus(value)
-
-    account = findaccount(protocol)
-
-    if (target != ""):
-        if (isnick):
-            goim(account, urllib.unquote_plus(target.split(",")[0]), params.get("msg"))
-	else:
-            channel = urllib.unquote_plus(target.split(",")[0])
-            if channel[0] != "#":
-                channel = "#" + channel
-            gochat(account, {"server": server, "channel": channel, "password": params.get("key", "")}, params.get("msg"))
-
-def msnim(uri):
-    protocol = "prpl-msn"
-    match = re.match(r"^msnim:([^?]*)(\?(.*))", uri)
-    if not match:
-        print "Invalid msnim URI: %s" % uri
-        return
-
-    command = urllib.unquote_plus(match.group(1))
-    paramstring = match.group(3)
-    params = {}
-    if paramstring:
-        for param in paramstring.split("&"):
-            key, value = extendlist(param.split("=", 1), 2, "")
-            params[key] = urllib.unquote_plus(value)
-    screenname = params.get("contact", "")
-
-    account = findaccount(protocol)
-
-    if command.lower() == "chat":
-        goim(account, screenname)
-    elif command.lower() == "add":
-        addbuddy(account, screenname)
-
-def sip(uri):
-    protocol = "prpl-simple"
-    match = re.match(r"^sip:(.*)", uri)
-    if not match:
-        print "Invalid sip URI: %s" % uri
-        return
-
-    screenname = urllib.unquote_plus(match.group(1))
-    account = findaccount(protocol)
-    goim(account, screenname)
-
-def xmpp(uri):
-    protocol = "prpl-jabber"
-    match = re.match(r"^xmpp:(//([^/?#]*)/?)?([^?#]*)(\?([^;#]*)(;([^#]*))?)?(#(.*))?", uri)
-    if not match:
-        print "Invalid xmpp URI: %s" % uri
-        return
-
-    tmp = match.group(2)
-    if (tmp):
-        accountname = urllib.unquote_plus(tmp)
-    else:
-        accountname = ""
-
-    screenname = urllib.unquote_plus(match.group(3))
-
-    tmp = match.group(5)
-    if (tmp):
-        command = urllib.unquote_plus(tmp)
-    else:
-        command = ""
-
-    paramstring = match.group(7)
-    params = {}
-    if paramstring:
-        for param in paramstring.split(";"):
-            key, value = extendlist(param.split("=", 1), 2, "")
-            params[key] = urllib.unquote_plus(value)
-
-    account = findaccount(protocol, accountname)
-
-    if command.lower() == "message":
-        goim(account, screenname, params.get("body"))
-    elif command.lower() == "join":
-        room, server = screenname.split("@")
-        gochat(account, {"room": room, "server": server})
-    elif command.lower() == "roster":
-        addbuddy(account, screenname, params.get("group", ""), params.get("name", ""))
-    else:
-        goim(account, screenname)
-
-def ymsgr(uri):
-    protocol = "prpl-yahoo"
-    match = re.match(r"^ymsgr:([^?]*)(\?([^&]*)(&(.*))?)", uri)
-    if not match:
-        print "Invalid ymsgr URI: %s" % uri
-        return
-
-    command = urllib.unquote_plus(match.group(1))
-    screenname = urllib.unquote_plus(match.group(3))
-    paramstring = match.group(5)
-    params = {}
-    if paramstring:
-        for param in paramstring.split("&"):
-            key, value = extendlist(param.split("=", 1), 2, "")
-            params[key] = urllib.unquote_plus(value)
-
-    account = findaccount(protocol)
-
-    if command.lower() == "sendim":
-        goim(account, screenname, params.get("m"))
-    elif command.lower() == "chat":
-        gochat(account, {"room": screenname})
-    elif command.lower() == "addfriend":
-        addbuddy(account, screenname)
-
-
 def main(argv=sys.argv):
     if len(argv) != 2:
         print "Usage: %s URI" % argv[0]
@@ -296,27 +45,10 @@
         return
 
     uri = argv[1]
-    type = uri.split(":")[0]
 
+    print uri
     try:
-        if type == "aim":
-            aim(uri)
-        elif type == "gg":
-            gg(uri)
-        elif type == "icq":
-            icq(uri)
-        elif type == "irc":
-            irc(uri)
-        elif type == "msnim":
-            msnim(uri)
-        elif type == "sip":
-            sip(uri)
-        elif type == "xmpp":
-            xmpp(uri)
-        elif type == "ymsgr":
-            ymsgr(uri)
-        else:
-            print "Unkown protocol: %s" % type
+        cpurple.PurpleGotProtocolHandlerUri(uri)
     except dbus.dbus_bindings.DBusException:
         print "ERROR: Is there a libpurple-powered client (e.g. Pidgin or Finch) running?"
 
--- a/libpurple/util.c	Wed May 23 06:24:15 2007 +0000
+++ b/libpurple/util.c	Wed May 23 06:28:36 2007 +0000
@@ -3159,10 +3159,13 @@
 					keyend = tmp;
 
 				if (keyend && keyend != pairstart) {
+					char *p;
 					key = g_strndup(pairstart, (keyend - pairstart));
 					/* If there is an explicit value */
 					if (keyend != tmp && keyend != (tmp - 1))
 						value = g_strndup(keyend + 1, (tmp - keyend - 1));
+					for (p = key; *p; ++p)
+						*p = g_ascii_tolower(*p);
 					g_hash_table_insert(params, key, value);
 				}
 				keyend = value = NULL;
--- a/pidgin/gtkdialogs.c	Wed May 23 06:24:15 2007 +0000
+++ b/pidgin/gtkdialogs.c	Wed May 23 06:28:36 2007 +0000
@@ -378,13 +378,8 @@
 
 	g_string_append(str, "<FONT SIZE=\"4\">URL:</FONT> <A HREF=\""
 					PURPLE_WEBSITE "\">" PURPLE_WEBSITE "</A><BR/><BR/>");
-#ifdef _WIN32
-	g_string_append_printf(str, _("<FONT SIZE=\"4\">IRC:</FONT> "
-						   "#pidgin-win32 on irc.freenode.net<BR><BR>"));
-#else
 	g_string_append_printf(str, _("<FONT SIZE=\"4\">IRC:</FONT> "
 						   "#pidgin on irc.freenode.net<BR><BR>"));
-#endif
 
 	/* Current Developers */
 	g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>",
--- a/pidgin/gtkimhtml.c	Wed May 23 06:24:15 2007 +0000
+++ b/pidgin/gtkimhtml.c	Wed May 23 06:28:36 2007 +0000
@@ -932,52 +932,41 @@
 static void copy_clipboard_cb(GtkIMHtml *imhtml, gpointer unused)
 {
 	GtkTextIter start, end;
-	GtkTextMark *sel = gtk_text_buffer_get_selection_bound(imhtml->text_buffer);
-	GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer);
-
-	gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &start, sel);
-	gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &end, ins);
-
-	gtk_clipboard_set_with_owner(gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD),
-				     selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry),
-				     (GtkClipboardGetFunc)gtk_imhtml_clipboard_get,
-				     (GtkClipboardClearFunc)NULL, G_OBJECT(imhtml));
-
-	if (imhtml->clipboard_html_string) {
+	if (gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) {
+		gtk_clipboard_set_with_owner(gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD),
+						 selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry),
+						 (GtkClipboardGetFunc)gtk_imhtml_clipboard_get,
+						 (GtkClipboardClearFunc)NULL, G_OBJECT(imhtml));
+
 		g_free(imhtml->clipboard_html_string);
 		g_free(imhtml->clipboard_text_string);
+
+		imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end);
+		imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end);
 	}
 
-	imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end);
-	imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end);
-
 	g_signal_stop_emission_by_name(imhtml, "copy-clipboard");
 }
 
 static void cut_clipboard_cb(GtkIMHtml *imhtml, gpointer unused)
 {
 	GtkTextIter start, end;
-	GtkTextMark *sel = gtk_text_buffer_get_selection_bound(imhtml->text_buffer);
-	GtkTextMark *ins = gtk_text_buffer_get_insert(imhtml->text_buffer);
-
-	gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &start, sel);
-	gtk_text_buffer_get_iter_at_mark(imhtml->text_buffer, &end, ins);
-
-	gtk_clipboard_set_with_owner(gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD),
-				     selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry),
-				     (GtkClipboardGetFunc)gtk_imhtml_clipboard_get,
-				     (GtkClipboardClearFunc)NULL, G_OBJECT(imhtml));
-
-	if (imhtml->clipboard_html_string) {
+	if (gtk_text_buffer_get_selection_bounds(imhtml->text_buffer, &start, &end)) {
+		gtk_clipboard_set_with_owner(gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD),
+						 selection_targets, sizeof(selection_targets) / sizeof(GtkTargetEntry),
+						 (GtkClipboardGetFunc)gtk_imhtml_clipboard_get,
+						 (GtkClipboardClearFunc)NULL, G_OBJECT(imhtml));
+
 		g_free(imhtml->clipboard_html_string);
 		g_free(imhtml->clipboard_text_string);
+
+		imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end);
+		imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end);
+
+		if (imhtml->editable)
+			gtk_text_buffer_delete_selection(imhtml->text_buffer, FALSE, FALSE);
 	}
 
-	imhtml->clipboard_html_string = gtk_imhtml_get_markup_range(imhtml, &start, &end);
-	imhtml->clipboard_text_string = gtk_imhtml_get_text(imhtml, &start, &end);
-
-	if (imhtml->editable)
-		gtk_text_buffer_delete_selection(imhtml->text_buffer, FALSE, FALSE);
 	g_signal_stop_emission_by_name(imhtml, "cut-clipboard");
 }
 
--- a/pidgin/gtkprefs.c	Wed May 23 06:24:15 2007 +0000
+++ b/pidgin/gtkprefs.c	Wed May 23 06:28:36 2007 +0000
@@ -1602,6 +1602,7 @@
 #ifdef USE_GSTREAMER
 			_("Automatic"), "automatic",
 			"ESD", "esd",
+			"ALSA", "alsa",
 #endif
 			_("Command"), "custom",
 			_("No sounds"), "none",
--- a/pidgin/gtksound.c	Wed May 23 06:24:15 2007 +0000
+++ b/pidgin/gtksound.c	Wed May 23 06:28:36 2007 +0000
@@ -466,6 +466,12 @@
 			purple_debug_error("sound", "Unable to create GStreamer audiosink.\n");
 			return;
 		}
+	} else if (!strcmp(method, "alsa")) {
+		sink = gst_element_factory_make("alsasink", "sink");
+		if (!sink) {
+			purple_debug_error("sound", "Unable to create GStreamer audiosink.\n");
+			return;
+		}
 	} else {
 		purple_debug_error("sound", "Unknown sound method '%s'\n", method);
 		return;
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Wed May 23 06:24:15 2007 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Wed May 23 06:28:36 2007 +0000
@@ -519,8 +519,7 @@
   SectionEnd
   Section $(PIDGIN_STARTMENU_SHORTCUT_SECTION_TITLE) SecStartMenuShortcut
     SetOverwrite on
-    CreateDirectory "$SMPROGRAMS\Pidgin"
-    CreateShortCut "$SMPROGRAMS\Pidgin\Pidgin.lnk" "$INSTDIR\pidgin.exe"
+    CreateShortCut "$SMPROGRAMS\Pidgin.lnk" "$INSTDIR\pidgin.exe"
     SetOverwrite off
   SectionEnd
 SectionGroupEnd
@@ -750,7 +749,6 @@
     RMDir "$INSTDIR"
 
     ; Shortcuts..
-    RMDir /r "$SMPROGRAMS\Pidgin"
     Delete "$DESKTOP\Pidgin.lnk"
 
     Goto done