diff src/account.c @ 10196:760e690a5f30

[gaim-migrate @ 11313] A few steps closer to being able to set an oscar away message. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Tue, 16 Nov 2004 23:29:53 +0000
parents 131f70fc53c1
children 393f85d9f8dd
line wrap: on
line diff
--- a/src/account.c	Tue Nov 16 03:56:09 2004 +0000
+++ b/src/account.c	Tue Nov 16 23:29:53 2004 +0000
@@ -553,6 +553,11 @@
 						gboolean active, ...)
 {
 	GaimStatus *status;
+	gboolean changed = FALSE;
+	va_list args;
+	const char *id, *string_data;
+	int int_data;
+	gboolean boolean_data;
 
 	g_return_if_fail(account   != NULL);
 	g_return_if_fail(status_id != NULL);
@@ -575,7 +580,52 @@
 		return;
 	}
 
-	if (gaim_status_is_active(status) == active)
+	if (gaim_status_is_active(status) != active)
+		changed = TRUE;
+
+	/* Set any attributes */
+	va_start(args, active);
+	while ((id = va_arg(args, const char *)) != NULL)
+	{
+		GaimValue *value;
+		value = gaim_status_get_attr_value(status, id);
+		if (value->type == GAIM_TYPE_STRING)
+		{
+			string_data = va_arg(args, const char *);
+			if (((string_data == NULL) && (value->data.string_data == NULL)) ||
+				((string_data != NULL) && (value->data.string_data != NULL) &&
+				!strcmp(string_data, value->data.string_data)))
+			{
+				continue;
+			}
+			gaim_status_set_attr_string(status, id, string_data);
+			changed = TRUE;
+		}
+		else if (value->type == GAIM_TYPE_INT)
+		{
+			int_data = va_arg(args, int);
+			if (int_data == value->data.int_data)
+				continue;
+			gaim_status_set_attr_int(status, id, int_data);
+			changed = TRUE;
+		}
+		else if (value->type == GAIM_TYPE_BOOLEAN)
+		{
+			boolean_data = va_arg(args, gboolean);
+			if (boolean_data == value->data.boolean_data)
+				continue;
+			gaim_status_set_attr_int(status, id, boolean_data);
+			changed = TRUE;
+		}
+		else
+		{
+			/* We don't know what the data is--skip over it */
+			va_arg(args, void *);
+		}
+	}
+	va_end(args);
+
+	if (!changed)
 		return;
 
 	gaim_status_set_active(status, active);