[Galago-commits] r2570 - in trunk/galago-daemon: . src

galago-commits at freedesktop.org galago-commits at freedesktop.org
Wed Feb 8 01:46:44 PST 2006


Author: chipx86
Date: 2006-02-08 01:46:40 -0800 (Wed, 08 Feb 2006)
New Revision: 2570

Modified:
   trunk/galago-daemon/ChangeLog
   trunk/galago-daemon/src/account.c
   trunk/galago-daemon/src/core.c
   trunk/galago-daemon/src/filter.h
   trunk/galago-daemon/src/meta-person.c
   trunk/galago-daemon/src/meta-presence.c
   trunk/galago-daemon/src/person-list.c
   trunk/galago-daemon/src/person.c
   trunk/galago-daemon/src/presence.c
Log:
Merge back from protocol-cleanup (r2563) to trunk.


Modified: trunk/galago-daemon/ChangeLog
===================================================================
--- trunk/galago-daemon/ChangeLog	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/ChangeLog	2006-02-08 09:46:40 UTC (rev 2570)
@@ -1,3 +1,40 @@
+Tue Feb 07 00:50:39 PST 2006  Christian Hammond <chipx86 at chipx86.com>
+
+	* src/presence.c:
+	  - When a status is added, compute the object path and send it back
+	    to the caller.
+
+Mon Feb 06 01:10:05 PST 2006  Christian Hammond <chipx86 at chipx86.com>
+
+	* src/person-list.c:
+	  - Fix merging of MetaPersons. We shouldn't encounter leaks anymore.
+
+Mon Feb 06 00:14:20 PST 2006  Christian Hammond <chipx86 at chipx86.com>
+
+	* src/account.c:
+	* src/meta-person.c:
+	  - Fix the retrieval of the MetaPresence when creating a presence.
+
+Fri Feb 03 02:16:32 PST 2006  Christian Hammond <chipx86 at chipx86.com>
+
+	* src/account.c:
+	* src/core.c:
+	* src/filter.h:
+	* src/meta-person.c:
+	* src/meta-presence.c:
+	* src/person.c:
+	* src/presence.c:
+	  - Move to using CreatePresence, RemovePresence, PresenceCreated, and
+	    PresenceDeleted instead of SetPresence, UnsetPresence,
+	    PresenceSet, and PresenceUnset.
+	  - CreatePresence now computes and returns the object path.
+	  - CoCo.AddPerson now computes the object path of the person.
+
+Fri Feb 03 00:47:13 PST 2006  Christian Hammond <chipx86 at chipx86.com>
+
+	* src/account.c:
+	  - Remove a redundant function call.
+
 Wed Feb 01 20:52:27 PST 2006  Christian Hammond <chipx86 at chipx86.com>
 
 	* src/account.c:

Modified: trunk/galago-daemon/src/account.c
===================================================================
--- trunk/galago-daemon/src/account.c	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/account.c	2006-02-08 09:46:40 UTC (rev 2570)
@@ -306,89 +306,95 @@
 }
 
 static DBusHandlerResult
