# HG changeset patch # User Will Thompson # Date 1194049381 0 # Node ID 6f3f3ed7bd7ffac59ffea928056a27def08d9d26 # Parent 2daec6b5bbcacec27173e820b666b8ed3c52a0b5 Save accounts' current errors to accounts.xml, and restore them at startup. diff -r 2daec6b5bbca -r 6f3f3ed7bd7f libpurple/account.c --- a/libpurple/account.c Sat Nov 03 00:20:55 2007 +0000 +++ b/libpurple/account.c Sat Nov 03 00:23:01 2007 +0000 @@ -85,6 +85,9 @@ static GList *handles = NULL; +static void set_current_error(PurpleAccount *account, + PurpleConnectionErrorInfo *new_err); + /********************************************************************* * Writing to disk * *********************************************************************/ @@ -318,8 +321,32 @@ } static xmlnode * +current_error_to_xmlnode(PurpleConnectionErrorInfo *err) +{ + xmlnode *node, *child; + char type_str[3]; + + node = xmlnode_new("current_error"); + + if(err == NULL) + return node; + + child = xmlnode_new_child(node, "type"); + snprintf(type_str, sizeof(type_str), "%u", err->type); + xmlnode_insert_data(child, type_str, -1); + + child = xmlnode_new_child(node, "description"); + if(err->description) + xmlnode_insert_data(child, err->description, -1); + + return node; +} + +static xmlnode * account_to_xmlnode(PurpleAccount *account) { + PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account); + xmlnode *node, *child; const char *tmp; PurplePresence *presence; @@ -376,6 +403,9 @@ xmlnode_insert_child(node, child); } + child = current_error_to_xmlnode(priv->current_error); + xmlnode_insert_child(node, child); + return node; } @@ -680,6 +710,42 @@ purple_account_set_proxy_info(account, proxy_info); } +static void +parse_current_error(xmlnode *node, PurpleAccount *account) +{ + guint type; + char *type_str = NULL, *description = NULL; + xmlnode *child; + PurpleConnectionErrorInfo *current_error = NULL; + + child = xmlnode_get_child(node, "type"); + if (child == NULL || (type_str = xmlnode_get_data(child)) == NULL) + return; + type = atoi(type_str); + g_free(type_str); + + if (type > PURPLE_CONNECTION_ERROR_OTHER_ERROR) + { + purple_debug_error("account", + "Invalid PurpleConnectionError value %d found when " + "loading account information for %s\n", + type, purple_account_get_username(account)); + type = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + } + + child = xmlnode_get_child(node, "description"); + if (child) + description = xmlnode_get_data(child); + if (description == NULL) + description = g_strdup(""); + + current_error = g_new0(PurpleConnectionErrorInfo, 1); + current_error->type = type; + current_error->description = description; + + set_current_error(account, current_error); +} + static PurpleAccount * parse_account(xmlnode *node) { @@ -789,6 +855,13 @@ parse_proxy_info(child, ret); } + /* Read current error */ + child = xmlnode_get_child(node, "current_error"); + if (child != NULL) + { + parse_current_error(child, ret); + } + return ret; } @@ -2253,6 +2326,7 @@ purple_signal_emit(purple_accounts_get_handle(), "account-error-changed", account, old_err, new_err); + schedule_accounts_save(); if(old_err) g_free(old_err->description);