# HG changeset patch # User Will Thompson # Date 1191936778 0 # Node ID bde477ec6a711f1f6f0f09eef977a50067aa9255 # Parent 66e7b104b4eac4fba2a42fca27f79ebf2eef9698 Stop jabber setting wants_to_die itself. This involved plumbing disconnection reasons into jabber_parse_error in a slightly dubious fashion. I'd appreciate someone sanity-checking this rev. diff -r 66e7b104b4ea -r bde477ec6a71 libpurple/protocols/jabber/adhoccommands.c --- a/libpurple/protocols/jabber/adhoccommands.c Tue Oct 09 13:25:47 2007 +0000 +++ b/libpurple/protocols/jabber/adhoccommands.c Tue Oct 09 13:32:58 2007 +0000 @@ -132,7 +132,7 @@ const char *type = xmlnode_get_attrib(packet,"type"); if(type && !strcmp(type,"error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown Error")); diff -r 66e7b104b4ea -r bde477ec6a71 libpurple/protocols/jabber/auth.c --- a/libpurple/protocols/jabber/auth.c Tue Oct 09 13:25:47 2007 +0000 +++ b/libpurple/protocols/jabber/auth.c Tue Oct 09 13:32:58 2007 +0000 @@ -541,15 +541,15 @@ if(type && !strcmp(type, "result")) { jabber_stream_set_state(js, JABBER_STREAM_CONNECTED); } else { - char *msg = jabber_parse_error(js, packet); + PurpleDisconnectReason reason = PURPLE_REASON_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); xmlnode *error; const char *err_code; - PurpleDisconnectReason reason = PURPLE_REASON_NETWORK_ERROR; + /* FIXME: Why is this not in jabber_parse_error? */ if((error = xmlnode_get_child(packet, "error")) && (err_code = xmlnode_get_attrib(error, "code")) && !strcmp(err_code, "401")) { - js->gc->wants_to_die = TRUE; reason = PURPLE_REASON_AUTHENTICATION_FAILED; /* Clear the pasword if it isn't being saved */ if (!purple_account_get_remember_password(js->gc->account)) @@ -573,9 +573,9 @@ _("Invalid response from server.")); return; } else if(!strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); - purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, - 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); } else if(!strcmp(type, "result")) { query = xmlnode_get_child(packet, "query"); @@ -975,14 +975,14 @@ void jabber_auth_handle_failure(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); if(!msg) { purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, _("Invalid response from server.")); } else { - purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, - msg); + purple_connection_error_reason (js->gc, reason, msg); g_free(msg); } } diff -r 66e7b104b4ea -r bde477ec6a71 libpurple/protocols/jabber/buddy.c --- a/libpurple/protocols/jabber/buddy.c Tue Oct 09 13:25:47 2007 +0000 +++ b/libpurple/protocols/jabber/buddy.c Tue Oct 09 13:32:58 2007 +0000 @@ -2334,7 +2334,7 @@ return; if(!(type = xmlnode_get_attrib(packet, "type")) || !strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown error")); diff -r 66e7b104b4ea -r bde477ec6a71 libpurple/protocols/jabber/chat.c --- a/libpurple/protocols/jabber/chat.c Tue Oct 09 13:25:47 2007 +0000 +++ b/libpurple/protocols/jabber/chat.c Tue Oct 09 13:32:58 2007 +0000 @@ -391,7 +391,7 @@ } } } else if(!strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Configuration error"), _("Configuration error"), msg); @@ -465,7 +465,7 @@ const char *type = xmlnode_get_attrib(packet, "type"); if(type && !strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg); @@ -534,7 +534,7 @@ } } } else if(!strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg); @@ -673,7 +673,7 @@ return; if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result")) { - char *err = jabber_parse_error(js,packet); + char *err = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); purple_roomlist_set_in_progress(js->roomlist, FALSE); @@ -684,7 +684,7 @@ } if(!(query = xmlnode_get_child(packet, "query"))) { - char *err = jabber_parse_error(js, packet); + char *err = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); purple_roomlist_set_in_progress(js->roomlist, FALSE); diff -r 66e7b104b4ea -r bde477ec6a71 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Tue Oct 09 13:25:47 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.c Tue Oct 09 13:32:58 2007 +0000 @@ -129,8 +129,9 @@ g_free(full_jid); } } else { - char *msg = jabber_parse_error(js, packet); - purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, 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); } @@ -176,12 +177,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); - if (js->gc->wants_to_die) - purple_connection_error_reason (js->gc, PURPLE_REASON_OTHER_ERROR, msg); - else - purple_connection_error_reason (js->gc, PURPLE_REASON_NETWORK_ERROR, msg); + purple_connection_error_reason (js->gc, reason, msg); + g_free(msg); } @@ -687,7 +687,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")); @@ -717,7 +717,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")); @@ -1141,7 +1141,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); @@ -1691,7 +1691,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); @@ -1855,13 +1855,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"); @@ -1913,41 +1918,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") && !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"); @@ -1996,6 +2001,8 @@ } } +#undef SET_REASON + if(text || cdata) { char *ret = g_strdup_printf("%s%s%s", code ? code : "", code ? ": " : "", text ? text : cdata); diff -r 66e7b104b4ea -r bde477ec6a71 libpurple/protocols/jabber/jabber.h --- a/libpurple/protocols/jabber/jabber.h Tue Oct 09 13:25:47 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.h Tue Oct 09 13:32:58 2007 +0000 @@ -216,7 +216,14 @@ char *jabber_get_next_id(JabberStream *js); -char *jabber_parse_error(JabberStream *js, xmlnode *packet); +/** Parse an error into a human-readable string and optionally a disconnect + * reason. + * @param js the stream on which the error occurred. + * @param packet the error packet + * @param reason where to store the disconnection reason, or @c NULL if you + * don't care or you don't intend to close the connection. + */ +char *jabber_parse_error(JabberStream *js, xmlnode *packet, PurpleDisconnectReason *reason); void jabber_add_feature(const gchar *shortname, const gchar *namespace, JabberFeatureEnabled cb); /* cb may be NULL */ void jabber_remove_feature(const gchar *shortname); diff -r 66e7b104b4ea -r bde477ec6a71 libpurple/protocols/jabber/presence.c --- a/libpurple/protocols/jabber/presence.c Tue Oct 09 13:25:47 2007 +0000 +++ b/libpurple/protocols/jabber/presence.c Tue Oct 09 13:32:58 2007 +0000 @@ -417,7 +417,7 @@ } if(type && !strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); state = JABBER_BUDDY_STATE_ERROR; jb->error_msg = msg ? msg : g_strdup(_("Unknown Error in presence")); @@ -549,7 +549,7 @@ char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain); if(state == JABBER_BUDDY_STATE_ERROR) { - char *title, *msg = jabber_parse_error(js, packet); + char *title, *msg = jabber_parse_error(js, packet, NULL); if(chat->conv) { title = g_strdup_printf(_("Error in chat %s"), from);