-set_unset_presence(DBusConnection *dbus_conn, DBusMessage *message,
-				   GalagodCoCo *coco, GalagoAccount *account,
-				   GalagoPresence *presence)
+account_create_presence(DBusConnection *dbus_conn, DBusMessage *message,
+						GalagodCoCo *coco, GalagoAccount *account)
 {
+	DBusMessage *reply;
+	DBusMessageIter iter;
 	GalagodMetaAccount *meta_account;
 	GalagodMetaPresence *meta_presence = NULL;
 	GalagoAccount *main_account;
-	GalagoPresence *main_presence = NULL;
+	GalagoPresence *main_presence;
+	GalagoPresence *presence;
+	const char *obj_path;
+	gboolean new_presence = FALSE;
 
-	meta_account = GALAGOD_META_ACCOUNT(account);
-	main_account = galagod_meta_account_get_account(meta_account);
+	meta_account  = GALAGOD_META_ACCOUNT(account);
+	main_account  = galagod_meta_account_get_account(meta_account);
+	main_presence = galago_account_get_presence(main_account, FALSE);
 
-	if (galago_account_get_presence(main_account, FALSE) != NULL)
-	{
-		main_presence = galago_account_get_presence(main_account, FALSE);
+	presence = galago_account_get_presence(account, FALSE);
+
+	if (main_presence != NULL)
 		meta_presence = GALAGOD_META_PRESENCE(main_presence);
-	}
 
 	if (presence == NULL)
 	{
-		GalagoPresence *old_presence;
+		char *new_obj_path;
 
-		old_presence = galago_account_get_presence(account, FALSE);
+		presence = galago_account_create_presence(account);
+		g_object_set_data(G_OBJECT(presence), "coco", coco);
+		new_obj_path = galagod_presence_generate_path(presence);
+		galago_object_set_dbus_path(GALAGO_OBJECT(presence), new_obj_path);
+		g_free(new_obj_path);
 
-		if (meta_presence != NULL && old_presence != NULL)
-		{
-			galagod_meta_presence_remove_presence(meta_presence, old_presence);
+		new_presence = TRUE;
+	}
 
-			if (galagod_meta_presence_get_presences(meta_presence) == NULL)
-			{
-				galagod_meta_presence_destroy(meta_presence);
+	if (meta_presence == NULL)
+	{
+		meta_presence = galagod_meta_presence_new(meta_account);
+		new_presence = TRUE;
+	}
 
-				_galagod_dbus_account_emit(main_account, "PresenceUnset");
-			}
-		}
-	}
-	else
+	if (new_presence)
 	{
-		gboolean new_presence = FALSE;
-
-		if (meta_presence == NULL)
-		{
-			meta_presence = galagod_meta_presence_new(meta_account);
-			new_presence = TRUE;
-		}
-
-		g_object_set_data(G_OBJECT(presence), "coco", coco);
-
 		galagod_meta_presence_add_presence(meta_presence, presence);
-
-		if (new_presence)
-		{
-			_galagod_dbus_account_emit_with_object(main_account, "PresenceSet",
-												   presence);
-		}
+		_galagod_dbus_account_emit_with_object(main_account, "PresenceCreated",
+											   presence);
 	}
 
-	_galago_account_set_presence(account, presence);
+	reply = dbus_message_new_method_return(message);
+	dbus_message_iter_init_append(reply, &iter);
+	obj_path = galago_object_get_dbus_path(GALAGO_OBJECT(presence));
+	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &obj_path);
+	dbus_connection_send(dbus_conn, reply, NULL);
+	dbus_message_unref(reply);
 
-	galagod_dbus_send_empty_reply(dbus_conn, message);
-
 	return DBUS_HANDLER_RESULT_HANDLED;
 }
 
 static DBusHandlerResult
-account_set_presence(DBusConnection *dbus_conn, DBusMessage *message,
-					 GalagodCoCo *coco, GalagoAccount *account)
+account_destroy_presence(DBusConnection *dbus_conn, DBusMessage *message,
+						 GalagodCoCo *coco, GalagoAccount *account)
 {
-	GalagoPresence *presence;
-	DBusMessageIter iter;
+	GalagodMetaAccount *meta_account;
+	GalagodMetaPresence *meta_presence = NULL;
+	GalagoAccount *main_account;
+	GalagoPresence *main_presence = NULL;
+	GalagoPresence *old_presence;
 
-	dbus_message_iter_init(message, &iter);
-	presence = galago_dbus_message_iter_get_object(&iter,
-												   GALAGO_TYPE_PRESENCE);
+	meta_account  = GALAGOD_META_ACCOUNT(account);
+	main_account  = galagod_meta_account_get_account(meta_account);
+	main_presence = galago_account_get_presence(main_account, FALSE);
 
-	return set_unset_presence(dbus_conn, message, coco, account, presence);
-}
+	if (main_presence != NULL)
+		meta_presence = GALAGOD_META_PRESENCE(main_presence);
 
-static DBusHandlerResult
-account_unset_presence(DBusConnection *dbus_conn, DBusMessage *message,
-					   GalagodCoCo *coco, GalagoAccount *account)
-{
-	return set_unset_presence(dbus_conn, message, coco, account, NULL);
+	old_presence = galago_account_get_presence(account, FALSE);
+
+	if (meta_presence != NULL && old_presence != NULL)
+	{
+		galagod_meta_presence_remove_presence(meta_presence, old_presence);
+
+		if (galagod_meta_presence_get_presences(meta_presence) == NULL)
+		{
+			galagod_meta_presence_destroy(meta_presence);
+			_galagod_dbus_account_emit(main_account, "PresenceDeleted");
+		}
+	}
+
+	return DBUS_HANDLER_RESULT_HANDLED;
 }
 
 static DBusHandlerResult
@@ -403,11 +409,13 @@
 	main_account =
 		galagod_meta_account_get_account(GALAGOD_META_ACCOUNT(account));
 	presence = galago_account_get_presence(main_account, FALSE);
