Buddy list now compiles. soc.2013.gobjectification

Tue, 09 Jul 2013 22:08:33 +0530

author
Ankit Vani <a@nevitus.org>
date
Tue, 09 Jul 2013 22:08:33 +0530
branch
soc.2013.gobjectification
changeset 34730
2406671e3c44
parent 34729
7f5a2fc8ef9c
child 34731
8d21337f3d73

Buddy list now compiles.
* Removed purple_blist_node_update(), use ui_ops->update()
* Added purple_blist_node_get_settings()

libpurple/blistnodes.c file | annotate | diff | comparison | revisions
libpurple/blistnodes.h file | annotate | diff | comparison | revisions
libpurple/blistnodetypes.c file | annotate | diff | comparison | revisions
libpurple/buddyicon.c file | annotate | diff | comparison | revisions
libpurple/buddylist.c file | annotate | diff | comparison | revisions
--- a/libpurple/blistnodes.c	Tue Jul 09 16:18:19 2013 +0530
+++ b/libpurple/blistnodes.c	Tue Jul 09 22:08:33 2013 +0530
@@ -174,6 +174,16 @@
 	return priv->dont_save;
 }
 
+GHashTable *
+purple_blist_node_get_settings(PurpleBListNode *node)
+{
+	PurpleBListNodePrivate *priv = PURPLE_BLIST_NODE_GET_PRIVATE(node);
+
+	g_return_val_if_fail(priv != NULL, NULL);
+
+	return priv->settings;
+}
+
 gboolean
 purple_blist_node_has_setting(PurpleBListNode* node, const char *key)
 {
@@ -325,17 +335,6 @@
 	return menu;
 }
 
-void
-purple_blist_node_update(PurpleBListNode *node)
-{
-	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
-
-	g_return_if_fail(node != NULL);
-
-	if (ops && ops->update)
-		ops->update(purple_blist_get_buddy_list(), node);
-}
-
 static void
 purple_blist_node_setting_free(gpointer data)
 {
--- a/libpurple/blistnodes.h	Tue Jul 09 16:18:19 2013 +0530
+++ b/libpurple/blistnodes.h	Tue Jul 09 22:08:33 2013 +0530
@@ -209,6 +209,15 @@
 void purple_blist_node_set_ui_data(PurpleBListNode *node, gpointer ui_data);
 
 /**
+ * Returns a node's settings
+ *
+ * @param node  The node to from which to get settings
+ *
+ * @return The hash table with the node's settings
+ */
+GHashTable *purple_blist_node_get_settings(PurpleBListNode *node);
+
+/**
  * Checks whether a named setting exists for a node in the buddy list
  *
  * @param node  The node to check from which to check settings
@@ -312,13 +321,6 @@
  */
 GList *purple_blist_node_get_extended_menu(PurpleBListNode *n);
 
-/**
- * Updates a node's UI, such as when its custom icon has been changed.
- *
- * @param node  The PurpleBListNode that is to be updated.
- */
-void purple_blist_node_update(PurpleBListNode *node);
-
 /*@}*/
 
 /**************************************************************************/
--- a/libpurple/blistnodetypes.c	Tue Jul 09 16:18:19 2013 +0530
+++ b/libpurple/blistnodetypes.c	Tue Jul 09 22:08:33 2013 +0530
@@ -146,6 +146,7 @@
 void
 purple_buddy_set_icon(PurpleBuddy *buddy, PurpleBuddyIcon *icon)
 {
+	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
 	PurpleBuddyPrivate *priv = PURPLE_BUDDY_GET_PRIVATE(buddy);
 
 	g_return_if_fail(priv != NULL);
@@ -158,7 +159,8 @@
 
 	purple_signal_emit(purple_blist_get_handle(), "buddy-icon-changed", buddy);
 
-	purple_blist_node_update(PURPLE_BLIST_NODE(buddy));
+	if (ops && ops->update)
+		ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(buddy));
 }
 
 PurpleBuddyIcon *
@@ -194,10 +196,12 @@
 	g_free(priv->name);
 	priv->name = purple_utf8_strip_unprintables(name);
 
-	if (ops && ops->save_node)
-		ops->save_node(PURPLE_BLIST_NODE(buddy));
-
-	purple_blist_node_update(PURPLE_BLIST_NODE(buddy));
+	if (ops) {
+		if (ops->save_node)
+			ops->save_node(PURPLE_BLIST_NODE(buddy));
+		if (ops->update)
+			ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(buddy));
+	}
 }
 
 const char *
