changeset 20774:d1e8f4d63f01

merge of '701fb7aea7a77b05725227038ec645441c76668c' and '82ae4511a5006e8f04cd58e034b718deba69321a'
author Carlos Silva <typ0@pidgin.im>
date Thu, 04 Oct 2007 02:42:15 +0000
parents 712020cd7c8e (diff) dcb28d9939ee (current diff)
children d3443cb6a60f 29d8c86c14cd
files libpurple/protocols/msn/contact.c libpurple/protocols/msn/soap.c
diffstat 8 files changed, 104 insertions(+), 81 deletions(-) [+]
line wrap: on
line diff
--- a/libpurple/protocols/msn/command.c	Thu Oct 04 02:34:10 2007 +0000
+++ b/libpurple/protocols/msn/command.c	Thu Oct 04 02:42:15 2007 +0000
@@ -25,9 +25,9 @@
 #include "command.h"
 
 static gboolean
-is_num(char *str)
+is_num(const char *str)
 {
-	char *c;
+	const char *c;
 	for (c = str; *c; c++) {
 		if (!(g_ascii_isdigit(*c)))
 			return FALSE;
@@ -42,9 +42,11 @@
  *  else 		return FALSE
  */
 static gboolean
-msn_check_payload_cmd(char *str)
+msn_check_payload_cmd(const char *str)
 {
-	if( (!strcmp(str,"ADL")) ||
+	g_return_val_if_fail(str != NULL, FALSE);
+
+	if((!strcmp(str,"ADL")) ||
 		(!strcmp(str,"GCF")) ||
 		(!strcmp(str,"SG")) ||
 		(!strcmp(str,"MSG")) ||
@@ -84,16 +86,13 @@
 msn_command_from_string(const char *string)
 {
 	MsnCommand *cmd;
-	char *tmp;
 	char *param_start;
 
 	g_return_val_if_fail(string != NULL, NULL);
 
-	tmp = g_strdup(string);
-	param_start = strchr(tmp, ' ');
-
 	cmd = g_new0(MsnCommand, 1);
-	cmd->command = tmp;
+	cmd->command = g_strdup(string);
+	param_start = strchr(cmd->command, ' ');
 
 	if (param_start)
 	{
--- a/libpurple/protocols/msn/contact.c	Thu Oct 04 02:34:10 2007 +0000
+++ b/libpurple/protocols/msn/contact.c	Thu Oct 04 02:42:15 2007 +0000
@@ -1894,7 +1894,7 @@
 void
 msn_contact_connect_init(MsnSoapConn *soapconn)
 {
-	msn_soap_init(soapconn, MSN_CONTACT_SERVER, 1,
+	msn_soap_init(soapconn, MSN_CONTACT_SERVER, TRUE,
 		      msn_contact_login_connect_cb,
 		      msn_contact_login_error_cb);
 }
--- a/libpurple/protocols/msn/nexus.c	Thu Oct 04 02:34:10 2007 +0000
+++ b/libpurple/protocols/msn/nexus.c	Thu Oct 04 02:42:15 2007 +0000
@@ -463,6 +463,6 @@
 msn_nexus_connect(MsnNexus *nexus)
 {
 	/*  Authenticate via Windows Live ID. */
-	msn_soap_init(nexus->soapconn, MSN_TWN_SERVER, 1, nexus_login_connect_cb, nexus_login_error_cb);
+	msn_soap_init(nexus->soapconn, MSN_TWN_SERVER, TRUE, nexus_login_connect_cb, nexus_login_error_cb);
 	msn_soap_connect(nexus->soapconn);
 }
--- a/libpurple/protocols/msn/oim.c	Thu Oct 04 02:34:10 2007 +0000
+++ b/libpurple/protocols/msn/oim.c	Thu Oct 04 02:42:15 2007 +0000
@@ -51,10 +51,10 @@
 
 	oim = g_new0(MsnOim, 1);
 	oim->session = session;
-	oim->retrieveconn = msn_soap_new(session,oim,1);
+	oim->retrieveconn = msn_soap_new(session, oim, TRUE);
 	
-	oim->oim_list	= NULL;
-	oim->sendconn = msn_soap_new(session,oim,1);
+	oim->oim_list = NULL;
+	oim->sendconn = msn_soap_new(session, oim, TRUE);
 	oim->run_id = rand_guid();
 	oim->challenge = NULL;
 	oim->send_queue = g_queue_new();
@@ -165,70 +165,73 @@
 msn_oim_send_process(MsnOim *oim, const char *body, int len)
 {
 	xmlnode *responseNode, *bodyNode;
-	xmlnode	*faultNode, *faultCodeNode, *faultstringNode;
+	xmlnode *faultNode = NULL, *faultCodeNode, *faultstringNode;
 	xmlnode *detailNode, *challengeNode;
-	char *faultCodeStr = NULL, *faultstring = NULL;
+	char *fault_code, *fault_text;
 
 	responseNode = xmlnode_from_str(body,len);
+
 	g_return_if_fail(responseNode != NULL);
-	bodyNode = xmlnode_get_child(responseNode,"Body");
-	faultNode = xmlnode_get_child(bodyNode,"Fault");
-	if(faultNode == NULL){
+
+	if ((bodyNode = xmlnode_get_child(responseNode, "Body")))
+		faultNode = xmlnode_get_child(bodyNode, "Fault");
+
+	if (faultNode == NULL) {
 		/*Send OK! return*/
 		MsnOimSendReq *request;
-		
-		purple_debug_info("MSN OIM","send OIM OK!");
+
 		xmlnode_free(responseNode);
 		request = g_queue_pop_head(oim->send_queue);
 		msn_oim_free_send_req(request);
 		/*send next buffered Offline Message*/
 		msn_soap_post(oim->sendconn, NULL);
+
 		return;
 	}
+
 	/*get the challenge,and repost it*/
-	faultCodeNode = xmlnode_get_child(faultNode,"faultcode");
+	if (faultNode)
+		faultCodeNode = xmlnode_get_child(faultNode, "faultcode");
+
 	if(faultCodeNode == NULL){
-		purple_debug_info("MSN OIM","faultcode Node is NULL\n");
-		goto oim_send_process_fail;
+		purple_debug_info("MSN OIM", "No faultcode for failed Offline Message.\n");
+		xmlnode_free(responseNode);
+		return;
 	}
-	faultCodeStr = xmlnode_get_data(faultCodeNode);
-	purple_debug_info("MSN OIM","fault code:{%s}\n",faultCodeStr);
+
+	fault_code = xmlnode_get_data(faultCodeNode);
 #if 0
-	if(!strcmp(faultCodeStr,"q0:AuthenticationFailed")){
+	if(!strcmp(fault_code,"q0:AuthenticationFailed")){
 		/*other Fault Reason?*/
 		goto oim_send_process_fail;
 	}
 #endif
 
-	faultstringNode = xmlnode_get_child(faultNode,"faultstring");
-	faultstring = xmlnode_get_data(faultstringNode);
-	purple_debug_info("MSN OIM","fault string :{%s}\n",faultstring);
+	faultstringNode = xmlnode_get_child(faultNode, "faultstring");
+	fault_text = xmlnode_get_data(faultstringNode);
+	purple_debug_info("MSN OIM", "Error sending Offline Message: %s (%s)\n",
+		fault_text ? fault_text : "(null)", fault_code ? fault_code : "(null)");
 
 	/* lock key fault reason,
 	 * compute the challenge and resend it
 	 */
-	detailNode = xmlnode_get_child(faultNode, "detail");
-	if(detailNode == NULL){
-		goto oim_send_process_fail;
-	}
-	challengeNode = xmlnode_get_child(detailNode,"LockKeyChallenge");
-	if (challengeNode == NULL) {
-		goto oim_send_process_fail;
+	if ((detailNode = xmlnode_get_child(faultNode, "detail"))
+			&& (challengeNode = xmlnode_get_child(detailNode, "LockKeyChallenge"))) {
+		g_free(oim->challenge);
+		oim->challenge = xmlnode_get_data(challengeNode);
+
+		purple_debug_info("MSN OIM", "Retrying Offline IM with lockkey:{%s}\n",
+			oim->challenge ? oim->challenge : "(null)");
+
+		/*repost the send*/
+		msn_oim_send_msg(oim);
+
+		/* XXX: This needs to give up eventually (1 retry, maybe?) */
 	}
 
-	g_free(oim->challenge);
-	oim->challenge = xmlnode_get_data(challengeNode);
-	purple_debug_info("MSN OIM","lockkey:{%s}\n",oim->challenge);
-
-	/*repost the send*/
-	purple_debug_info("MSN OIM","prepare to repost the send...\n");
-	msn_oim_send_msg(oim);
-
-oim_send_process_fail:
-	g_free(faultstring);
-	g_free(faultCodeStr);
+	g_free(fault_text);
+	g_free(fault_code);
 	xmlnode_free(responseNode);
-	return ;
 }
 
 static gboolean
@@ -300,7 +303,7 @@
 		purple_debug_info("MSN OIM","no lock key challenge,wait for SOAP Fault and Resend\n");
 		buf[0]='\0';
 	}
-	purple_debug_info("MSN OIM","get the lock key challenge {%s}\n",buf);	
+	purple_debug_info("MSN OIM","get the lock key challenge {%s}\n",buf);
 
 	msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg);
 	soap_body = g_strdup_printf(MSN_OIM_SEND_TEMPLATE,
@@ -311,8 +314,8 @@
 					MSNP13_WLM_PRODUCT_ID,
 					buf,
 					oim_request->send_seq,
-					msg_body
-					);
+					msg_body);
+
 	soap_request = msn_soap_request_new(MSN_OIM_SEND_HOST,
 					MSN_OIM_SEND_URL,
 					MSN_OIM_SEND_SOAP_ACTION,
@@ -644,10 +647,8 @@
 		nickname = xmlnode_get_data(nNode);
 		/*receive time*/
 		rtNode = xmlnode_get_child(mNode,"RT");
-		if(rtNode != NULL) {
+		if(rtNode != NULL)
 			rTime = xmlnode_get_data(rtNode);
-			rtNode = NULL;
-		}
 /*		purple_debug_info("MSN OIM","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */
 
 		oim->oim_list = g_list_append(oim->oim_list,strdup(msgid));
@@ -694,7 +695,7 @@
 msn_oim_retrieve_connect_init(MsnSoapConn *soapconn)
 {
 	purple_debug_info("MSN OIM","Initializing OIM retrieve connection\n");
-	msn_soap_init(soapconn, MSN_OIM_RETRIEVE_HOST, 1,
+	msn_soap_init(soapconn, MSN_OIM_RETRIEVE_HOST, TRUE,
 		      msn_oim_get_connect_cb,
 		      msn_oim_get_error_cb);
 }
@@ -704,7 +705,7 @@
 msn_oim_send_connect_init(MsnSoapConn *sendconn)
 {
 	purple_debug_info("MSN OIM","Initializing OIM send connection\n");
-	msn_soap_init(sendconn, MSN_OIM_SEND_HOST, 1,
+	msn_soap_init(sendconn, MSN_OIM_SEND_HOST, TRUE,
 		      msn_oim_send_connect_cb,
 		      msn_oim_send_error_cb);
 }
--- a/libpurple/protocols/msn/session.c	Thu Oct 04 02:34:10 2007 +0000
+++ b/libpurple/protocols/msn/session.c	Thu Oct 04 02:42:15 2007 +0000
@@ -130,7 +130,9 @@
 msn_session_disconnect(MsnSession *session)
 {
 	g_return_if_fail(session != NULL);
-	g_return_if_fail(session->connected);
+
+	if (!session->connected)
+		return;
 
 	session->connected = FALSE;
 
--- a/libpurple/protocols/msn/soap.c	Thu Oct 04 02:34:10 2007 +0000
+++ b/libpurple/protocols/msn/soap.c	Thu Oct 04 02:42:15 2007 +0000
@@ -49,17 +49,16 @@
 	soapconn->step = step;
 }
 
-//msn_soap_new(MsnSession *session,gpointer data,int sslconn)
 /*new a soap connection*/
 MsnSoapConn *
-msn_soap_new(MsnSession *session,gpointer data,int sslconn)
+msn_soap_new(MsnSession *session,gpointer data, gboolean ssl)
 {
 	MsnSoapConn *soapconn;
 
 	soapconn = g_new0(MsnSoapConn, 1);
 	soapconn->session = session;
 	soapconn->parent = data;
-	soapconn->ssl_conn = sslconn;
+	soapconn->ssl_conn = ssl;
 
 	soapconn->gsc = NULL;
 	soapconn->input_handler = 0;
@@ -127,7 +126,7 @@
 
 /*init the soap connection*/
 void
-msn_soap_init(MsnSoapConn *soapconn,char * host,int ssl,
+msn_soap_init(MsnSoapConn *soapconn,char * host, gboolean ssl,
 				MsnSoapSslConnectCbFunction connect_cb,
 				MsnSoapSslErrorCbFunction error_cb)
 {
--- a/libpurple/protocols/msn/soap.h	Thu Oct 04 02:34:10 2007 +0000
+++ b/libpurple/protocols/msn/soap.h	Thu Oct 04 02:42:15 2007 +0000
@@ -83,9 +83,9 @@
 
 	MsnSoapStep step;
 	/*ssl connection?*/
-	guint	ssl_conn;
+	gboolean ssl_conn;
 	/*normal connection*/
-	guint	fd;
+	guint fd;
 	/*SSL connection*/
 	PurpleSslConnection *gsc;
 	/*ssl connection callback*/
@@ -135,13 +135,13 @@
 void msn_soap_post_head_request(MsnSoapConn *soapconn);
 
 /*new a soap conneciton */
-MsnSoapConn *msn_soap_new(MsnSession *session,gpointer data,int sslconn);
+MsnSoapConn *msn_soap_new(MsnSession *session, gpointer data, gboolean ssl);
 
 /*destroy */
 void msn_soap_destroy(MsnSoapConn *soapconn);
 
 /*init a soap conneciton */
-void msn_soap_init(MsnSoapConn *soapconn, char * host, int ssl,
+void msn_soap_init(MsnSoapConn *soapconn, char * host, gboolean ssl,
 		   MsnSoapSslConnectCbFunction connect_cb,
 		   MsnSoapSslErrorCbFunction error_cb);
 void msn_soap_connect(MsnSoapConn *soapconn);
--- a/pidgin/plugins/win32/winprefs/gtkappbar.c	Thu Oct 04 02:34:10 2007 +0000
+++ b/pidgin/plugins/win32/winprefs/gtkappbar.c	Thu Oct 04 02:42:15 2007 +0000
@@ -352,17 +352,37 @@
 	}
 	return GDK_FILTER_CONTINUE;
 }
+
+static void show_hide(GtkAppBar *ab, gboolean hide) {
+	purple_debug_info("gtkappbar", "show_hide(%d)\n", hide);
+
+	if (hide) {
+		purple_debug_info("gtkappbar", "hidden\n");
+		gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window));
+		ab->docked = TRUE;
+		ab->iconized = TRUE;
+	} else {
+		ab->iconized = FALSE;
+		purple_debug_info("gtkappbar", "shown\n");
+		ab->docked = FALSE;
+		gtk_appbar_do_dock(ab, ab->side);
+	}
+
+}
+
 /** Notify the system that the appbar's position has changed */
 static GdkFilterReturn wnd_poschanged(GtkAppBar *ab, GdkXEvent *xevent) {
 	if (ab->registered) {
 		APPBARDATA abd;
 		MSG *msg = (MSG*)xevent;
+
 		purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_poschanged\n");
 
 		abd.hWnd = msg->hwnd;
 		abd.cbSize = sizeof(APPBARDATA);
 
 		SHAppBarMessage(ABM_WINDOWPOSCHANGED, &abd);
+
 	}
 	return GDK_FILTER_CONTINUE;
 }
@@ -382,6 +402,14 @@
                         set_toolbar(msg->hwnd, FALSE);
                 /*return GDK_FILTER_REMOVE;*/
         }
+
+	if (ab->docked) {
+		if (ab->iconized && wpos->flags & SWP_SHOWWINDOW)
+			show_hide(ab, FALSE);
+		else if (!ab->iconized && wpos->flags & SWP_HIDEWINDOW)
+			show_hide(ab, TRUE);
+	}
+
         return GDK_FILTER_CONTINUE;
 }
 
@@ -409,23 +437,17 @@
 }
 
 static GdkFilterReturn wnd_showwindow(GtkAppBar *ab, GdkXEvent *xevent) {
-        MSG *msg = (MSG*)xevent;
+	MSG *msg = (MSG*)xevent;
 
-        purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_showwindow\n");
-        if(msg->wParam && ab->docked) {
-		ab->iconized = FALSE;
-                purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "shown\n");
-                ab->docked = FALSE;
-                gtk_appbar_do_dock(ab, ab->side);
-        }
-        else if(!msg->wParam && ab->docked) {
-                purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "hidden\n");
-                gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window));
-                ab->docked = TRUE;
-		ab->iconized = TRUE;
-        }
-        return GDK_FILTER_CONTINUE;
+	purple_debug_info("gtkappbar", "wnd_showwindow\n");
+	if(msg->wParam && ab->docked) {
+		show_hide(ab, FALSE);
+	} else if(!msg->wParam && ab->docked) {
+		show_hide(ab, TRUE);
+	}
+	return GDK_FILTER_CONTINUE;
 }
+
 /** The window's size has changed */
 static GdkFilterReturn wnd_size(GtkAppBar *ab, GdkXEvent *xevent) {
         MSG *msg = (MSG*)xevent;