+	printf("-- Looking up presence for account %p\n", main_account);
 
 	if (presence == NULL)
 	{
 		GalagoService *service = galago_account_get_service(main_account);
 
+		printf("Returning error: no presence\n");
 		reply = galagod_object_not_found_error_new(message,
 			"The presence on account '%s' on service '%s' could not be found.",
 			galago_account_get_username(main_account),
@@ -415,6 +423,7 @@
 	}
 	else
 	{
+		printf("Returning presence\n");
 		reply = dbus_message_new_method_return(message);
 		dbus_message_iter_init_append(reply, &iter);
 		galago_dbus_message_iter_append_object(&iter, GALAGO_OBJECT(presence));
@@ -559,9 +568,9 @@
 	GALAGOD_COMMAND("GetContact",       account_get_contact),
 	GALAGOD_COMMAND("GetContacts",      account_get_contacts),
 	GALAGOD_COMMAND("GetContactsCount", account_get_contacts_count),
-	GALAGOD_COMMAND("SetPresence",      account_set_presence),
 	GALAGOD_COMMAND("GetPresence",      account_get_presence),
-	GALAGOD_COMMAND("UnsetPresence",    account_unset_presence),
+	GALAGOD_COMMAND("CreatePresence",   account_create_presence),
+	GALAGOD_COMMAND("DestroyPresence",  account_destroy_presence),
 	GALAGOD_COMMAND("SetAvatar",        account_set_avatar),
 	GALAGOD_COMMAND("GetAvatar",        account_get_avatar),
 	GALAGOD_COMMAND("UnsetAvatar",      account_unset_avatar),

Modified: trunk/galago-daemon/src/core.c
===================================================================
--- trunk/galago-daemon/src/core.c	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/core.c	2006-02-08 09:46:40 UTC (rev 2570)
@@ -80,20 +80,34 @@
 }
 
 static DBusHandlerResult
-coco_add_person(DBusConnection *conn, DBusMessage *message, GalagodCoCo *coco)
+coco_add_person(DBusConnection *dbus_conn, DBusMessage *message,
+				GalagodCoCo *coco)
 {
+	DBusMessage *reply;
+	DBusMessageIter iter;
 	GalagoPerson *person;
-	DBusMessageIter iter;
+	char *obj_path;
 
 	dbus_message_iter_init(message, &iter);
 	person = galago_dbus_message_iter_get_object(&iter, GALAGO_TYPE_PERSON);
 
 	g_object_set_data(G_OBJECT(person), "coco", coco);
 
+	/* Send the reply containing the object path. */
+	reply = dbus_message_new_method_return(message);
+	dbus_message_iter_init_append(reply, &iter);
+
+	obj_path = galagod_person_generate_path(person);
+	galago_object_set_dbus_path(GALAGO_OBJECT(person), obj_path);
+	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &obj_path);
+
+	dbus_connection_send(dbus_conn, reply, NULL);
+	dbus_message_unref(reply);
+
+	g_free(obj_path);
+
 	galagod_people_add(person);
 
-	galagod_dbus_send_empty_reply(conn, message);
-
 	return DBUS_HANDLER_RESULT_HANDLED;
 }
 

Modified: trunk/galago-daemon/src/filter.h
===================================================================
--- trunk/galago-daemon/src/filter.h	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/filter.h	2006-02-08 09:46:40 UTC (rev 2570)
@@ -81,9 +81,11 @@
 void galagod_account_add_filter(GalagoAccount *account);
 void galagod_account_remove_filter(GalagoAccount *account);
 
+char *galagod_person_generate_path(GalagoPerson *person);
 void galagod_person_add_filter(GalagoPerson *person);
 void galagod_person_remove_filter(GalagoPerson *person);
 
+char *galagod_presence_generate_path(GalagoPresence *presence);
 void galagod_presence_add_filter(GalagoPresence *presence);
 void galagod_presence_remove_filter(GalagoPresence *presence);
 

Modified: trunk/galago-daemon/src/meta-person.c
===================================================================
--- trunk/galago-daemon/src/meta-person.c	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/meta-person.c	2006-02-08 09:46:40 UTC (rev 2570)
@@ -27,6 +27,10 @@
 #include <time.h>
 #include <unistd.h>
 