@@ -322,7 +326,8 @@
 	if (ops && ops->save_node)
 		ops->save_node(PURPLE_BLIST_NODE(buddy));
 
-	purple_blist_node_update(PURPLE_BLIST_NODE(buddy));
+	if (ops && ops->update)
+		ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(buddy));
 
 	im = purple_conversations_find_im_with_account(priv->name,
 											   priv->account);
@@ -371,10 +376,12 @@
 		g_free(new_alias); /* could be "\0"; */
 	}
 
-	if (ops && ops->save_node)
-		ops->save_node(PURPLE_BLIST_NODE(buddy));
-
-	purple_blist_node_update(PURPLE_BLIST_NODE(buddy));
+	if (ops) {
+		if (ops->save_node)
+			ops->save_node(PURPLE_BLIST_NODE(buddy));
+		if (ops->update)
+			ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(buddy));
+	}
 
 	im = purple_conversations_find_im_with_account(priv->name,
 											   priv->account);
@@ -421,6 +428,7 @@
 	PurpleBListNode *cnode;
 	PurpleContact *contact;
 	PurpleCountingNode *contact_counter, *group_counter;
+	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
 	PurpleBuddyPrivate *priv = PURPLE_BUDDY_GET_PRIVATE(buddy);
 
 	g_return_if_fail(priv != NULL);
@@ -474,7 +482,9 @@
 	 * certainly won't hurt anything.  Unless you're on a K6-2 300.
 	 */
 	purple_contact_invalidate_priority_buddy(purple_buddy_get_contact(buddy));
-	purple_blist_node_update(PURPLE_BLIST_NODE(buddy));
+
+	if (ops && ops->update)
+		ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(buddy));
 }
 
 PurpleMediaCaps purple_buddy_get_media_caps(const PurpleBuddy *buddy)
@@ -833,10 +843,12 @@
 		g_free(new_alias); /* could be "\0" */
 	}
 
-	if (ops && ops->save_node)
-		ops->save_node(PURPLE_BLIST_NODE(contact));
-
-	purple_blist_node_update(PURPLE_BLIST_NODE(contact));
+	if (ops) {
+		if (ops->save_node)
+			ops->save_node(PURPLE_BLIST_NODE(contact));
+		if (ops->update)
+			ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(contact));
+	}
 
 	for(bnode = PURPLE_BLIST_NODE(contact)->child; bnode != NULL; bnode = bnode->next)
 	{
@@ -971,10 +983,11 @@
 		GParamSpec *pspec)
 {
 	PurpleContact *contact = PURPLE_CONTACT(obj);
+	PurpleContactPrivate *priv = PURPLE_CONTACT_GET_PRIVATE(contact);
 
 	switch (param_id) {
 		case CONTACT_PROP_ALIAS:
-			g_value_set_string(value, purple_contact_get_alias(contact));
+			g_value_set_string(value, priv->alias);
 			break;
 		case CONTACT_PROP_PRIORITY_BUDDY:
 			g_value_set_object(value, purple_contact_get_priority_buddy(contact));
@@ -1136,10 +1149,12 @@
 		g_free(new_alias); /* could be "\0" */
 	}
 
-	if (ops && ops->save_node)
-		ops->save_node(PURPLE_BLIST_NODE(chat));
-
-	purple_blist_node_update(PURPLE_BLIST_NODE(chat));
+	if (ops) {
+		if (ops->save_node)
+			ops->save_node(PURPLE_BLIST_NODE(chat));
+		if (ops->update)
+			ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(chat));
+	}
 
 	purple_signal_emit(purple_blist_get_handle(), "blist-node-aliased",
 					 chat, old_alias);
@@ -1472,7 +1487,8 @@
 		ops->save_node(PURPLE_BLIST_NODE(source));
 
 	/* Update the UI */
-	purple_blist_node_update(PURPLE_BLIST_NODE(source));
+	if (ops && ops->update)
+		ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(source));
 
 	/* Notify all PRPLs */
 	/* TODO: Is this condition needed?  Seems like it would always be TRUE */
--- a/libpurple/buddyicon.c	Tue Jul 09 16:18:19 2013 +0530
+++ b/libpurple/buddyicon.c	Tue Jul 09 22:08:33 2013 +0530
@@ -838,6 +838,7 @@
 	char *old_icon;
 	PurpleStoredImage *old_img;
 	PurpleStoredImage *img = NULL;
+	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
 
 	g_return_val_if_fail(node != NULL, NULL);
 
@@ -891,7 +892,8 @@
 			/* Is this call necessary anymore? Can the buddies
 			 * themselves need updating when the custom buddy
 			 * icon changes? */
