libpurple/protocol.c

branch
soc.2013.gobjectification.plugins
changeset 36686
9807e4acf281
parent 36681
9c38716c8eb7
child 36687
7a83a1a657e3
--- a/libpurple/protocol.c	Wed Sep 04 20:11:40 2013 +0530
+++ b/libpurple/protocol.c	Wed Sep 04 20:38:42 2013 +0530
@@ -85,6 +85,56 @@
 	return protocol->whiteboard_ops;
 }
 
+static void
+user_splits_free(PurpleProtocol *protocol)
+{
+	g_return_if_fail(protocol != NULL);
+
+	while (protocol->user_splits) {
+		PurpleAccountUserSplit *split = protocol->user_splits->data;
+		purple_account_user_split_destroy(split);
+		protocol->user_splits = g_list_delete_link(protocol->user_splits,
+				protocol->user_splits);
+	}
+}
+
+static void
+protocol_options_free(PurpleProtocol *protocol)
+{
+	g_return_if_fail(protocol != NULL);
+
+	while (protocol->protocol_options) {
+		PurpleAccountOption *option = protocol->protocol_options->data;
+		purple_account_option_destroy(option);
+		protocol->protocol_options =
+				g_list_delete_link(protocol->protocol_options,
+				                   protocol->protocol_options);
+	}
+}
+
+static void
+icon_spec_free(PurpleProtocol *protocol)
+{
+	g_return_if_fail(protocol != NULL);
+
+	purple_buddy_icon_spec_free(protocol->icon_spec);
+	protocol->icon_spec = NULL;
+}
+
+void
+purple_protocol_override(PurpleProtocol *protocol,
+                         PurpleProtocolOverrideFlags flags)
+{
+	g_return_if_fail(PURPLE_IS_PROTOCOL(protocol));
+
+	if (flags & PURPLE_PROTOCOL_OVERRIDE_USER_SPLITS)
+		user_splits_free(protocol);
+	if (flags & PURPLE_PROTOCOL_OVERRIDE_PROTOCOL_OPTIONS)
+		protocol_options_free(protocol);
+	if (flags & PURPLE_PROTOCOL_OVERRIDE_ICON_SPEC)
+		icon_spec_free(protocol);
+}
+
 /**************************************************************************
  * GObject stuff
  **************************************************************************/
@@ -132,22 +182,9 @@
 {
 	PurpleProtocol *protocol = PURPLE_PROTOCOL(object);
 
-	while (protocol->user_splits) {
-		PurpleAccountUserSplit *split = protocol->user_splits->data;
-		purple_account_user_split_destroy(split);
-		protocol->user_splits = g_list_delete_link(protocol->user_splits,
-				protocol->user_splits);
-	}
-
-	while (protocol->protocol_options) {
-		PurpleAccountOption *option = protocol->protocol_options->data;
-		purple_account_option_destroy(option);
-		protocol->protocol_options =
-				g_list_delete_link(protocol->protocol_options,
-				                   protocol->protocol_options);
-	}
-
-	purple_buddy_icon_spec_free(protocol->icon_spec);
+	user_splits_free(protocol);
+	protocol_options_free(protocol);
+	icon_spec_free(protocol);
 
 	parent_class->finalize(object);
 }

mercurial