/soc/2013/ankitkv/gobjectification: b0ccef093327: Started GObjec...

Ankit Vani a at nevitus.org
Sun Jul 14 10:37:45 EDT 2013


Changeset: b0ccef093327041536a29a7309901b76902dae23
Author:	 Ankit Vani <a at nevitus.org>
Date:	 2013-07-14 20:07 +0530
Branch:	 soc.2013.gobjectification
URL: https://hg.pidgin.im/soc/2013/ankitkv/gobjectification/rev/b0ccef093327

Description:

Started GObjectification of PurpleStatus and PurplePresence.
* Added presence.[ch] for the PurplePresence object.
* Removed PurplePresenceContext.
* PurpleAccountPresence, PurpleConversationPresence and PurpleBuddyPresence inherit PurplePresence.
* Removed purple_presence_new(), purple_presence_destroy(), purple_status_destroy()

diffstat:

 libpurple/Makefile.am |    6 +-
 libpurple/presence.c  |  582 ++++++++++++++++++++++++++++++++++++++++++++++++++
 libpurple/presence.h  |  461 +++++++++++++++++++++++++++++++++++++++
 libpurple/status.c    |  566 ------------------------------------------------
 libpurple/status.h    |  370 ++++++-------------------------
 5 files changed, 1120 insertions(+), 865 deletions(-)

diffs (truncated from 2122 to 300 lines):

diff --git a/libpurple/Makefile.am b/libpurple/Makefile.am
--- a/libpurple/Makefile.am
+++ b/libpurple/Makefile.am
@@ -79,6 +79,7 @@ purple_coresources = \
 	pluginpref.c \
 	pounce.c \
 	prefs.c \
+	presence.c \
 	proxy.c \
 	prpl.c \
 	request.c \
@@ -150,6 +151,7 @@ purple_coreheaders = \
 	pluginpref.h \
 	pounce.h \
 	prefs.h \
+	presence.h \
 	proxy.h \
 	prpl.h \
 	request.h \
@@ -230,8 +232,8 @@ dbus_headers  = dbus-bindings.h dbus-pur
 dbus_exported = dbus-useful.h dbus-define-api.h account.h accounts.h blistnodes.h \
                 blistnodetypes.h buddylist.h buddyicon.h connection.h conversation.h \
                 conversationtypes.h conversations.h core.h ft.h log.h notify.h \
-                prefs.h roomlist.h savedstatuses.h smiley.h status.h server.h util.h \
-                xmlnode.h prpl.h
+                prefs.h presence.h roomlist.h savedstatuses.h smiley.h status.h \
+                server.h util.h xmlnode.h prpl.h
 
 purple_build_coreheaders = $(addprefix $(srcdir)/, $(purple_coreheaders)) \
 		$(addprefix $(srcdir)/media/, $(purple_mediaheaders)) \
