--- a/src/account.c Sat Mar 26 19:19:33 2005 +0000 +++ b/src/account.c Sat Mar 26 20:08:43 2005 +0000 @@ -116,6 +116,40 @@ } static xmlnode * +status_to_xmlnode(const GaimStatus *status) +{ + xmlnode *node; + + node = xmlnode_new("status"); + xmlnode_set_attrib(node, "type", gaim_status_get_id(status)); + if (gaim_status_get_name(status) != NULL) + xmlnode_set_attrib(node, "name", gaim_status_get_name(status)); + xmlnode_set_attrib(node, "active", gaim_status_is_active(status) ? "true" : "false"); + + /* QQQ: Need to save status->attr_values */ + + return node; +} + +static xmlnode * +statuses_to_xmlnode(const GaimPresence *presence) +{ + xmlnode *node, *child; + const GList *statuses, *status; + + node = xmlnode_new("statuses"); + + statuses = gaim_presence_get_statuses(presence); + for (status = statuses; status != NULL; status = status->next) + { + child = status_to_xmlnode((GaimStatus *)status->data); + xmlnode_insert_child(node, child); + } + + return node; +} + +static xmlnode * proxy_settings_to_xmlnode(GaimProxyInfo *proxy_info) { xmlnode *node, *child; @@ -175,6 +209,7 @@ { xmlnode *node, *child; const char *tmp; + GaimPresence *presence; GaimProxyInfo *proxy_info; node = xmlnode_new("account"); @@ -198,6 +233,12 @@ xmlnode_insert_data(child, tmp, -1); } + if ((presence = gaim_account_get_presence(account)) != NULL) + { + child = statuses_to_xmlnode(presence); + xmlnode_insert_child(node, child); + } + if ((tmp = gaim_account_get_user_info(account)) != NULL) { /* TODO: Do we need to call gaim_str_strip_cr(tmp) here? */ @@ -355,6 +396,56 @@ } static void +parse_status(xmlnode *node, GaimAccount *account) +{ + gboolean active = FALSE; + const char *data; + const char *type; + xmlnode *child; + + /* Get the active/inactive state */ + child = xmlnode_get_child(node, "active"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + if (strcasecmp(data, "true") == 0) + active = TRUE; + else if (strcasecmp(data, "false") == 0) + active = FALSE; + else + return; + } + else + return; + + /* Get the type of the status */ + child = xmlnode_get_child(node, "type"); + if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) + { + type = data; + } + else + return; + + /* QQQ: Need to read attributes into a vargs */ + + /* QQQ: This needs to do a better job of adding attributes and stuff */ + /* Use gaim_account_set_status_vargs(); */ + gaim_account_set_status(account, type, active); +} + +static void +parse_statuses(xmlnode *node, GaimAccount *account) +{ + xmlnode *child; + + for (child = xmlnode_get_child(node, "status"); child != NULL; + child = xmlnode_get_next_twin(child)) + { + parse_status(child, account); + } +} + +static void parse_proxy_info(xmlnode *node, GaimAccount *account) { GaimProxyInfo *proxy_info; @@ -489,6 +580,13 @@ g_free(data); } + /* Read the statuses */ + child = xmlnode_get_child(node, "statuses"); + if (child != NULL) + { + parse_statuses(child, ret); + } + /* Read the userinfo */ child = xmlnode_get_child(node, "userinfo"); if ((child != NULL) && ((data = xmlnode_get_data(child)) != NULL)) @@ -592,8 +690,9 @@ if (prpl == NULL) return account; + /* TODO: Should maybe use gaim_prpl_get_statuses()? */ prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); - if (prpl_info != NULL && prpl_info->status_types != NULL ) + if (prpl_info != NULL && prpl_info->status_types != NULL) gaim_account_set_status_types(account, prpl_info->status_types(account)); gaim_presence_set_status_active(account->presence, "offline", TRUE); @@ -663,7 +762,7 @@ } GaimConnection * -gaim_account_connect(GaimAccount *account, GaimStatus *status) +gaim_account_connect(GaimAccount *account) { GaimConnection *gc; @@ -677,7 +776,7 @@ gaim_debug_info("account", "Connecting to account %p. gc = %p\n", account, gc); - gaim_connection_connect(gc, status); + gaim_connection_connect(gc); return gc; } @@ -990,9 +1089,19 @@ gaim_account_set_status(GaimAccount *account, const char *status_id, gboolean active, ...) { + va_list args; + + va_start(args, active); + gaim_account_set_status_vargs(account, status_id, active, args); + va_end(args); +} + +void +gaim_account_set_status_vargs(GaimAccount *account, const char *status_id, + gboolean active, va_list args) +{ GaimStatus *status; GaimStatusType *status_type; - va_list args; g_return_if_fail(account != NULL); g_return_if_fail(status_id != NULL); @@ -1023,9 +1132,8 @@ /* TODO: Record the status in accounts.xml? */ - va_start(args, active); gaim_status_set_active_with_attrs(status, active, args); - va_end(args); + gaim_presence_set_status_active(gaim_account_get_presence(account), status_id, active); /* * If this account should be connected, but is not, then connect. @@ -1034,7 +1142,7 @@ (gaim_status_type_get_primitive(status_type) != GAIM_STATUS_OFFLINE) && !gaim_account_is_connected(account)) { - gaim_account_connect(account, status); + gaim_account_connect(account); } } @@ -1308,6 +1416,14 @@ } GaimStatus * +gaim_account_get_active_status(const GaimAccount *account) +{ + g_return_val_if_fail(account != NULL, NULL); + + return gaim_presence_get_active_status(account->presence); +} + +GaimStatus * gaim_account_get_status(const GaimAccount *account, const char *status_id) { g_return_val_if_fail(account != NULL, NULL); @@ -1588,23 +1704,6 @@ } void -gaim_accounts_auto_login(const char *ui) -{ - GaimAccount *account; - GList *l; - - g_return_if_fail(ui != NULL); - - for (l = gaim_accounts_get_all(); l != NULL; l = l->next) { - account = l->data; - - /* TODO: Shouldn't be be using some sort of saved status here? */ - if (gaim_account_get_enabled(account, ui)) - gaim_account_connect(account, gaim_account_get_status(account, "online")); - } -} - -void gaim_accounts_reorder(GaimAccount *account, size_t new_index) { size_t index;