Mercurial > pidgin
diff libpurple/protocols/jabber/jabber.c @ 21355:fa3c4c5dea66
propagate from branch 'im.pidgin.pidgin.next.minor' (head 4018add8ebbf0e7dfc0fa002ebaeedb7048a26a6)
to branch 'im.pidgin.cpw.resiak.disconnectreason' (head b9fff782d80fd2d1a999b82e31433db57c0c2db3)
author | Will Thompson <will.thompson@collabora.co.uk> |
---|---|
date | Fri, 12 Oct 2007 23:26:11 +0000 |
parents | b1fa7765ca4b bbcc9e206c43 |
children | ba41f2a60253 |
line wrap: on
line diff
--- a/libpurple/protocols/jabber/jabber.c Fri Oct 12 03:53:58 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.c Fri Oct 12 23:26:11 2007 +0000 @@ -89,7 +89,8 @@ if(js->unregistration) jabber_unregister_account_cb(js); } else { - purple_connection_error(js->gc, _("Error initializing session")); + purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, + ("Error initializing session")); } } @@ -120,15 +121,17 @@ JabberBuddy *my_jb = NULL; jabber_id_free(js->user); if(!(js->user = jabber_id_new(full_jid))) { - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, + _("Invalid response from server.")); } if((my_jb = jabber_buddy_find(js, full_jid, TRUE))) my_jb->subscription |= JABBER_SUB_BOTH; g_free(full_jid); } } else { - char *msg = jabber_parse_error(js, packet); - purple_connection_error(js->gc, msg); + PurpleDisconnectReason reason = PURPLE_REASON_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); + purple_connection_error_reason (js->gc, reason, msg); g_free(msg); } @@ -141,8 +144,8 @@ if(jabber_process_starttls(js, packet)) return; } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !js->gsc) { - js->gc->wants_to_die = TRUE; - purple_connection_error(js->gc, _("You require encryption, but it is not available on this server.")); + purple_connection_error_reason (js->gc, PURPLE_REASON_ENCRYPTION_ERROR, + _("You require encryption, but it is not available on this server.")); return; } @@ -173,9 +176,11 @@ static void jabber_stream_handle_error(JabberStream *js, xmlnode *packet) { - char *msg = jabber_parse_error(js, packet); + PurpleDisconnectReason reason = PURPLE_REASON_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); - purple_connection_error(js->gc, msg); + purple_connection_error_reason (js->gc, reason, msg); + g_free(msg); } @@ -256,7 +261,8 @@ if (ret < 0 && errno == EAGAIN) return; else if (ret <= 0) { - purple_connection_error(js->gc, _("Write error")); + purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, + _("Write error")); return; } @@ -309,7 +315,9 @@ } if (ret < 0 && errno != EAGAIN) - purple_connection_error(js->gc, _("Write error")); + purple_connection_error_reason (js->gc, + PURPLE_REASON_NETWORK_ERROR, + _("Write error")); else if (ret < olen) { if (ret < 0) ret = 0; @@ -337,7 +345,9 @@ } if (ret < 0 && errno != EAGAIN) - purple_connection_error(js->gc, _("Write error")); + purple_connection_error_reason (js->gc, + PURPLE_REASON_NETWORK_ERROR, + _("Write error")); else if (ret < len) { if (ret < 0) ret = 0; @@ -405,7 +415,9 @@ if(errno == EAGAIN) return; else - purple_connection_error(gc, _("Read Error")); + purple_connection_error_reason (js->gc, + PURPLE_REASON_NETWORK_ERROR, + _("Read Error")); } static void @@ -442,7 +454,9 @@ } else if(errno == EAGAIN) { return; } else { - purple_connection_error(gc, _("Read Error")); + purple_connection_error_reason (js->gc, + PURPLE_REASON_NETWORK_ERROR, + _("Read Error")); } } @@ -481,7 +495,7 @@ gchar *tmp; tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"), error); - purple_connection_error(gc, tmp); + purple_connection_error_reason (gc, PURPLE_REASON_NETWORK_ERROR, tmp); g_free(tmp); return; } @@ -509,7 +523,7 @@ js = gc->proto_data; js->gsc = NULL; - purple_connection_error(gc, purple_ssl_strerror(error)); + purple_connection_ssl_error (gc, error); } static void tls_init(JabberStream *js) @@ -526,7 +540,8 @@ if (purple_proxy_connect(js->gc, js->gc->account, host, port, jabber_login_callback, js->gc) == NULL) - purple_connection_error(js->gc, _("Unable to create socket")); + purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, + _("Unable to create socket")); } static void srv_resolved_cb(PurpleSrvResponse *resp, int results, gpointer data) @@ -572,12 +587,14 @@ js->old_length = -1; if(!js->user) { - purple_connection_error(gc, _("Invalid XMPP ID")); + purple_connection_error_reason (gc, PURPLE_REASON_INVALID_SETTINGS, + _("Invalid XMPP ID")); return; } if (!js->user->domain || *(js->user->domain) == '\0') { - purple_connection_error(gc, _("Invalid XMPP ID. Domain must be set.")); + purple_connection_error_reason (gc, PURPLE_REASON_INVALID_SETTINGS, + _("Invalid XMPP ID. Domain must be set.")); return; } @@ -607,7 +624,8 @@ purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl, jabber_ssl_connect_failure, js->gc); } else { - purple_connection_error(js->gc, _("SSL support unavailable")); + purple_connection_error_reason (js->gc, PURPLE_REASON_NO_SSL_SUPPORT, + _("SSL support unavailable")); } } @@ -665,7 +683,7 @@ _("Registration Successful"), buf); g_free(buf); } else { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown Error")); @@ -695,7 +713,7 @@ _("Unregistration Successful"), buf); g_free(buf); } else { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown Error")); @@ -1060,7 +1078,8 @@ js->old_length = -1; if(!js->user) { - purple_connection_error(gc, _("Invalid XMPP ID")); + purple_connection_error_reason (gc, PURPLE_REASON_INVALID_SETTINGS, + _("Invalid XMPP ID")); return; } @@ -1092,7 +1111,8 @@ purple_account_get_int(account, "port", 5222), jabber_login_callback_ssl, jabber_ssl_connect_failure, gc); } else { - purple_connection_error(gc, _("SSL support unavailable")); + purple_connection_error_reason (gc, PURPLE_REASON_NO_SSL_SUPPORT, + _("SSL support unavailable")); } } @@ -1115,7 +1135,7 @@ PurpleAccount *account = purple_connection_get_account(js->gc); const char *type = xmlnode_get_attrib(packet,"type"); if(!strcmp(type,"error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error unregistering account"), _("Error unregistering account"), msg); @@ -1641,7 +1661,7 @@ purple_notify_info(js->gc, _("Password Changed"), _("Password Changed"), _("Your password has been changed.")); } else { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error changing password"), _("Error changing password"), msg); @@ -1805,13 +1825,18 @@ } -char *jabber_parse_error(JabberStream *js, xmlnode *packet) +char *jabber_parse_error(JabberStream *js, + xmlnode *packet, + PurpleDisconnectReason *reason) { xmlnode *error; const char *code = NULL, *text = NULL; const char *xmlns = xmlnode_get_namespace(packet); char *cdata = NULL; +#define SET_REASON(x) \ + if(reason != NULL) { *reason = x; } + if((error = xmlnode_get_child(packet, "error"))) { cdata = xmlnode_get_data(error); code = xmlnode_get_attrib(error, "code"); @@ -1863,41 +1888,41 @@ text = _("Unknown Error"); } } else if(xmlns && !strcmp(xmlns, "urn:ietf:params:xml:ns:xmpp-sasl")) { + /* Most common reason can be the default */ + SET_REASON(PURPLE_REASON_AUTHENTICATION_FAILED); if(xmlnode_get_child(packet, "aborted")) { - js->gc->wants_to_die = TRUE; text = _("Authorization Aborted"); } else if(xmlnode_get_child(packet, "incorrect-encoding")) { + SET_REASON(PURPLE_REASON_NETWORK_ERROR); text = _("Incorrect encoding in authorization"); } else if(xmlnode_get_child(packet, "invalid-authzid")) { - js->gc->wants_to_die = TRUE; text = _("Invalid authzid"); } else if(xmlnode_get_child(packet, "invalid-mechanism")) { - js->gc->wants_to_die = TRUE; text = _("Invalid Authorization Mechanism"); } else if(xmlnode_get_child(packet, "mechanism-too-weak")) { - js->gc->wants_to_die = TRUE; text = _("Authorization mechanism too weak"); } else if(xmlnode_get_child(packet, "not-authorized")) { - js->gc->wants_to_die = TRUE; /* Clear the pasword if it isn't being saved */ if (!purple_account_get_remember_password(js->gc->account)) purple_account_set_password(js->gc->account, NULL); text = _("Not Authorized"); } else if(xmlnode_get_child(packet, "temporary-auth-failure")) { + SET_REASON(PURPLE_REASON_NETWORK_ERROR); text = _("Temporary Authentication Failure"); } else { - js->gc->wants_to_die = TRUE; text = _("Authentication Failure"); } } else if(!strcmp(packet->name, "stream:error") || (!strcmp(packet->name, "error") && xmlns && !strcmp(xmlns, "http://etherx.jabber.org/streams"))) { + /* Most common reason as default: */ + SET_REASON(PURPLE_REASON_NETWORK_ERROR); if(xmlnode_get_child(packet, "bad-format")) { text = _("Bad Format"); } else if(xmlnode_get_child(packet, "bad-namespace-prefix")) { text = _("Bad Namespace Prefix"); } else if(xmlnode_get_child(packet, "conflict")) { - js->gc->wants_to_die = TRUE; + SET_REASON(PURPLE_REASON_NAME_IN_USE); text = _("Resource Conflict"); } else if(xmlnode_get_child(packet, "connection-timeout")) { text = _("Connection Timeout"); @@ -1946,6 +1971,8 @@ } } +#undef SET_REASON + if(text || cdata) { char *ret = g_strdup_printf("%s%s%s", code ? code : "", code ? ": " : "", text ? text : cdata);