Mercurial > pidgin
diff libpurple/protocols/msn/soap2.c @ 23475:f85450504940
propagate from branch 'im.pidgin.pidgin' (head 5387bc28fa09b238593c3dc292863ec3ce5f3c4e)
to branch 'im.pidgin.cpw.qulogic.msn' (head f2d5cd45d05d5b074677524bb08f2069d0683b09)
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Sat, 14 Jun 2008 07:47:38 +0000 |
parents | f06adc198c1d 06b491a23d19 |
children | 314fcd0879ec |
line wrap: on
line diff
--- a/libpurple/protocols/msn/soap2.c Sat Jun 14 04:50:35 2008 +0000 +++ b/libpurple/protocols/msn/soap2.c Sat Jun 14 07:47:38 2008 +0000 @@ -82,6 +82,7 @@ static void msn_soap_request_destroy(MsnSoapRequest *req); static void msn_soap_connection_sanitize(MsnSoapConnection *conn, gboolean disconnect); +static gboolean msn_soap_write_cb_internal(gpointer data, gint fd, PurpleInputCondition cond, gboolean initial); static void msn_soap_process(MsnSoapConnection *conn); static gboolean @@ -232,6 +233,7 @@ } g_free(faultdata); + msn_soap_message_destroy(response); return TRUE; } else if (g_str_equal(faultdata, "wsse:FailedAuthentication")) { xmlnode *reason = xmlnode_get_child(body, "faultstring"); @@ -243,6 +245,7 @@ g_free(reasondata); g_free(faultdata); + msn_soap_message_destroy(response); return FALSE; } @@ -255,6 +258,7 @@ conn->current_request = NULL; request->cb(request->message, response, request->cb_data); + msn_soap_message_destroy(response); msn_soap_request_destroy(request); } @@ -406,10 +410,8 @@ message->xml = node; if (!msn_soap_handle_body(conn, message)) { - msn_soap_message_destroy(message); return; } - msn_soap_message_destroy(message); } msn_soap_connection_handle_next(conn); @@ -426,27 +428,34 @@ static void msn_soap_write_cb(gpointer data, gint fd, PurpleInputCondition cond) { + msn_soap_write_cb_internal(data, fd, cond, FALSE); +} + +static gboolean +msn_soap_write_cb_internal(gpointer data, gint fd, PurpleInputCondition cond, + gboolean initial) +{ MsnSoapConnection *conn = data; int written; - g_return_if_fail(cond == PURPLE_INPUT_WRITE); + if (cond != PURPLE_INPUT_WRITE) return TRUE; written = purple_ssl_write(conn->ssl, conn->buf->str + conn->handled_len, conn->buf->len - conn->handled_len); if (written < 0 && errno == EAGAIN) - return; + return TRUE; else if (written <= 0) { purple_ssl_close(conn->ssl); conn->ssl = NULL; - msn_soap_connection_handle_next(conn); - return; + if (!initial) msn_soap_connection_handle_next(conn); + return FALSE; } conn->handled_len += written; if (conn->handled_len < conn->buf->len) - return; + return TRUE; /* we are done! */ g_string_free(conn->buf, TRUE); @@ -460,6 +469,7 @@ purple_input_remove(conn->event_handle); conn->event_handle = purple_input_add(conn->ssl->fd, PURPLE_INPUT_READ, msn_soap_read_cb, conn); + return TRUE; } static gboolean @@ -478,22 +488,15 @@ int len = -1; char *body = xmlnode_to_str(req->message->xml, &len); GSList *iter; - char *authstr = NULL; g_queue_pop_head(conn->queue); conn->buf = g_string_new(""); - if (conn->session->passport_info.mspauth) - authstr = g_strdup_printf("Cookie: MSPAuth=%s\r\n", - conn->session->passport_info.mspauth); - - g_string_append_printf(conn->buf, "POST %s HTTP/1.1\r\n" "SOAPAction: %s\r\n" "Content-Type:text/xml; charset=utf-8\r\n" - "%s" "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n" "Accept: */*\r\n" "Host: %s\r\n" @@ -501,7 +504,7 @@ "Connection: Keep-Alive\r\n" "Cache-Control: no-cache\r\n", req->path, req->message->action ? req->message->action : "", - authstr ? authstr : "", conn->host, len); + conn->host, len); for (iter = req->message->headers; iter; iter = iter->next) { g_string_append(conn->buf, (char *)iter->data); @@ -518,9 +521,18 @@ conn->event_handle = purple_input_add(conn->ssl->fd, PURPLE_INPUT_WRITE, msn_soap_write_cb, conn); - msn_soap_write_cb(conn, conn->ssl->fd, PURPLE_INPUT_WRITE); + if (!msn_soap_write_cb_internal(conn, conn->ssl->fd, PURPLE_INPUT_WRITE, TRUE)) { + /* Not connected => reconnect and retry */ + purple_debug_info("soap", "not connected, reconnecting"); + + conn->connected = FALSE; + conn->current_request = NULL; + msn_soap_connection_sanitize(conn, FALSE); + + g_queue_push_head(conn->queue, req); + conn->event_handle = purple_timeout_add(0, msn_soap_connection_run, conn); + } - g_free(authstr); g_free(body); } } @@ -673,21 +685,3 @@ g_free(req); } -xmlnode * -msn_soap_xml_get(xmlnode *parent, const char *node) -{ - xmlnode *ret = NULL; - char **tokens = g_strsplit(node, "/", -1); - int i; - - for (i = 0; tokens[i]; i++) { - if ((ret = xmlnode_get_child(parent, tokens[i])) != NULL) - parent = ret; - else - break; - } - - g_strfreev(tokens); - return ret; -} -