libpurple/plugins.c

branch
soc.2013.gobjectification.plugins
changeset 36386
d402ca995746
parent 36383
f4f8d1914a65
child 36389
8d86658a3b68
--- a/libpurple/plugins.c	Wed Jul 31 04:03:04 2013 +0530
+++ b/libpurple/plugins.c	Wed Jul 31 16:55:47 2013 +0530
@@ -34,6 +34,7 @@
  * Plugin info private data
  **************************************************************************/
 struct _PurplePluginInfoPrivate {
+	GList *actions;  /**< Actions that the plugin can perform >*/
 };
 
 enum
@@ -172,6 +173,13 @@
 static void
 purple_plugin_info_finalize(GObject *object)
 {
+	PurplePluginInfoPrivate *priv = PURPLE_PLUGIN_INFO_GET_PRIVATE(object);
+
+	while (priv->actions) {
+		g_boxed_free(PURPLE_TYPE_PLUGIN_ACTION, priv->actions->data);
+		priv->actions = g_list_delete_link(priv->actions, priv->actions);
+	}
+
 	G_OBJECT_CLASS(parent_class)->finalize(object);
 }
 
@@ -216,6 +224,74 @@
 }
 
 /**************************************************************************
+ * PluginAction API
+ **************************************************************************/
+static void
+purple_plugin_action_free(PurplePluginAction *action)
+{
+	g_return_if_fail(action != NULL);
+
+	g_free(action->label);
+	g_free(action);
+}
+
+static PurplePluginAction *
+purple_plugin_action_copy(PurplePluginAction *action)
+{
+	PurplePluginAction *action_copy;
+
+	g_return_val_if_fail(action != NULL, NULL);
+
+	action_copy = g_new(PurplePluginAction, 1);
+
+	action_copy->label    = g_strdup(action->label);
+	action_copy->callback = action->callback;
+
+	return action_copy;
+}
+
+GType
+purple_plugin_action_get_type(void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY(type == 0)) {
+		type = g_boxed_type_register_static("PurplePluginAction",
+				(GBoxedCopyFunc)purple_plugin_action_copy,
+				(GBoxedFreeFunc)purple_plugin_action_free);
+	}
+
+	return type;
+}
+
+/**************************************************************************
+ * Actions API
+ **************************************************************************/
+void
+purple_plugin_actions_add(GPluginPlugin *plugin, const char* label,
+                          PurplePluginActionCallback callback)
+{
+	GPluginPluginInfo *plugin_info;
+	PurplePluginInfoPrivate *priv;
+	PurplePluginAction *action;
+
+	g_return_if_fail(plugin != NULL);
+	g_return_if_fail(label != NULL && callback != NULL);
+
+	plugin_info = gplugin_plugin_get_info(plugin);
+	priv = PURPLE_PLUGIN_INFO_GET_PRIVATE(plugin_info);
+
+	action = g_new0(PurplePluginAction, 1);
+
+	action->label    = g_strdup(label);
+	action->callback = callback;
+
+	priv->actions = g_list_append(priv->actions, action);
+
+	g_object_unref(plugin_info);
+}
+
+/**************************************************************************
  * Plugins API
  **************************************************************************/
 GList *
@@ -290,9 +366,11 @@
 		} else {
 			purple_debug_error("plugins", "Unable to find saved plugin %s\n", id);
 		}
+
+		g_free(l->data);
 	}
 
-	g_list_free_full(ids, (GDestroyNotify)g_free);
+	g_list_free(ids);
 }
 
 void

mercurial