diff src/protocols/gg/gg.c @ 12964:c0f68043854a

[gaim-migrate @ 15317] A GG status fix from Bartosz Oler. This should fix SF Bug #1410147. committer: Tailor Script <tailor@pidgin.im>
author Richard Laager <rlaager@wiktel.com>
date Fri, 20 Jan 2006 01:55:50 +0000
parents 4eae108efdde
children ec9b92104904
line wrap: on
line diff
--- a/src/protocols/gg/gg.c	Fri Jan 20 01:55:15 2006 +0000
+++ b/src/protocols/gg/gg.c	Fri Jan 20 01:55:50 2006 +0000
@@ -850,6 +850,9 @@
 /* ----- INTERNAL CALLBACKS --------------------------------------------- */
 /* ---------------------------------------------------------------------- */
 
+/* just a prototype */
+static void ggp_set_status(GaimAccount *account, GaimStatus *status);
+
 /**
  * Handle change of the status of the buddy.
  *
@@ -1280,15 +1283,27 @@
 			gaim_debug_info("gg", "GG_EVENT_NONE\n");
 			break;
 		case GG_EVENT_CONN_SUCCESS:
-			gaim_debug_info("gg", "GG_EVENT_CONN_SUCCESS\n");
-			gaim_input_remove(gc->inpa);
-			gc->inpa = gaim_input_add(info->session->fd,
-						  GAIM_INPUT_READ,
-						  ggp_callback_recv, gc);
+			{
+				GaimAccount *account;
+				GaimPresence *presence;
+				GaimStatus *status;
+
+				gaim_debug_info("gg", "GG_EVENT_CONN_SUCCESS\n");
+				gaim_input_remove(gc->inpa);
+				gc->inpa = gaim_input_add(info->session->fd,
+							  GAIM_INPUT_READ,
+							  ggp_callback_recv, gc);
 
-			/* gg_change_status(info->session, GG_STATUS_AVAIL); */
-			gaim_connection_set_state(gc, GAIM_CONNECTED);
-			ggp_buddylist_send(gc);
+				/* gg_change_status(info->session, GG_STATUS_AVAIL); */
+
+				account = gaim_connection_get_account(gc);
+				presence = gaim_account_get_presence(account);
+				status = gaim_presence_get_active_status(presence);
+
+				ggp_set_status(account, status);
+				gaim_connection_set_state(gc, GAIM_CONNECTED);
+				ggp_buddylist_send(gc);
+			}
 			break;
 		case GG_EVENT_CONN_FAILED:
 			gaim_input_remove(gc->inpa);
@@ -1426,8 +1441,9 @@
 			NULL);
 	types = g_list_append(types, type);
 
-	/* This status is wrong.  It shouldn't exist.  This prpl must not be
-	 * using the privacy stuff correctly. -- rlaager */
+	/*
+	 * This status is necessary to display guys who are blocking *us*.
+	 */
 	type = gaim_status_type_new_with_attrs(
 			GAIM_STATUS_INVISIBLE, "blocked", _("Blocked"), TRUE, FALSE, FALSE,
 			"message", _("Message"), gaim_value_new(GAIM_TYPE_STRING), NULL);
@@ -1535,10 +1551,14 @@
 	}
 
 	if (gc->proto_data) {
+		GaimAccount *account = gaim_connection_get_account(gc);
+		GaimStatus *status;
 		GGPInfo *info = gc->proto_data;
-		/* XXX: Any way to pass description here? */
+
+		status = gaim_account_get_active_status(account);
+
 		if (info->session != NULL) {
-			gg_change_status(info->session, GG_STATUS_NOT_AVAIL);
+			ggp_set_status(account, status);
 			gg_logoff(info->session);
 			gg_free_session(info->session);
 		}
@@ -1609,14 +1629,11 @@
 /* static void ggp_set_status(GaimAccount *account, GaimStatus *status) {{{ */
 static void ggp_set_status(GaimAccount *account, GaimStatus *status)
 {
-	GaimStatusPrimitive prim;
 	GaimConnection *gc;
 	GGPInfo *info;
 	const char *status_id, *msg;
 	int new_status, new_status_descr;
 
-	prim = gaim_status_type_get_primitive(gaim_status_get_type(status));
-
 	if (!gaim_status_is_active(status))
 		return;
 
@@ -1637,6 +1654,9 @@
 	} else if (strcmp(status_id, "invisible") == 0) {
 		new_status = GG_STATUS_INVISIBLE;
 		new_status_descr = GG_STATUS_INVISIBLE_DESCR;
+	} else if (strcmp(status_id, "offline") == 0) {
+		new_status = GG_STATUS_NOT_AVAIL;
+		new_status_descr = GG_STATUS_NOT_AVAIL_DESCR;
 	} else {
 		new_status = GG_STATUS_AVAIL;
 		new_status_descr = GG_STATUS_AVAIL_DESCR;
@@ -1648,18 +1668,19 @@
 	msg = gaim_status_get_attr_string(status, "message");
 
 	if (msg == NULL) {
-		gaim_debug_info("gg", "ggp_set_status: msg == NULL\n");
 		gg_change_status(info->session, new_status);
 	} else {
-		char *tmp = charset_convert(msg, "UTF-8", "CP1250");
-		gaim_debug_info("gg",
-			"ggp_set_status: msg != NULL. msg = %s\n", tmp);
-		gaim_debug_info("gg",
-			"ggp_set_status: gg_change_status_descr() = %d\n",
-			gg_change_status_descr(info->session, new_status_descr, tmp));
+		gchar *tmp, *new_msg;
+
+		tmp = gaim_markup_strip_html(msg);
+		new_msg = g_markup_escape_text(tmp, -1);
+		g_free(tmp);
+
+		tmp = charset_convert(new_msg, "UTF-8", "CP1250");
+		gg_change_status_descr(info->session, new_status_descr, tmp);
+		g_free(new_msg);
 		g_free(tmp);
 	}
-
 }
 /* }}} */