diff --git a/libpurple/presence.c b/libpurple/presence.c
new file mode 100644
--- /dev/null
+++ b/libpurple/presence.c
@@ -0,0 +1,582 @@
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#include "presence.h"
+
+/**
+ * A list of statuses.
+ */
+struct _PurplePresence
+{
+	PurplePresenceContext context;
+
+	gboolean idle;
+	time_t idle_time;
+	time_t login_time;
+
+	GList *statuses;
+	GHashTable *status_table;
+
+	PurpleStatus *active_status;
+
+	union
+	{
+		PurpleAccount *account;
+
+		struct
+		{
+			PurpleConversation *conv;
+			char *user;
+
+		} chat;
+
+		struct
+		{
+			PurpleAccount *account;
+			char *name;
+			PurpleBuddy *buddy;
+
+		} buddy;
+
+	} u;
+};
+
+
+/**************************************************************************
+* PurplePresence API
+**************************************************************************/
+PurplePresence *
+purple_presence_new(PurplePresenceContext context)
+{
+	PurplePresence *presence;
+
+	g_return_val_if_fail(context != PURPLE_PRESENCE_CONTEXT_UNSET, NULL);
+
+	presence = g_new0(PurplePresence, 1);
+	PURPLE_DBUS_REGISTER_POINTER(presence, PurplePresence);
+
+	presence->context = context;
+
+	presence->status_table =
+		g_hash_table_new_full(g_str_hash, g_str_equal,
+							  g_free, NULL);
+
+	return presence;
+}
+
+PurplePresence *
+purple_presence_new_for_account(PurpleAccount *account)
+{
+	PurplePresence *presence = NULL;
+	g_return_val_if_fail(account != NULL, NULL);
+
+	presence = purple_presence_new(PURPLE_PRESENCE_CONTEXT_ACCOUNT);
+	presence->u.account = account;
+	presence->statuses = purple_prpl_get_statuses(account, presence);
+
+	return presence;
+}
+
+PurplePresence *
+purple_presence_new_for_conv(PurpleConversation *conv)
+{
+	PurplePresence *presence;
+
+	g_return_val_if_fail(conv != NULL, NULL);
+
+	presence = purple_presence_new(PURPLE_PRESENCE_CONTEXT_CONV);
+	presence->u.chat.conv = conv;
+	/* presence->statuses = purple_prpl_get_statuses(purple_conversation_get_account(conv), presence); ? */
+
+	return presence;
+}
+
+PurplePresence *
+purple_presence_new_for_buddy(PurpleBuddy *buddy)
+{
+	PurplePresence *presence;
+	PurpleAccount *account;
+
+	g_return_val_if_fail(buddy != NULL, NULL);
+	account = purple_buddy_get_account(buddy);
+
+	presence = purple_buddy_presence_new();
+
+	presence->u.buddy.name    = g_strdup(purple_buddy_get_name(buddy));
+	presence->u.buddy.account = account;
+	presence->statuses = purple_prpl_get_statuses(account, presence);
+
+	presence->u.buddy.buddy = buddy;
+
+	return presence;
+}
+
+void
+purple_presence_destroy(PurplePresence *presence)
+{
+	g_return_if_fail(presence != NULL);
+
+	if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_BUDDY)
+	{
+		g_free(presence->u.buddy.name);
+	}
+	else if (purple_presence_get_context(presence) == PURPLE_PRESENCE_CONTEXT_CONV)
+	{
+		g_free(presence->u.chat.user);
+	}
+
+	g_list_foreach(presence->statuses, (GFunc)purple_status_destroy, NULL);
+	g_list_free(presence->statuses);
+
+	g_hash_table_destroy(presence->status_table);
+
+	PURPLE_DBUS_UNREGISTER_POINTER(presence);
+	g_free(presence);
+}
+
+void
+purple_presence_set_status_active(PurplePresence *presence, const char *status_id,
+		gboolean active)
+{
+	PurpleStatus *status;
+
+	g_return_if_fail(presence  != NULL);
+	g_return_if_fail(status_id != NULL);
+
+	status = purple_presence_get_status(presence, status_id);
+
+	g_return_if_fail(status != NULL);
+	/* TODO: Should we do the following? */
+	/* g_return_if_fail(active == status->active); */
+
+	if (purple_status_is_exclusive(status))
+	{
+		if (!active)
+		{
+			purple_debug_warning("status",
+					"Attempted to set a non-independent status "
+					"(%s) inactive. Only independent statuses "
+					"can be specifically marked inactive.",
+					status_id);
+			return;
+		}
+	}
+
+	purple_status_set_active(status, active);
+}
+
+void
+purple_presence_switch_status(PurplePresence *presence, const char *status_id)
+{
+	purple_presence_set_status_active(presence, status_id, TRUE);
+}
+
+static void
+update_buddy_idle(PurpleBuddy *buddy, PurplePresence *presence,
+		time_t current_time, gboolean old_idle, gboolean idle)
+{
+	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
+	PurpleAccount *account = purple_buddy_get_account(buddy);
+
+	if (!old_idle && idle)
+	{
+		if (purple_prefs_get_bool("/purple/logging/log_system"))
+		{
+			PurpleLog *log = purple_account_get_log(account, FALSE);
+
+			if (log != NULL)
+			{
+				char *tmp, *tmp2;
+				tmp = g_strdup_printf(_("%s became idle"),
+				purple_buddy_get_alias(buddy));
+				tmp2 = g_markup_escape_text(tmp, -1);
+				g_free(tmp);
+
+				purple_log_write(log, PURPLE_MESSAGE_SYSTEM,
+				purple_buddy_get_alias(buddy), current_time, tmp2);
+				g_free(tmp2);
+			}
+		}
+	}
+	else if (old_idle && !idle)
+	{
+		if (purple_prefs_get_bool("/purple/logging/log_system"))
+		{
+			PurpleLog *log = purple_account_get_log(account, FALSE);
+
+			if (log != NULL)
+			{
+				char *tmp, *tmp2;
+				tmp = g_strdup_printf(_("%s became unidle"),
+				purple_buddy_get_alias(buddy));
+				tmp2 = g_markup_escape_text(tmp, -1);
+				g_free(tmp);
+
+				purple_log_write(log, PURPLE_MESSAGE_SYSTEM,
+				purple_buddy_get_alias(buddy), current_time, tmp2);
+				g_free(tmp2);
+			}
+		}
+	}
+
+	if (old_idle != idle)
+		purple_signal_emit(purple_blist_get_handle(), "buddy-idle-changed", buddy,
+		                 old_idle, idle);
+
+	purple_contact_invalidate_priority_buddy(purple_buddy_get_contact(buddy));
+
+	/* Should this be done here? It'd perhaps make more sense to
+	 * connect to buddy-[un]idle signals and update from there
+	 */
+
+	if (ops != NULL && ops->update != NULL)
+		ops->update(purple_blist_get_buddy_list(), (PurpleBListNode *)buddy);
+}
+
+void
+purple_presence_set_idle(PurplePresence *presence, gboolean idle, time_t idle_time)
+{
+	gboolean old_idle;
+	time_t current_time;
+
+	g_return_if_fail(presence != NULL);
+
+	if (presence->idle == idle && presence->idle_time == idle_time)
+		return;
+
+	old_idle            = presence->idle;
+	presence->idle      = idle;



More information about the Commits mailing list