-			purple_blist_node_update((PurpleBListNode*)buddy);
+			if (ops && ops->update)
+				ops->update(purple_blist_get_buddy_list(), PURPLE_BLIST_NODE(buddy));
 		}
 	} else if (PURPLE_IS_CHAT(node)) {
 		PurpleChatConversation *chat = NULL;
@@ -902,7 +904,8 @@
 		}
 	}
 
-	purple_blist_node_update(node);
+	if (ops && ops->update)
+		ops->update(purple_blist_get_buddy_list(), node);
 
 	if (old_img) {
 		purple_imgstore_unref(old_img);
--- a/libpurple/buddylist.c	Tue Jul 09 16:18:19 2013 +0530
+++ b/libpurple/buddylist.c	Tue Jul 09 22:08:33 2013 +0530
@@ -55,6 +55,8 @@
 static guint          save_timer = 0;
 static gboolean       blist_loaded = FALSE;
 
+PurpleBListNode *purple_blist_get_last_child(PurpleBListNode *node);
+
 /*********************************************************************
  * Private utility functions                                         *
  *********************************************************************/
@@ -122,7 +124,6 @@
 	g_hash_table_remove(buddies_cache, account);
 }
 
-
 /*********************************************************************
  * Writing to disk                                                   *
  *********************************************************************/
