Mercurial > pidgin
changeset 10427:16d63d8c26d8
[gaim-migrate @ 11679]
Shuffle some stuff around for uniformity, and call the accounts.xml
loading function from gaim_accounts_init()
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 26 Dec 2004 23:37:55 +0000 |
parents | 30d9ec7d001b |
children | 04c663ccbcb1 |
files | src/account.c src/account.h src/blist.c src/savedstatuses.c |
diffstat | 4 files changed, 487 insertions(+), 481 deletions(-) [+] |
line wrap: on
line diff
--- a/src/account.c Sun Dec 26 23:11:14 2004 +0000 +++ b/src/account.c Sun Dec 26 23:37:55 2004 +0000 @@ -59,6 +59,484 @@ static guint accounts_save_timer = 0; static gboolean accounts_loaded = FALSE; + +/************************************************************************** +* Writting to disk +**************************************************************************/ + +static void +setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data) +{ + const char *name; + GaimAccountSetting *setting; + xmlnode *node, *child; + char buf[20]; + + name = (const char *)key; + setting = (GaimAccountSetting *)value; + node = (xmlnode *)user_data; + + child = xmlnode_new_child(node, "setting"); + xmlnode_set_attrib(child, "name", name); + + if (setting->type == GAIM_PREF_INT) { + xmlnode_set_attrib(child, "type", "int"); + snprintf(buf, sizeof(buf), "%d", setting->value.integer); + xmlnode_insert_data(child, buf, -1); + } + else if (setting->type == GAIM_PREF_STRING && setting->value.string != NULL) { + xmlnode_set_attrib(child, "type", "string"); + xmlnode_insert_data(child, setting->value.string, -1); + } + else if (setting->type == GAIM_PREF_BOOLEAN) { + xmlnode_set_attrib(child, "type", "bool"); + snprintf(buf, sizeof(buf), "%d", setting->value.bool); + xmlnode_insert_data(child, buf, -1); + } +} + +static void +ui_setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data) +{ + const char *ui; + GHashTable *table; + xmlnode *node, *child; + + ui = (const char *)key; + table = (GHashTable *)value; + node = (xmlnode *)user_data; + + if (g_hash_table_size(table) > 0) + { + child = xmlnode_new_child(node, "settings"); + xmlnode_set_attrib(child, "ui", ui); + g_hash_table_foreach(table, setting_to_xmlnode, child); + } +} + +static xmlnode * +proxy_settings_to_xmlnode(GaimProxyInfo *proxy_info) +{ + xmlnode *node, *child; + GaimProxyType proxy_type; + const char *value; + int int_value; + char buf[20]; + + proxy_type = gaim_proxy_info_get_type(proxy_info); + + node = xmlnode_new("proxy"); + + child = xmlnode_new_child(node, "type"); + xmlnode_insert_data(child, + (proxy_type == GAIM_PROXY_USE_GLOBAL ? "global" : + proxy_type == GAIM_PROXY_NONE ? "none" : + proxy_type == GAIM_PROXY_HTTP ? "http" : + proxy_type == GAIM_PROXY_SOCKS4 ? "socks4" : + proxy_type == GAIM_PROXY_SOCKS5 ? "socks5" : + proxy_type == GAIM_PROXY_USE_ENVVAR ? "envvar" : "unknown"), -1); + + if (proxy_type != GAIM_PROXY_USE_GLOBAL && + proxy_type != GAIM_PROXY_NONE && + proxy_type != GAIM_PROXY_USE_ENVVAR) + { + if ((value = gaim_proxy_info_get_host(proxy_info)) != NULL) + { + child = xmlnode_new_child(node, "host"); + xmlnode_insert_data(child, value, -1); + } + + if ((int_value = gaim_proxy_info_get_port(proxy_info)) != 0) + { + snprintf(buf, sizeof(buf), "%d", int_value); + child = xmlnode_new_child(node, "port"); + xmlnode_insert_data(child, buf, -1); + } + + if ((value = gaim_proxy_info_get_username(proxy_info)) != NULL) + { + child = xmlnode_new_child(node, "username"); + xmlnode_insert_data(child, value, -1); + } + + if ((value = gaim_proxy_info_get_password(proxy_info)) != NULL) + { + child = xmlnode_new_child(node, "password"); + xmlnode_insert_data(child, value, -1); + } + } + + return node; +} + +static xmlnode * +account_to_xmlnode(GaimAccount *account) +{ + xmlnode *node, *child; + const char *tmp; + GaimProxyInfo *proxy_info; + + node = xmlnode_new("account"); + + child = xmlnode_new_child(node, "protocol"); + xmlnode_insert_data(child, gaim_account_get_protocol_id(account), -1); + + child = xmlnode_new_child(node, "name"); + xmlnode_insert_data(child, gaim_account_get_username(account), -1); + + if (gaim_account_get_remember_password(account) && + ((tmp = gaim_account_get_password(account)) != NULL)) + { + child = xmlnode_new_child(node, "password"); + xmlnode_insert_data(child, tmp, -1); + } + + if ((tmp = gaim_account_get_alias(account)) != NULL) + { + child = xmlnode_new_child(node, "alias"); + xmlnode_insert_data(child, tmp, -1); + } + + if ((tmp = gaim_account_get_user_info(account)) != NULL) + { + /* TODO: Do we need to call gaim_str_strip_cr(tmp) here? */ + child = xmlnode_new_child(node, "userinfo"); + xmlnode_insert_data(child, tmp, -1); + } + + if ((tmp = gaim_account_get_buddy_icon(account)) != NULL) + { + child = xmlnode_new_child(node, "buddyicon"); + xmlnode_insert_data(child, tmp, -1); + } + + if (g_hash_table_size(account->settings) > 0) + { + child = xmlnode_new_child(node, "settings"); + g_hash_table_foreach(account->settings, setting_to_xmlnode, child); + } + + if (g_hash_table_size(account->ui_settings) > 0) + { + g_hash_table_foreach(account->ui_settings, ui_setting_to_xmlnode, node); + } + + if ((proxy_info = gaim_account_get_proxy_info(account)) != NULL) + { + child = proxy_settings_to_xmlnode(proxy_info); + xmlnode_insert_child(node, child); + } + + return node; +} + +static xmlnode * +accounts_to_xmlnode(void) +{ + xmlnode *node, *child; + GList *cur; + + node = xmlnode_new("accounts"); + xmlnode_set_attrib(node, "version", "1.0"); + + for (cur = gaim_accounts_get_all(); cur != NULL; cur = cur->next) + { + child = account_to_xmlnode(cur->data); + xmlnode_insert_child(node, child); + } + + return node; +} + +static void +sync_accounts(void) +{ + xmlnode *node; + char *data; + + if (!accounts_loaded) { + gaim_debug_error("accounts", "Attempted to save accounts before they " + "were read!\n"); + } + + node = accounts_to_xmlnode(); + data = xmlnode_to_formatted_str(node, NULL); + gaim_util_write_data_to_file("accounts.xml", data, -1); + g_free(data); + xmlnode_free(node); +} + +static gboolean +save_cb(gpointer data) +{ + sync_accounts(); + accounts_save_timer = 0; + return FALSE; +} + +static void +schedule_accounts_save() +{ + if (accounts_save_timer == 0) + accounts_save_timer = gaim_timeout_add(5000, save_cb, NULL); +} + + +/************************************************************************** +* Reading from disk +**************************************************************************/ + +static void +parse_settings(xmlnode *node, GaimAccount *account) +{ + const char *ui; + xmlnode *child; + + /* Get the UI string, if these are UI settings */ + ui = xmlnode_get_attrib(node, "ui"); + + /* Read settings, one by one */ + for (child = xmlnode_get_child(node, "setting"); child != NULL; + child = xmlnode_get_next_twin(child)) + { + const char *name, *str_type; + GaimPrefType type; + char *data; + + name = xmlnode_get_attrib(child, "name"); + if (name == NULL) + /* Ignore this setting */ + continue; + + str_type = xmlnode_get_attrib(child, "type"); + if (!strcmp(str_type, "string")) + type = GAIM_PREF_STRING; + else if (!strcmp(str_type, "int")) + type = GAIM_PREF_INT; + else if (!strcmp(str_type, "bool")) + type = GAIM_PREF_BOOLEAN; + else + /* Ignore this setting */ + continue; + + data = xmlnode_get_data(child); + if (data == NULL) + /* Ignore this setting */ + continue; + + if (ui == NULL) + { + if (type == GAIM_PREF_STRING) + gaim_account_set_string(account, name, data); + else if (type == GAIM_PREF_INT) + gaim_account_set_int(account, name, atoi(data)); + else if (type == GAIM_PREF_BOOLEAN) + gaim_account_set_bool(account, name, + (*data == '0' ? FALSE : TRUE)); + } else { + if (type == GAIM_PREF_STRING) + gaim_account_set_ui_string(account, ui, name, data); + else if (type == GAIM_PREF_INT) + gaim_account_set_ui_int(account, ui, name, atoi(data)); + else if (type == GAIM_PREF_BOOLEAN) + gaim_account_set_ui_bool(account, ui, name, + (*data == '0' ? FALSE : TRUE)); + } + + g_free(data); + } +} + +static void +parse_proxy_info(xmlnode *node, GaimAccount *account) +{ + GaimProxyInfo *proxy_info; + xmlnode *child; + char *data; + + proxy_info = gaim_proxy_info_new(); + + /* Use the global proxy settings, by default */ + gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_USE_GLOBAL); + + /* Read proxy type */ + child = xmlnode_get_child(node, "type"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + if (!strcmp(data, "global")) + gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_USE_GLOBAL); + else if (!strcmp(data, "none")) + gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_NONE); + else if (!strcmp(data, "http")) + gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_HTTP); + else if (!strcmp(data, "socks4")) + gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_SOCKS4); + else if (!strcmp(data, "socks5")) + gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_SOCKS5); + else if (!strcmp(data, "envvar")) + gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_USE_ENVVAR); + else + { + gaim_debug_error("account", "Invalid proxy type found when " + "loading account information for %s\n", + gaim_account_get_username(account)); + } + g_free(data); + } + + /* Read proxy host */ + child = xmlnode_get_child(node, "host"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_proxy_info_set_host(proxy_info, data); + g_free(data); + } + + /* Read proxy port */ + child = xmlnode_get_child(node, "port"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_proxy_info_set_port(proxy_info, atoi(data)); + g_free(data); + } + + /* Read proxy username */ + child = xmlnode_get_child(node, "username"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_proxy_info_set_username(proxy_info, data); + g_free(data); + } + + /* Read proxy password */ + child = xmlnode_get_child(node, "password"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_proxy_info_set_password(proxy_info, data); + g_free(data); + } + + /* If there are no values set then proxy_infourn NULL */ + if ((gaim_proxy_info_get_type(proxy_info) == GAIM_PROXY_USE_GLOBAL) && + (gaim_proxy_info_get_host(proxy_info) == NULL) && + (gaim_proxy_info_get_port(proxy_info) == 0) && + (gaim_proxy_info_get_username(proxy_info) == NULL) && + (gaim_proxy_info_get_password(proxy_info) == NULL)) + { + gaim_proxy_info_destroy(proxy_info); + return; + } + + gaim_account_set_proxy_info(account, proxy_info); +} + +static GaimAccount * +parse_account(xmlnode *node) +{ + GaimAccount *ret; + xmlnode *child; + char *protocol_id = NULL; + char *name = NULL; + char *data; + + child = xmlnode_get_child(node, "protocol"); + if (child != NULL) + protocol_id = xmlnode_get_data(child); + + child = xmlnode_get_child(node, "name"); + if (child != NULL) + name = xmlnode_get_data(child); + if (name == NULL) + { + /* Do we really need to do this? */ + child = xmlnode_get_child(node, "username"); + if (child != NULL) + name = xmlnode_get_data(child); + } + + if ((protocol_id == NULL) || (name == NULL)) + { + free(protocol_id); + free(name); + return NULL; + } + + ret = gaim_account_new(name, protocol_id); + free(name); + free(protocol_id); + + /* Read the password */ + child = xmlnode_get_child(node, "password"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_account_set_password(ret, data); + gaim_account_set_remember_password(ret, TRUE); + g_free(data); + } + + /* Read the alias */ + child = xmlnode_get_child(node, "alias"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_account_set_alias(ret, data); + g_free(data); + } + + /* Read the userinfo */ + child = xmlnode_get_child(node, "userinfo"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_account_set_user_info(ret, data); + g_free(data); + } + + /* Read the buddyicon */ + child = xmlnode_get_child(node, "buddyicon"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + gaim_account_set_buddy_icon(ret, data); + g_free(data); + } + + /* Read settings (both core and UI) */ + for (child = xmlnode_get_child(node, "settings"); child != NULL; + child = xmlnode_get_next_twin(child)) + { + parse_settings(child, ret); + } + + /* Read proxy */ + child = xmlnode_get_child(node, "proxy"); + if (child != NULL) + { + parse_proxy_info(child, ret); + } + + return ret; +} + +static void +load_accounts(void) +{ + xmlnode *node, *child; + + accounts_loaded = TRUE; + + node = gaim_util_read_xml_from_file("accounts.xml", _("accounts")); + + if (node == NULL) + return; + + for (child = xmlnode_get_child(node, "account"); child != NULL; + child = xmlnode_get_next_twin(child)) + { + GaimAccount *new; + new = parse_account(child); + gaim_accounts_add(new); + } +} + + static void delete_setting(void *data) { @@ -73,22 +551,6 @@ g_free(setting); } -static gboolean -accounts_save_cb(gpointer unused) -{ - gaim_accounts_sync(); - accounts_save_timer = 0; - - return FALSE; -} - -static void -schedule_accounts_save() -{ - if (accounts_save_timer == 0) - accounts_save_timer = gaim_timeout_add(5000, accounts_save_cb, NULL); -} - GaimAccount * gaim_account_new(const char *username, const char *protocol_id) { @@ -1018,458 +1480,6 @@ } } -static void -parse_settings(xmlnode *node, GaimAccount *account) -{ - const char *ui; - xmlnode *child; - - /* Get the UI string, if these are UI settings */ - ui = xmlnode_get_attrib(node, "ui"); - - /* Read settings, one by one */ - for (child = xmlnode_get_child(node, "setting"); child != NULL; - child = xmlnode_get_next_twin(child)) - { - const char *name, *str_type; - GaimPrefType type; - char *data; - - name = xmlnode_get_attrib(child, "name"); - if (name == NULL) - /* Ignore this setting */ - continue; - - str_type = xmlnode_get_attrib(child, "type"); - if (!strcmp(str_type, "string")) - type = GAIM_PREF_STRING; - else if (!strcmp(str_type, "int")) - type = GAIM_PREF_INT; - else if (!strcmp(str_type, "bool")) - type = GAIM_PREF_BOOLEAN; - else - /* Ignore this setting */ - continue; - - data = xmlnode_get_data(child); - if (data == NULL) - /* Ignore this setting */ - continue; - - if (ui == NULL) - { - if (type == GAIM_PREF_STRING) - gaim_account_set_string(account, name, data); - else if (type == GAIM_PREF_INT) - gaim_account_set_int(account, name, atoi(data)); - else if (type == GAIM_PREF_BOOLEAN) - gaim_account_set_bool(account, name, - (*data == '0' ? FALSE : TRUE)); - } else { - if (type == GAIM_PREF_STRING) - gaim_account_set_ui_string(account, ui, name, data); - else if (type == GAIM_PREF_INT) - gaim_account_set_ui_int(account, ui, name, atoi(data)); - else if (type == GAIM_PREF_BOOLEAN) - gaim_account_set_ui_bool(account, ui, name, - (*data == '0' ? FALSE : TRUE)); - } - - g_free(data); - } -} - -static void -parse_proxy_info(xmlnode *node, GaimAccount *account) -{ - GaimProxyInfo *proxy_info; - xmlnode *child; - char *data; - - proxy_info = gaim_proxy_info_new(); - - /* Use the global proxy settings, by default */ - gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_USE_GLOBAL); - - /* Read proxy type */ - child = xmlnode_get_child(node, "type"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - if (!strcmp(data, "global")) - gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_USE_GLOBAL); - else if (!strcmp(data, "none")) - gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_NONE); - else if (!strcmp(data, "http")) - gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_HTTP); - else if (!strcmp(data, "socks4")) - gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_SOCKS4); - else if (!strcmp(data, "socks5")) - gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_SOCKS5); - else if (!strcmp(data, "envvar")) - gaim_proxy_info_set_type(proxy_info, GAIM_PROXY_USE_ENVVAR); - else - { - gaim_debug_error("account", "Invalid proxy type found when " - "loading account information for %s\n", - gaim_account_get_username(account)); - } - g_free(data); - } - - /* Read proxy host */ - child = xmlnode_get_child(node, "host"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_proxy_info_set_host(proxy_info, data); - g_free(data); - } - - /* Read proxy port */ - child = xmlnode_get_child(node, "port"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_proxy_info_set_port(proxy_info, atoi(data)); - g_free(data); - } - - /* Read proxy username */ - child = xmlnode_get_child(node, "username"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_proxy_info_set_username(proxy_info, data); - g_free(data); - } - - /* Read proxy password */ - child = xmlnode_get_child(node, "password"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_proxy_info_set_password(proxy_info, data); - g_free(data); - } - - /* If there are no values set then proxy_infourn NULL */ - if ((gaim_proxy_info_get_type(proxy_info) == GAIM_PROXY_USE_GLOBAL) && - (gaim_proxy_info_get_host(proxy_info) == NULL) && - (gaim_proxy_info_get_port(proxy_info) == 0) && - (gaim_proxy_info_get_username(proxy_info) == NULL) && - (gaim_proxy_info_get_password(proxy_info) == NULL)) - { - gaim_proxy_info_destroy(proxy_info); - return; - } - - gaim_account_set_proxy_info(account, proxy_info); -} - -static GaimAccount * -parse_account(xmlnode *node) -{ - GaimAccount *ret; - xmlnode *child; - char *protocol_id = NULL; - char *name = NULL; - char *data; - - child = xmlnode_get_child(node, "protocol"); - if (child != NULL) - protocol_id = xmlnode_get_data(child); - - child = xmlnode_get_child(node, "name"); - if (child != NULL) - name = xmlnode_get_data(child); - if (name == NULL) - { - /* Do we really need to do this? */ - child = xmlnode_get_child(node, "username"); - if (child != NULL) - name = xmlnode_get_data(child); - } - - if ((protocol_id == NULL) || (name == NULL)) - { - free(protocol_id); - free(name); - return NULL; - } - - ret = gaim_account_new(name, protocol_id); - free(name); - free(protocol_id); - - /* Read the password */ - child = xmlnode_get_child(node, "password"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_account_set_password(ret, data); - gaim_account_set_remember_password(ret, TRUE); - g_free(data); - } - - /* Read the alias */ - child = xmlnode_get_child(node, "alias"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_account_set_alias(ret, data); - g_free(data); - } - - /* Read the userinfo */ - child = xmlnode_get_child(node, "userinfo"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_account_set_user_info(ret, data); - g_free(data); - } - - /* Read the buddyicon */ - child = xmlnode_get_child(node, "buddyicon"); - if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) - { - gaim_account_set_buddy_icon(ret, data); - g_free(data); - } - - /* Read settings (both core and UI) */ - for (child = xmlnode_get_child(node, "settings"); child != NULL; - child = xmlnode_get_next_twin(child)) - { - parse_settings(child, ret); - } - - /* Read proxy */ - child = xmlnode_get_child(node, "proxy"); - if (child != NULL) - { - parse_proxy_info(child, ret); - } - - return ret; -} - -static void -load_accounts(void) -{ - xmlnode *node, *child; - - accounts_loaded = TRUE; - - node = gaim_util_read_xml_from_file("accounts.xml", _("accounts")); - - if (node == NULL) - return; - - for (child = xmlnode_get_child(node, "account"); child != NULL; - child = xmlnode_get_next_twin(child)) - { - GaimAccount *new; - new = parse_account(child); - gaim_accounts_add(new); - } -} - -static void -setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data) -{ - const char *name; - GaimAccountSetting *setting; - xmlnode *node, *child; - char buf[20]; - - name = (const char *)key; - setting = (GaimAccountSetting *)value; - node = (xmlnode *)user_data; - - child = xmlnode_new_child(node, "setting"); - xmlnode_set_attrib(child, "name", name); - - if (setting->type == GAIM_PREF_INT) { - xmlnode_set_attrib(child, "type", "int"); - snprintf(buf, sizeof(buf), "%d", setting->value.integer); - xmlnode_insert_data(child, buf, -1); - } - else if (setting->type == GAIM_PREF_STRING && setting->value.string != NULL) { - xmlnode_set_attrib(child, "type", "string"); - xmlnode_insert_data(child, setting->value.string, -1); - } - else if (setting->type == GAIM_PREF_BOOLEAN) { - xmlnode_set_attrib(child, "type", "bool"); - snprintf(buf, sizeof(buf), "%d", setting->value.bool); - xmlnode_insert_data(child, buf, -1); - } -} - -static void -ui_setting_to_xmlnode(gpointer key, gpointer value, gpointer user_data) -{ - const char *ui; - GHashTable *table; - xmlnode *node, *child; - - ui = (const char *)key; - table = (GHashTable *)value; - node = (xmlnode *)user_data; - - if (g_hash_table_size(table) > 0) - { - child = xmlnode_new_child(node, "settings"); - xmlnode_set_attrib(child, "ui", ui); - g_hash_table_foreach(table, setting_to_xmlnode, child); - } -} - -static xmlnode * -proxy_settings_to_xmlnode(GaimProxyInfo *proxy_info) -{ - xmlnode *node, *child; - GaimProxyType proxy_type; - const char *value; - int int_value; - char buf[20]; - - proxy_type = gaim_proxy_info_get_type(proxy_info); - - node = xmlnode_new("proxy"); - - child = xmlnode_new_child(node, "type"); - xmlnode_insert_data(child, - (proxy_type == GAIM_PROXY_USE_GLOBAL ? "global" : - proxy_type == GAIM_PROXY_NONE ? "none" : - proxy_type == GAIM_PROXY_HTTP ? "http" : - proxy_type == GAIM_PROXY_SOCKS4 ? "socks4" : - proxy_type == GAIM_PROXY_SOCKS5 ? "socks5" : - proxy_type == GAIM_PROXY_USE_ENVVAR ? "envvar" : "unknown"), -1); - - if (proxy_type != GAIM_PROXY_USE_GLOBAL && - proxy_type != GAIM_PROXY_NONE && - proxy_type != GAIM_PROXY_USE_ENVVAR) - { - if ((value = gaim_proxy_info_get_host(proxy_info)) != NULL) - { - child = xmlnode_new_child(node, "host"); - xmlnode_insert_data(child, value, -1); - } - - if ((int_value = gaim_proxy_info_get_port(proxy_info)) != 0) - { - snprintf(buf, sizeof(buf), "%d", int_value); - child = xmlnode_new_child(node, "port"); - xmlnode_insert_data(child, buf, -1); - } - - if ((value = gaim_proxy_info_get_username(proxy_info)) != NULL) - { - child = xmlnode_new_child(node, "username"); - xmlnode_insert_data(child, value, -1); - } - - if ((value = gaim_proxy_info_get_password(proxy_info)) != NULL) - { - child = xmlnode_new_child(node, "password"); - xmlnode_insert_data(child, value, -1); - } - } - - return node; -} - -static xmlnode * -account_to_xmlnode(GaimAccount *account) -{ - xmlnode *node, *child; - const char *tmp; - GaimProxyInfo *proxy_info; - - node = xmlnode_new("account"); - - child = xmlnode_new_child(node, "protocol"); - xmlnode_insert_data(child, gaim_account_get_protocol_id(account), -1); - - child = xmlnode_new_child(node, "name"); - xmlnode_insert_data(child, gaim_account_get_username(account), -1); - - if (gaim_account_get_remember_password(account) && - ((tmp = gaim_account_get_password(account)) != NULL)) - { - child = xmlnode_new_child(node, "password"); - xmlnode_insert_data(child, tmp, -1); - } - - if ((tmp = gaim_account_get_alias(account)) != NULL) - { - child = xmlnode_new_child(node, "alias"); - xmlnode_insert_data(child, tmp, -1); - } - - if ((tmp = gaim_account_get_user_info(account)) != NULL) - { - /* TODO: Do we need to call gaim_str_strip_cr(tmp) here? */ - child = xmlnode_new_child(node, "userinfo"); - xmlnode_insert_data(child, tmp, -1); - } - - if ((tmp = gaim_account_get_buddy_icon(account)) != NULL) - { - child = xmlnode_new_child(node, "buddyicon"); - xmlnode_insert_data(child, tmp, -1); - } - - if (g_hash_table_size(account->settings) > 0) - { - child = xmlnode_new_child(node, "settings"); - g_hash_table_foreach(account->settings, setting_to_xmlnode, child); - } - - if (g_hash_table_size(account->ui_settings) > 0) - { - g_hash_table_foreach(account->ui_settings, ui_setting_to_xmlnode, node); - } - - if ((proxy_info = gaim_account_get_proxy_info(account)) != NULL) - { - child = proxy_settings_to_xmlnode(proxy_info); - xmlnode_insert_child(node, child); - } - - return node; -} - -static xmlnode * -accounts_to_xmlnode(void) -{ - xmlnode *node, *child; - GList *cur; - - node = xmlnode_new("accounts"); - xmlnode_set_attrib(node, "version", "1.0"); - - for (cur = gaim_accounts_get_all(); cur != NULL; cur = cur->next) - { - child = account_to_xmlnode(cur->data); - xmlnode_insert_child(node, child); - } - - return node; -} - -void -gaim_accounts_sync(void) -{ - xmlnode *node; - char *data; - - if (!accounts_loaded) { - gaim_debug_error("accounts", "Attempted to save accounts before they " - "were read!\n"); - } - - node = accounts_to_xmlnode(); - data = xmlnode_to_formatted_str(node, NULL); - gaim_util_write_data_to_file("accounts.xml", data, -1); - g_free(data); - xmlnode_free(node); -} - void gaim_accounts_add(GaimAccount *account) { @@ -1697,10 +1707,11 @@ void gaim_accounts_uninit(void) { - if (accounts_save_timer != 0) { + if (accounts_save_timer != 0) + { gaim_timeout_remove(accounts_save_timer); accounts_save_timer = 0; - gaim_accounts_sync(); + sync_accounts(); } gaim_signals_unregister_by_instance(gaim_accounts_get_handle());
--- a/src/account.h Sun Dec 26 23:11:14 2004 +0000 +++ b/src/account.h Sun Dec 26 23:37:55 2004 +0000 @@ -644,11 +644,6 @@ gboolean gaim_accounts_load(); /** - * Force an immediate write of accounts. - */ -void gaim_accounts_sync(); - -/** * Adds an account to the list of accounts. * * @param account The account.
--- a/src/blist.c Sun Dec 26 23:11:14 2004 +0000 +++ b/src/blist.c Sun Dec 26 23:37:55 2004 +0000 @@ -130,7 +130,7 @@ else { int cmp; - + cmp = gaim_presence_compare(gaim_buddy_get_presence(new_priority), gaim_buddy_get_presence(buddy)); @@ -2177,7 +2177,7 @@ if (blist_buddy_should_save(exp_acct, (GaimBuddy *) bnode)) return TRUE; } - + return FALSE; } @@ -2186,7 +2186,7 @@ { GaimBlistNode *bnode, *cnode = (GaimBlistNode *) contact; - if (! blist_contact_should_save(exp_acct, contact)) + if (!blist_contact_should_save(exp_acct, contact)) return; fprintf(file, "\t\t\t<contact");
--- a/src/savedstatuses.c Sun Dec 26 23:11:14 2004 +0000 +++ b/src/savedstatuses.c Sun Dec 26 23:37:55 2004 +0000 @@ -68,6 +68,7 @@ static guint statuses_save_timer = 0; static gboolean statuses_loaded = FALSE; + /************************************************************************** * Helper functions **************************************************************************/ @@ -199,9 +200,8 @@ static void schedule_save(void) { - if (statuses_save_timer != 0) - gaim_timeout_remove(statuses_save_timer); - statuses_save_timer = gaim_timeout_add(1000, save_callback, NULL); + if (statuses_save_timer == 0) + statuses_save_timer = gaim_timeout_add(5000, save_callback, NULL); }