+/* Provided by libgalago */
+void _galago_account_set_person(GalagoAccount *account,
+								GalagoPerson *person);
+
 static const char *
 galagod_get_uid(void)
 {
@@ -46,13 +50,16 @@
 galagod_meta_person_new(void)
 {
 	GalagodMetaPerson *meta_person;
+	char *obj_path;
 
 	meta_person = g_new0(GalagodMetaPerson, 1);
 
 	galago_context_push(galagod_get_context());
-
 	meta_person->person = galago_create_person(galagod_get_uid());
 
+	obj_path = galagod_person_generate_path(meta_person->person);
+	galago_object_set_dbus_path(GALAGO_OBJECT(meta_person->person), obj_path);
+	g_free(obj_path);
 	galago_context_pop();
 
 	g_object_set_data(G_OBJECT(meta_person->person),

Modified: trunk/galago-daemon/src/meta-presence.c
===================================================================
--- trunk/galago-daemon/src/meta-presence.c	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/meta-presence.c	2006-02-08 09:46:40 UTC (rev 2570)
@@ -41,8 +41,6 @@
 	dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &idle);
 	dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32,  &idle_start_time);
 
-	g_message("Sending idle = %d, idle_start_time = %ld", idle, idle_start_time);
-
 	dbus_connection_send(galago_get_dbus_conn(), message, NULL);
 	dbus_message_unref(message);
 }
@@ -52,15 +50,19 @@
 {
 	GalagodMetaPresence *meta_presence;
 	GalagoAccount *main_account;
+	char *obj_path;
 
 	g_return_val_if_fail(meta_account != NULL, NULL);
 
 	meta_presence = g_new0(GalagodMetaPresence, 1);
-
 	main_account = galagod_meta_account_get_account(meta_account);
-
 	meta_presence->presence = galago_account_create_presence(main_account);
 
+	obj_path = galagod_presence_generate_path(meta_presence->presence);
+	galago_object_set_dbus_path(GALAGO_OBJECT(meta_presence->presence),
+								obj_path);
+	g_free(obj_path);
+
 	g_object_set_data(G_OBJECT(meta_presence->presence),
 					  "meta-presence", meta_presence);
 

Modified: trunk/galago-daemon/src/person-list.c
===================================================================
--- trunk/galago-daemon/src/person-list.c	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/person-list.c	2006-02-08 09:46:40 UTC (rev 2570)
@@ -57,21 +57,23 @@
 	const GList *l;
 	GList *tmp_meta_people = NULL;
 
-	g_message("Merging person %p into meta-person %p", person, meta_person);
+	meta_person2 = GALAGOD_META_PERSON(person);
 
+	if (meta_person2 != NULL && meta_person2 != meta_person)
+		tmp_meta_people = g_list_append(tmp_meta_people, meta_person2);
+
 	for (l = galago_person_get_accounts(person, FALSE);
 		 l != NULL;
 		 l = l->next)
 	{
-		GalagoAccount *account = (GalagoAccount *)l->data;
+		GalagoAccount *account = GALAGO_ACCOUNT(l->data);
 
 		meta_person2 = galagod_people_find_with_account(account);
 
 		if (meta_person != meta_person2 &&
 			!g_list_find(tmp_meta_people, meta_person2))
 		{
-			tmp_meta_people = g_list_append(tmp_meta_people,
-												 meta_person2);
+			tmp_meta_people = g_list_append(tmp_meta_people, meta_person2);
 		}
 	}
 
@@ -107,6 +109,7 @@
 
 	if (galago_person_is_me(person) && GALAGOD_META_PERSON(person) != meta_me)
 	{
+		galagod_meta_person_destroy(meta_person);
 		_set_meta_persons(person, meta_me);
 		meta_person = meta_me;
 	}
@@ -148,10 +151,7 @@
 	galago_context_push(galagod_coco_get_context(coco));
 
 	for (l = galago_context_get_people(GALAGO_REMOTE); l != NULL; l = l->next)
-	{
-		g_message("Removing person %p", l->data);
 		galagod_people_remove((GalagoPerson *)l->data);
-	}
 
 	galago_context_pop();
 }

Modified: trunk/galago-daemon/src/person.c
===================================================================
--- trunk/galago-daemon/src/person.c	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/person.c	2006-02-08 09:46:40 UTC (rev 2570)
@@ -283,6 +283,18 @@
 	GALAGOD_COMMAND_LAST
 };
 