@@ -182,19 +183,20 @@
 buddy_to_xmlnode(PurpleBuddy *buddy)
 {
 	xmlnode *node, *child;
-	PurpleBuddyPrivate *priv = PURPLE_BUDDY_GET_PRIVATE(buddy);
+	PurpleAccount *account = purple_buddy_get_account(buddy);
+	const char *alias = purple_buddy_get_local_alias(buddy);
 
 	node = xmlnode_new("buddy");
-	xmlnode_set_attrib(node, "account", purple_account_get_username(buddy->account));
-	xmlnode_set_attrib(node, "proto", purple_account_get_protocol_id(buddy->account));
+	xmlnode_set_attrib(node, "account", purple_account_get_username(account));
+	xmlnode_set_attrib(node, "proto", purple_account_get_protocol_id(account));
 
 	child = xmlnode_new_child(node, "name");
-	xmlnode_insert_data(child, priv->name, -1);
+	xmlnode_insert_data(child, purple_buddy_get_name(buddy), -1);
 
-	if (priv->alias != NULL)
+	if (alias != NULL)
 	{
 		child = xmlnode_new_child(node, "alias");
-		xmlnode_insert_data(child, priv->alias, -1);
+		xmlnode_insert_data(child, alias, -1);
 	}
 
 	/* Write buddy settings */
@@ -209,23 +211,24 @@
 {
 	xmlnode *node, *child;
 	PurpleBListNode *bnode;
-	PurpleContactPrivate *priv = PURPLE_CONTACT_GET_PRIVATE(contact);
+	gchar *alias;
 
 	node = xmlnode_new("contact");
+	g_object_get(contact, "alias", &alias, NULL);
 
-	if (priv->alias != NULL)
+	if (alias != NULL)
 	{
-		xmlnode_set_attrib(node, "alias", priv->alias);
+		xmlnode_set_attrib(node, "alias", alias);
 	}
 
 	/* Write buddies */
 	for (bnode = PURPLE_BLIST_NODE(contact)->child; bnode != NULL; bnode = bnode->next)
 	{
-		if (!PURPLE_BLIST_NODE_SHOULD_SAVE(bnode))
+		if (purple_blist_node_get_dont_save(bnode))
 			continue;
 		if (PURPLE_IS_BUDDY(bnode))
 		{
-			child = buddy_to_xmlnode(bnode);
+			child = buddy_to_xmlnode(PURPLE_BUDDY(bnode));
 			xmlnode_insert_child(node, child);
 		}
 	}
@@ -241,22 +244,24 @@
 chat_to_xmlnode(PurpleChat *chat)
 {
 	xmlnode *node, *child;
-	PurpleChatPrivate *priv = PURPLE_CHAT_GET_PRIVATE(chat);
+	PurpleAccount *account = purple_chat_get_account(chat);
+	gchar *alias;
 
-	chat = (PurpleChat *)cnode;
+	g_object_get(chat, "alias", &alias, NULL);
 
 	node = xmlnode_new("chat");
-	xmlnode_set_attrib(node, "proto", purple_account_get_protocol_id(priv->account));
-	xmlnode_set_attrib(node, "account", purple_account_get_username(priv->account));
+	xmlnode_set_attrib(node, "proto", purple_account_get_protocol_id(account));
+	xmlnode_set_attrib(node, "account", purple_account_get_username(account));
 
-	if (priv->alias != NULL)
+	if (alias != NULL)
 	{
 		child = xmlnode_new_child(node, "alias");
-		xmlnode_insert_data(child, priv->alias, -1);
+		xmlnode_insert_data(child, alias, -1);
 	}
 
 	/* Write chat components */
-	g_hash_table_foreach(priv->components, chat_component_to_xmlnode, node);
+	g_hash_table_foreach(purple_chat_get_components(chat),
+			chat_component_to_xmlnode, node);
 
 	/* Write chat settings */
 	g_hash_table_foreach(purple_blist_node_get_settings(PURPLE_BLIST_NODE(chat)),
@@ -270,10 +275,9 @@
 {
 	xmlnode *node, *child;
 	PurpleBListNode *cnode;
-	PurpleGroupPrivate *priv = PURPLE_GROUP_GET_PRIVATE(group);
 
 	node = xmlnode_new("group");
-	xmlnode_set_attrib(node, "name", priv->name);
+	xmlnode_set_attrib(node, "name", purple_group_get_name(group));
 
 	/* Write settings */
 	g_hash_table_foreach(purple_blist_node_get_settings(PURPLE_BLIST_NODE(group)),
@@ -282,16 +286,16 @@
 	/* Write contacts and chats */
 	for (cnode = PURPLE_BLIST_NODE(group)->child; cnode != NULL; cnode = cnode->next)
 	{
-		if (!PURPLE_BLIST_NODE_SHOULD_SAVE(cnode))
+		if (purple_blist_node_get_dont_save(cnode))
 			continue;
 		if (PURPLE_IS_CONTACT(cnode))
 		{
-			child = contact_to_xmlnode(cnode);
+			child = contact_to_xmlnode(PURPLE_CONTACT(cnode));
 			xmlnode_insert_child(node, child);
 		}
 		else if (PURPLE_IS_CHAT(cnode))
 		{
-			child = chat_to_xmlnode(cnode);
+			child = chat_to_xmlnode(PURPLE_CHAT(cnode));
 			xmlnode_insert_child(node, child);
 		}
 	}
@@ -341,11 +345,11 @@
 	child = xmlnode_new_child(node, "blist");
 	for (gnode = purplebuddylist->root; gnode != NULL; gnode = gnode->next)
 	{
-		if (!PURPLE_BLIST_NODE_SHOULD_SAVE(gnode))
+		if (purple_blist_node_get_dont_save(gnode))
 			continue;
 		if (PURPLE_IS_GROUP(gnode))
 		{
-			grandchild = group_to_xmlnode(gnode);
+			grandchild = group_to_xmlnode(PURPLE_GROUP(gnode));
 			xmlnode_insert_child(child, grandchild);
 		}
 	}
@@ -669,7 +673,7 @@
 {
 	PurpleBListUiOps *ui_ops;
 	GList *account;
-	PurpleBuddyList *gbl = g_object_new(PurpleBuddyList, 1);
+	PurpleBuddyList *gbl = g_new0(PurpleBuddyList, 1);
 	PURPLE_DBUS_REGISTER_POINTER(gbl, PurpleBuddyList);
 
 	ui_ops = purple_blist_get_ui_ops();
@@ -749,16 +753,6 @@
 		ops->show(purplebuddylist);
 }
 
-void purple_blist_destroy()
-{
-	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
-
-	purple_debug(PURPLE_DEBUG_INFO, "blist", "Destroying\n");
-
-	if (ops && ops->destroy)
-		ops->destroy(purplebuddylist);
-}
-
 void purple_blist_set_visible(gboolean show)
 {
 	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
@@ -777,7 +771,7 @@
 	g_return_if_fail(buddy != NULL);
 
 	account = purple_buddy_get_account(buddy);
-	name = purple_buddy_get_name(buddy);
+	name = (gchar *)purple_buddy_get_name(buddy);
 
 	hb = g_new(struct _purple_hbuddy, 1);
 	hb->name = (gchar *)purple_normalize(account, name);
@@ -887,10 +881,12 @@
 		}
 	}
 
-	if (ops && ops->save_node)
-		ops->save_node(cnode);
-
-	purple_blist_node_update(PURPLE_BLIST_NODE(cnode));
+	if (ops) {
+		if (ops->save_node)
+			ops->save_node(cnode);
+		if (ops->update)
+			ops->update(purplebuddylist, PURPLE_BLIST_NODE(cnode));
+	}
 
 	purple_signal_emit(purple_blist_get_handle(), "blist-node-added",
 			cnode);
@@ -987,7 +983,9 @@
 			purple_blist_remove_contact((PurpleContact*)bnode->parent);
 		} else {
 			purple_contact_invalidate_priority_buddy((PurpleContact*)bnode->parent);
-			purple_blist_node_update(bnode->parent);
+
+			if (ops && ops->update)
+				ops->update(purplebuddylist, bnode->parent);
 		}
 	}
 
@@ -1040,10 +1038,12 @@
 
 	purple_contact_invalidate_priority_buddy(purple_buddy_get_contact(buddy));
 
-	if (ops && ops->save_node)
-		ops->save_node((PurpleBListNode*) buddy);
-
-	purple_blist_node_update(PURPLE_BLIST_NODE(buddy));
+	if (ops) {
+		if (ops->save_node)
+			ops->save_node((PurpleBListNode*) buddy);
+		if (ops->update)
+			ops->update(purplebuddylist, PURPLE_BLIST_NODE(buddy));
+	}
 
 	/* Signal that the buddy has been added */
 	purple_signal_emit(purple_blist_get_handle(), "buddy-added", buddy);
@@ -1360,7 +1360,7 @@
 		if (PURPLE_IS_BUDDY_ONLINE(buddy)) {
 			purple_counting_node_change_online_count(contact_counter, -1);
 			if (purple_counting_node_get_online_count(contact_counter) == 0)
-				purple_group_set_online_count(group_counter, -1);
+				purple_counting_node_set_online_count(group_counter, -1);
 		}
 		if (purple_account_is_connected(account)) {
 			purple_counting_node_change_current_size(contact_counter, -1);
@@ -1372,7 +1372,9 @@
 		/* Re-sort the contact */
 		if (cnode->child && purple_contact_get_priority_buddy(contact) == buddy) {
 			purple_contact_invalidate_priority_buddy(contact);
-			purple_blist_node_update(cnode);
+
+			if (ops && ops->update)
+				ops->update(purplebuddylist, cnode);
 		}
 	}
 
@@ -1768,7 +1770,9 @@
 				}
 				if (recompute) {
 					purple_contact_invalidate_priority_buddy(contact);
-					purple_blist_node_update(cnode);
+
+					if (ops && ops->update)
+						ops->update(purplebuddylist, cnode);
 				}
 			} else if (PURPLE_IS_CHAT(cnode)) {
 				chat = PURPLE_CHAT(cnode);
@@ -1973,9 +1977,35 @@
 			NULL);
 }
 
