diff src/account.c @ 10738:55af3fa46329

[gaim-migrate @ 12340] Lots of changes here. A lot of it stems from chaning gaim_account_connect() so that it DOES NOT have the GaimStatus parameter. It will attempt to use the GaimStatus of your account from the last time it was connected (which doesn't work quite right yet). My goal here was to save and load each account's GaimStatuses to accounts.xml, so if you were "away" when you signed off then you'll be "away" when you sign back on. Not quite there yet. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sat, 26 Mar 2005 20:08:43 +0000
parents 0e017707532f
children 94cc67130789
line wrap: on
line diff
--- 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;