+char *
+galagod_person_generate_path(GalagoPerson *person)
+{
+	GalagodCoCo *coco = g_object_get_data(G_OBJECT(person), "coco");
+
+	return g_strdup_printf("%s/people/%s",
+		(coco == NULL
+		 ? galago_context_get_obj_path_prefix()
+		 : galago_object_get_dbus_path(GALAGO_OBJECT(coco))),
+		galago_dbus_normalize_name(galago_person_get_id(person)));
+}
+
 void
 galagod_person_add_filter(GalagoPerson *person)
 {

Modified: trunk/galago-daemon/src/presence.c
===================================================================
--- trunk/galago-daemon/src/presence.c	2006-02-08 09:43:56 UTC (rev 2569)
+++ trunk/galago-daemon/src/presence.c	2006-02-08 09:46:40 UTC (rev 2570)
@@ -22,6 +22,14 @@
 #include "meta-presence.h"
 #include "utils.h"
 
+static char *
+galagod_status_generate_path(GalagoPresence *presence, GalagoStatus *status)
+{
+	return g_strdup_printf("%s/%s",
+		galago_object_get_dbus_path(GALAGO_OBJECT(presence)),
+		galago_status_get_id(status));
+}
+
 static void
 _galagod_dbus_presence_emit_status_added(GalagoPresence *presence,
 										 GalagoStatus *status)
@@ -71,24 +79,41 @@
 					GalagodCoCo *coco, GalagoPresence *presence)
 {
 	GalagoStatus *status;
-	GalagodMetaPresence *meta_presence;
+	GalagodMetaPresence *meta_presence = GALAGOD_META_PRESENCE(presence);
 	GalagoPresence *main_presence;
 	DBusMessageIter iter;
+	DBusMessage *reply;
 	const GList* l;
 	const char *status_id;
 	int status_weight = 0;
+	char *obj_path;
 
-	meta_presence = GALAGOD_META_PRESENCE(presence);
-
 	dbus_message_iter_init(message, &iter);
 	status = galago_dbus_message_iter_get_object(&iter, GALAGO_TYPE_STATUS);
-	dbus_message_iter_next(&iter);
 
+	/* Pull out the status ID and object path, and set it back on the status */
 	status_id = galago_status_get_id(status);
+	obj_path = galagod_status_generate_path(presence, status);
+	galago_object_set_dbus_path(GALAGO_OBJECT(status), obj_path);
 
+	/* Send the reply containing the object path. */
+	reply = dbus_message_new_method_return(message);
+	dbus_message_iter_init_append(reply, &iter);
+	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &obj_path);
+	dbus_connection_send(dbus_conn, reply, NULL);
+	dbus_message_unref(reply);
+	g_free(obj_path);
+
 	if (!galago_presence_has_status(presence, status_id))
-		galago_presence_add_status(presence, galago_status_duplicate(status));
+	{
+		GalagoStatus *dup_status = galago_status_duplicate(status);
 
+		obj_path = galagod_status_generate_path(presence, dup_status);
+		galago_object_set_dbus_path(GALAGO_OBJECT(dup_status), obj_path);
+		g_free(obj_path);
+		galago_presence_add_status(presence, dup_status);
+	}
+
 	for (l = galagod_meta_presence_get_presences(meta_presence);
 		 l != NULL;
 		 l = l->next)
@@ -103,25 +128,24 @@
 
 	main_presence = galagod_meta_presence_get_presence(meta_presence);
 
-	if (status_weight > 0)
+	if (status_weight > 0 &&
+		!galago_presence_has_status(main_presence, status_id))
 	{
-		if (!galago_presence_has_status(main_presence, status_id))
-		{
-			galago_context_push(galagod_get_context());
+		GalagoStatus *dup_status;
 
-			galago_presence_add_status(main_presence,
-									   galago_status_duplicate(status));
+		galago_context_push(galagod_get_context());
+		dup_status = galago_status_duplicate(status);
+		obj_path = galagod_status_generate_path(main_presence, dup_status);
+		galago_object_set_dbus_path(GALAGO_OBJECT(dup_status), obj_path);
+		g_free(obj_path);
+		galago_presence_add_status(main_presence, dup_status);
+		galago_context_pop();
 
-			galago_context_pop();
-
-			_galagod_dbus_presence_emit_status_added(main_presence, status);
-		}
+		_galagod_dbus_presence_emit_status_added(main_presence, status);
 	}
 
 	g_object_unref(status);
 
-	galagod_dbus_send_empty_reply(dbus_conn, message);
-
 	return DBUS_HANDLER_RESULT_HANDLED;
 }
 
@@ -225,6 +249,14 @@
 	GALAGOD_COMMAND_LAST
 };
 
+char *
+galagod_presence_generate_path(GalagoPresence *presence)
+{
+	return g_strdup_printf("%s/presence",
+		galago_object_get_dbus_path(
+			GALAGO_OBJECT(galago_presence_get_account(presence))));
+}
+
 void
 galagod_presence_add_filter(GalagoPresence *presence)
 {



More information about the galago-commits mailing list