+static void
+blist_node_destroy(PurpleBListNode *node)
+{
+	PurpleBListUiOps *ui_ops;
+	PurpleBListNode *child, *next_child;
+
+	ui_ops = purple_blist_get_ui_ops();
+	child = node->child;
+	while (child) {
+		next_child = child->next;
+		blist_node_destroy(child);
+		child = next_child;
+	}
+
+	/* Allow the UI to free data */
+	node->parent = NULL;
+	node->child  = NULL;
+	node->next   = NULL;
+	node->prev   = NULL;
+	if (ui_ops && ui_ops->remove)
+		ui_ops->remove(purplebuddylist, node);
+
+	g_object_unref(node);
+}
+
 void
 purple_blist_uninit(void)
 {
+	PurpleBListUiOps *ops = purple_blist_get_ui_ops();
 	PurpleBListNode *node, *next_node;
 
 	/* This happens if we quit before purple_set_blist is called. */
@@ -1988,17 +2018,20 @@
 		purple_blist_sync();
 	}
 
-	purple_blist_destroy();
+	purple_debug(PURPLE_DEBUG_INFO, "blist", "Destroying\n");
+
+	if (ops && ops->destroy)
+		ops->destroy(purplebuddylist);
 
 	node = purple_blist_get_root();
 	while (node) {
 		next_node = node->next;
-		purple_blist_node_destroy(node); /* TODO replace by a loop, see original blist_destroy */
+		blist_node_destroy(node);
 		node = next_node;
 	}
 	purplebuddylist->root = NULL;
 
-	g_hash_table_destroy(PURPLE_BUDDY_LIST_GET_PRIVAT(purplebuddylist)->buddies);
+	g_hash_table_destroy(purplebuddylist->buddies);
 	g_hash_table_destroy(buddies_cache);
 	g_hash_table_destroy(groups_cache);
 

mercurial