changeset 8733:18cfabf507d5

[gaim-migrate @ 9488] Fix a segfault in CVS when getting info from people not in your buddy list. Thanks to JP LaFleur for pointing it out and proposing a fix. Also make a few conversation-related errors in oscar use Sean's write_to_conversation error thing. And rename cnv to conv in some places to match everywhere else. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Wed, 21 Apr 2004 01:18:16 +0000
parents ee04a6089cbf
children 407c122d6191
files src/protocols/oscar/oscar.c
diffstat 1 files changed, 40 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/protocols/oscar/oscar.c	Tue Apr 20 23:35:15 2004 +0000
+++ b/src/protocols/oscar/oscar.c	Wed Apr 21 01:18:16 2004 +0000
@@ -130,7 +130,7 @@
 	int inpa;
 	int id;
 	GaimConnection *gc; /* i hate this. */
-	GaimConversation *cnv; /* bah. */
+	GaimConversation *conv; /* bah. */
 	int maxlen;
 	int maxvis;
 };
@@ -559,24 +559,21 @@
 	if (userinfo != NULL)
 		bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(account, userinfo->sn));
 
-
-
-
-	if (GAIM_BUDDY_IS_ONLINE(b)) {
-		if (isdigit(b->name[0])) {
-			tmp = oscar_icqstatus((b->uc & 0xffff0000) >> 16);
-			oscar_string_append(str, newline, _("Status"), tmp);
-			g_free(tmp);
+	if (b != NULL) {
+		if (GAIM_BUDDY_IS_ONLINE(b)) {
+			if (isdigit(b->name[0])) {
+				tmp = oscar_icqstatus((b->uc & 0xffff0000) >> 16);
+				oscar_string_append(str, newline, _("Status"), tmp);
+				g_free(tmp);
+			}
+		} else {
+			char *tmp = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name);
+			if (aim_ssi_waitingforauth(od->sess->ssi.local, tmp, b->name))
+				oscar_string_append(str, newline, _("Status"), _("Not Authorized"));
+			else
+				oscar_string_append(str, newline, _("Status"), _("Offline"));
 		}
-	} else {
-		char *tmp = aim_ssi_itemlist_findparentname(od->sess->ssi.local, b->name);
-		if (aim_ssi_waitingforauth(od->sess->ssi.local, tmp, b->name))
-			oscar_string_append(str, newline, _("Status"), _("Not Authorized"));
-		else
-			oscar_string_append(str, newline, _("Status"), _("Offline"));
-	}
-
-
+	}
 
 	if ((bi != NULL) && (bi->ipaddr != 0)) {
 		char *tmp =  g_strdup_printf("%hhu.%hhu.%hhu.%hhu",
@@ -689,7 +686,7 @@
 
 	while (g) {
 		c = (struct chat_connection *)g->data;
-		if (c->cnv == conv)
+		if (c->conv == conv)
 			break;
 		g = g->next;
 		c = NULL;
@@ -701,7 +698,7 @@
 static void gaim_odc_disconnect(aim_session_t *sess, aim_conn_t *conn) {
 	GaimConnection *gc = sess->aux_data;
 	OscarData *od = (OscarData *)gc->proto_data;
-	GaimConversation *cnv;
+	GaimConversation *conv;
 	struct direct_im *dim;
 	char *sn;
 	char buf[256];
@@ -720,11 +717,11 @@
 	else 
 		g_snprintf(buf, sizeof buf, _("Direct IM with %s failed"), sn);
 
-	cnv = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc));
-	if (cnv)
-		gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
-
-	gaim_conversation_update_progress(cnv, 0);
+	conv = gaim_find_conversation_with_account(sn, gaim_connection_get_account(gc));
+	if (conv)
+		gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
+
+	gaim_conversation_update_progress(conv, 0);
 
 	g_free(dim); /* I guess? I don't see it anywhere else... -- mid */
 	g_free(sn);
@@ -1667,7 +1664,7 @@
 
 	chatcon = find_oscar_chat_by_conn(gc, fr->conn);
 	chatcon->id = id;
-	chatcon->cnv = serv_got_joined_chat(gc, id++, chatcon->show);
+	chatcon->conv = serv_got_joined_chat(gc, id++, chatcon->show);
 
 	return 1;
 }
@@ -2175,7 +2172,7 @@
 	struct direct_im *dim = data;
 	GaimConnection *gc = dim->gc;
 	OscarData *od = gc->proto_data;
-	GaimConversation *cnv;
+	GaimConversation *conv;
 	char buf[256];
 	struct sockaddr name;
 	socklen_t name_len = 1;
@@ -2192,13 +2189,13 @@
 
 	dim->conn->fd = source;
 	aim_conn_completeconnect(od->sess, dim->conn);
-	cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name);
+	conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, dim->name);
 
 	/* This is the best way to see if we're connected or not */
 	if (getpeername(source, &name, &name_len) == 0) {
 		g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), dim->name);
 		dim->connected = TRUE;
