src/status.c

changeset 10418
7b632343a29c
parent 10417
1fc8b2cc84bb
child 10419
cb6b7316fdba
--- a/src/status.c	Sat Dec 25 20:24:17 2004 +0000
+++ b/src/status.c	Sun Dec 26 00:46:26 2004 +0000
@@ -30,8 +30,6 @@
 #include "notify.h"
 #include "prefs.h"
 #include "status.h"
-#include "util.h"
-#include "xmlnode.h"
 
 /**
  * A type of status.
@@ -123,33 +121,6 @@
 	char *name;
 } GaimStatusBuddyKey;
 
-/**
- * The information of a snap-shot of the statuses of all
- * your accounts.  Basically these are your saved away messages.
- * There is an overall status and message that applies to
- * all your accounts, and then each individual account can
- * optionally have a different custom status and message.
- *
- * The changes to status.xml caused by the new status API
- * are fully backward compatible.  The new status API just
- * adds the optional sub-statuses to the XML file.
- */
-struct _GaimStatusSaved
-{
-	char *title;
-	GaimStatusPrimitive type;
-	char *message;
-
-	GList *substatuses;      /**< A list of GaimStatusSavedSub's. */
-};
-
-struct _GaimStatusSavedSub
-{
-	GaimAccount *account;
-	const GaimStatusType *type;
-	char *message;
-};
-
 static int primitive_scores[] =
 {
 	0,      /* unset                    */
@@ -165,43 +136,10 @@
 };
 
 static GHashTable *buddy_presences = NULL;
-static GList *saved_statuses = NULL;
-gboolean have_read_saved_statuses = FALSE;
 
 #define SCORE_IDLE      5
 #define SCORE_IDLE_TIME 6
 
-/**
- * Elements of this array correspond to the GaimStatusPrimitive
- * enumeration.
- */
-static const char *primitive_names[] =
-{
-	"unset",
-	"offline",
-	"available",
-	"unavailable",
-	"hidden",
-	"away",
-	"extended_away"
-};
-
-static GaimStatusPrimitive
-gaim_primitive_get_type(const char *name)
-{
-	int i;
-
-	g_return_val_if_fail(name != NULL, GAIM_STATUS_UNSET);
-
-	for (i = 0; i < GAIM_STATUS_NUM_PRIMITIVES; i++)
-	{
-		if (!strcmp(name, primitive_names[i]))
-			return i;
-	}
-
-	return GAIM_STATUS_UNSET;
-}
-
 /**************************************************************************
  * GaimStatusType API
  **************************************************************************/
@@ -1700,57 +1638,17 @@
 		return FALSE;
 }
 
-const GList *
-gaim_statuses_get_saved(void)
-{
-	return saved_statuses;
-}
-
-GaimStatusSaved *
-gaim_statuses_find_saved(const char *title)
-{
-	GList *l;
-	GaimStatusSaved *status;
-
-	for (l = saved_statuses; l != NULL; l = g_list_next(l))
-	{
-		status = (GaimStatusSaved *)l->data;
-		if (!strcmp(status->title, title))
-			return status;
-	}
-
-	return NULL;
-}
-
-const char *
-gaim_statuses_saved_get_title(const GaimStatusSaved *saved_status)
-{
-	return saved_status->title;
-}
-
-GaimStatusPrimitive
-gaim_statuses_saved_get_type(const GaimStatusSaved *saved_status)
-{
-	return saved_status->type;
-}
-
-const char *
-gaim_statuses_saved_get_message(const GaimStatusSaved *saved_status)
-{
-	return saved_status->message;
-}
-
 void *