-		gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
+		gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
 	}
 	od->direct_ims = g_slist_append(od->direct_ims, dim);
 	
@@ -3071,6 +3068,9 @@
 }
 
 static int gaim_parse_misses(aim_session_t *sess, aim_frame_t *fr, ...) {
+	GaimConnection *gc = sess->aux_data;
+	GaimAccount *account = gaim_connection_get_account(gc);
+	GaimConversation *conv;
 	char *buf;
 	va_list ap;
 	fu16_t chan, nummissed, reason;
@@ -3139,7 +3139,12 @@
 				   userinfo->sn);
 			break;
 	}
-	gaim_notify_error(sess->aux_data, NULL, buf, NULL);
+
+	conv = gaim_find_conversation_with_account(userinfo->sn, account);
+	if (conv != NULL)
+		gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_ERROR, time(NULL));
+	else
+		gaim_notify_error(sess->aux_data, NULL, buf, NULL);
 	g_free(buf);
 
 	return 1;
@@ -3549,7 +3554,7 @@
 		return 1;
 
 	for (i = 0; i < count; i++)
-		gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL);
+		gaim_conv_chat_add_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL);
 
 	return 1;
 }
@@ -3572,7 +3577,7 @@
 		return 1;
 
 	for (i = 0; i < count; i++)
-		gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->cnv), info[i].sn, NULL);
+		gaim_conv_chat_remove_user(GAIM_CONV_CHAT(c->conv), info[i].sn, NULL);
 
 	return 1;
 }
@@ -5888,7 +5893,7 @@
 static int gaim_odc_initiate(aim_session_t *sess, aim_frame_t *fr, ...) {
 	GaimConnection *gc = sess->aux_data;
 	OscarData *od = (OscarData *)gc->proto_data;
-	GaimConversation *cnv;
+	GaimConversation *conv;
 	struct direct_im *dim;
 	char buf[256];
 	char *sn;
@@ -5909,14 +5914,14 @@
 			   "DirectIM: initiate success to %s\n", sn);
 	dim = find_direct_im(od, sn);
 
-	cnv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, sn);
+	conv = gaim_conversation_new(GAIM_CONV_IM, dim->gc->account, sn);
 	gaim_input_remove(dim->watcher);
 	dim->conn = newconn;
 	dim->watcher = gaim_input_add(dim->conn->fd, GAIM_INPUT_READ, oscar_callback, dim->conn);
 	dim->connected = TRUE;
 	g_snprintf(buf, sizeof buf, _("Direct IM with %s established"), sn);
 	g_free(sn);
-	gaim_conversation_write(cnv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
+	gaim_conversation_write(conv, NULL, buf, GAIM_MESSAGE_SYSTEM, time(NULL));
 
 	aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING, gaim_odc_incoming, 0);
 	aim_conn_addhandler(sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING, gaim_odc_typing, 0);