-gaim_statuses_get_handle() {
+gaim_status_get_handle(void) {
 	static int handle;
 
 	return &handle;
 }
 
 void
-gaim_statuses_init(void)
+gaim_status_init(void)
 {
-	void *handle = gaim_statuses_get_handle;
+	void *handle = gaim_status_get_handle;
 
 	gaim_prefs_add_none("/core/status");
 	gaim_prefs_add_none("/core/status/scores");
@@ -1792,7 +1690,7 @@
 }
 
 void
-gaim_statuses_uninit(void)
+gaim_status_uninit(void)
 {
 	if (buddy_presences != NULL)
 	{
@@ -1801,313 +1699,3 @@
 		buddy_presences = NULL;
 	}
 }
-
-static GaimStatusSavedSub *
-gaim_statuses_read_parse_substatus(xmlnode *substatus)
-{
-	GaimStatusSavedSub *ret;
-	xmlnode *node;
-	char *data = NULL;
-
-	ret = g_new0(GaimStatusSavedSub, 1);
-
-	/* Read the account */
-	node = xmlnode_get_child(substatus, "account");
-	if (node != NULL)
-	{
-		char *acct_name;
-		const char *protocol;
-		acct_name = xmlnode_get_data(node);
-		protocol = xmlnode_get_attrib(node, "protocol");
-		if ((acct_name != NULL) && (protocol != NULL))
-			ret->account = gaim_accounts_find(acct_name, protocol);
-		g_free(acct_name);
-	}
-
-	if (ret->account == NULL)
-	{
-		g_free(ret);
-		return NULL;
-	}
-
-	/* Read the state */
-	node = xmlnode_get_child(substatus, "state");
-	if (node != NULL)
-		data = xmlnode_get_data(node);
-	if (data != NULL) {
-		ret->type = gaim_status_type_find_with_id(ret->account->status_types,
-												  data);
-		g_free(data);
-		data = NULL;
-	}
-
-	/* Read the message */
-	node = xmlnode_get_child(substatus, "message");
-	if (node != NULL)
-		data = xmlnode_get_data(node);
-	if (data != NULL)
-		ret->message = data;
-
-	return ret;
-}
-
-/**
- * Parse a saved status and add it to the saved_statuses linked list.
- *
- * Here's an example of the XML for a saved status:
- *   <status name="Girls">
- *       <state>away</state>
- *       <message>I like the way that they walk
- *   And it's chill to hear them talk
- *   And I can always make them smile
- *   From White Castle to the Nile</message>
- *       <substatus>
- *           <account protocol='prpl-oscar'>markdoliner</account>
- *           <state>available</state>
- *           <message>The ladies man is here to answer your queries.</message>
- *       </substatus>
- *       <substatus>
- *           <account protocol='prpl-oscar'>giantgraypanda</account>
- *           <state>away</state>
- *           <message>A.C. ain't in charge no more.</message>
- *       </substatus>
- *   </status>
- *
- * I know.  Moving, huh?
- */
-static GaimStatusSaved *
-gaim_statuses_read_parse_status(xmlnode *status)
-{
-	GaimStatusSaved *ret;
-	xmlnode *node;
-	const char *attrib;
-	char *data = NULL;
-	int i;
-
-	ret = g_new0(GaimStatusSaved, 1);
-
-	/* Read the title */
-	attrib = xmlnode_get_attrib(status, "name");
-	if (attrib == NULL)
-		attrib = "No Title";
-	/* Ensure the title is unique */
-	ret->title = g_strdup(attrib);
-	i = 2;
-	while (gaim_statuses_find_saved(ret->title) != NULL)
-	{
-		g_free(ret->title);
-		ret->title = g_strdup_printf("%s %d", attrib, i);
-		i++;
-	}
-
-	/* Read the primitive status type */
-	node = xmlnode_get_child(status, "state");
-	if (node != NULL)
-		data = xmlnode_get_data(node);
-	if (data != NULL) {
-		ret->type = gaim_primitive_get_type(data);
-		g_free(data);
-		data = NULL;
-	}
-
-	/* Read the message */
-	node = xmlnode_get_child(status, "message");
-	if (node != NULL)
-		data = xmlnode_get_data(node);
-	if (data != NULL)
-		ret->message = data;
-
-	/* Read substatuses */
-	for (node = xmlnode_get_child(status, "status"); node != NULL;
-			node = xmlnode_get_next_twin(node))
-	{
-		GaimStatusSavedSub *new;
-		new = gaim_statuses_read_parse_substatus(node);
-		if (new != NULL)
-			ret->substatuses = g_list_append(ret->substatuses, new);
-	}
-
-	return ret;
-}
-
-/**
- * @return TRUE on success, FALSE on failure (if the file can not
- *         be opened, or if it contains invalid XML).
- */
-static gboolean
-gaim_statuses_read(const char *filename)
-{
-	GError *error;
-	gchar *contents = NULL;
-	gsize length;
-	xmlnode *statuses, *status;
-
-	gaim_debug_info("status", "Reading %s\n", filename);
-
-	if (!g_file_get_contents(filename, &contents, &length, &error))
-	{
-		gaim_debug_error("status", "Error reading statuses: %s\n",
-						 error->message);
-		g_error_free(error);
-		return FALSE;
-	}
-
-	statuses = xmlnode_from_str(contents, length);
-
-	if (statuses == NULL)
-	{
-		FILE *backup;
-		gchar *name;
-		gaim_debug_error("status", "Error parsing statuses\n");
-		name = g_strdup_printf("%s~", filename);
-		if ((backup = fopen(name, "w")))
-		{
-			fwrite(contents, length, 1, backup);
-			fclose(backup);
-			chmod(name, S_IRUSR | S_IWUSR);
-		}
-		else
-		{
-			gaim_debug_error("status", "Unable to write backup %s\n", name);
-		}
-		g_free(name);
-		g_free(contents);
-		return FALSE;
-	}
-
-	g_free(contents);
-
-	for (status = xmlnode_get_child(statuses, "status"); status != NULL;
-			status = xmlnode_get_next_twin(status))
-	{
-		GaimStatusSaved *new;
-		new = gaim_statuses_read_parse_status(status);
-		saved_statuses = g_list_append(saved_statuses, new);
-	}
-
-	gaim_debug_info("status", "Finished reading statuses\n");
-
-	xmlnode_free(statuses);
-
-	return TRUE;
-}
-
-void
-gaim_statuses_load(void)
-{
-	const char *user_dir = gaim_user_dir();
-	gchar *filename;
-	gchar *msg;
-
-	g_return_if_fail(user_dir != NULL);
-
-	have_read_saved_statuses = TRUE;
-
-	filename = g_build_filename(user_dir, "status.xml", NULL);
-
-	if (g_file_test(filename, G_FILE_TEST_EXISTS))
-	{
-		if (!gaim_statuses_read(filename))
-		{
-			msg = g_strdup_printf(_("An error was encountered parsing the "
-						"file containing your saved statuses (%s).  They "
-						"have not been loaded, and the old file has been "
-						"renamed to status.xml~."), filename);
-			gaim_notify_error(NULL, NULL, _("Saved Statuses Error"), msg);
-			g_free(msg);
-		}
-	}
-
-	g_free(filename);
-}
-
-static xmlnode *
-gaim_substatus_get_as_xmlnode(GaimStatusSavedSub *substatus)
-{
-	xmlnode *node, *child;
-
-	node = xmlnode_new("substatus");
-
-	child = xmlnode_new("account");
-	xmlnode_set_attrib(node, "protocol",
-					   gaim_account_get_protocol_id(substatus->account));
-	xmlnode_insert_data(child,
-						gaim_account_get_username(substatus->account), -1);
-	xmlnode_insert_child(node, child);
-
-	child = xmlnode_new("state");
-	xmlnode_insert_data(child, substatus->type->id, -1);
-	xmlnode_insert_child(node, child);
-
-	if (substatus->message != NULL)
-	{
-		child = xmlnode_new("message");
-		xmlnode_insert_data(child, substatus->message, -1);
-		xmlnode_insert_child(node, child);
-	}
-
-	return node;
-}
-
-static xmlnode *
-gaim_status_get_as_xmlnode(GaimStatusSaved *status)
-{
-	xmlnode *node, *child;
-	GList *cur;
-
-	node = xmlnode_new("status");
-	xmlnode_set_attrib(node, "name", status->title);
-
-	child = xmlnode_new("state");
-	xmlnode_insert_data(child, primitive_names[status->type], -1);
-	xmlnode_insert_child(node, child);
-
-	child = xmlnode_new("message");
-	xmlnode_insert_data(child, status->message, -1);
-	xmlnode_insert_child(node, child);
-
-	for (cur = status->substatuses; cur != NULL; cur = cur->next)
-	{
-		child = gaim_substatus_get_as_xmlnode(cur->data);
-		xmlnode_insert_child(node, child);
-	}
-
-	return node;
-}
-
-static xmlnode *
-gaim_statuses_get_as_xmlnode()
-{
-	xmlnode *node, *child;
-	GList *cur;
-
-	node = xmlnode_new("statuses");
-	xmlnode_set_attrib(node, "version", "1");
-
-	for (cur = saved_statuses; cur != NULL; cur = cur->next)
-	{
-		child = gaim_status_get_as_xmlnode(cur->data);
-		xmlnode_insert_child(node, child);
-	}
-
-	return node;
-}
-
-void
-gaim_statuses_sync(void)
-{
-	xmlnode *statuses;
-	char *data;
-
-	if (!have_read_saved_statuses) {
-		gaim_debug_error("status", "Attempted to save statuses before they "
-						 "were read!\n");
-		return;
-	}
-
-	statuses = gaim_statuses_get_as_xmlnode();
-	data = xmlnode_to_formatted_str(statuses, NULL);
-	gaim_util_write_data_to_file("status.xml", data, -1);
-	g_free(data);
-	xmlnode_free(statuses);
-}

mercurial