libpurple/plugins/tcl/tcl.c

changeset 33906
dc870eacc2d0
parent 33861
71533f0d5dc0
child 33940
b44d15793c83
--- a/libpurple/plugins/tcl/tcl.c	Mon Apr 22 23:54:33 2013 +0200
+++ b/libpurple/plugins/tcl/tcl.c	Sat Apr 27 14:39:33 2013 +0200
@@ -50,6 +50,16 @@
 	Tcl_Interp *interp;
 };
 
+typedef struct {
+	char *id;
+	char *name;
+	char *version;
+	char *summary;
+	char *description;
+	char *author;
+	char *homepage;
+} tcl_plugin_info_strings;
+
 PurpleStringref *PurpleTclRefAccount;
 PurpleStringref *PurpleTclRefConnection;
 PurpleStringref *PurpleTclRefConversation;
@@ -68,6 +78,21 @@
 
 static gboolean tcl_loaded = FALSE;
 
+static void tcl_plugin_info_strings_free(tcl_plugin_info_strings *strings)
+{
+	if (strings == NULL)
+		return;
+
+	g_free(strings->id);
+	g_free(strings->name);
+	g_free(strings->version);
+	g_free(strings->summary);
+	g_free(strings->description);
+	g_free(strings->author);
+	g_free(strings->homepage);
+	g_free(strings);
+}
+
 PurplePlugin *tcl_interp_get_plugin(Tcl_Interp *interp)
 {
 	struct tcl_plugin_data *data;
@@ -219,7 +244,9 @@
 			result = Tcl_GetObjResult(interp);
 			if (Tcl_ListObjGetElements(interp, result, &nelems, &listitems) == TCL_OK) {
 				if ((nelems == 6) || (nelems == 7)) {
+					tcl_plugin_info_strings *strings = g_new0(tcl_plugin_info_strings, 1);
 					info = g_new0(PurplePluginInfo, 1);
+					info->extra_info = strings;
 
 					info->magic = PURPLE_PLUGIN_MAGIC;
 					info->major_version = PURPLE_MAJOR_VERSION;
@@ -227,17 +254,17 @@
 					info->type = PURPLE_PLUGIN_STANDARD;
 					info->dependencies = g_list_append(info->dependencies, "core-tcl");
 
-					info->name = g_strdup(Tcl_GetString(listitems[0]));
-					info->version = g_strdup(Tcl_GetString(listitems[1]));
-					info->summary = g_strdup(Tcl_GetString(listitems[2]));
-					info->description = g_strdup(Tcl_GetString(listitems[3]));
-					info->author = g_strdup(Tcl_GetString(listitems[4]));
-					info->homepage = g_strdup(Tcl_GetString(listitems[5]));
+					info->name = strings->name = g_strdup(Tcl_GetString(listitems[0]));
+					info->version = strings->version = g_strdup(Tcl_GetString(listitems[1]));
+					info->summary = strings->summary = g_strdup(Tcl_GetString(listitems[2]));
+					info->description = strings->description = g_strdup(Tcl_GetString(listitems[3]));
+					info->author = strings->author = g_strdup(Tcl_GetString(listitems[4]));
+					info->homepage = strings->homepage = g_strdup(Tcl_GetString(listitems[5]));
 
 					if (nelems == 6)
-						info->id = g_strdup_printf("tcl-%s", Tcl_GetString(listitems[0]));
+						info->id = strings->id = g_strdup_printf("tcl-%s", Tcl_GetString(listitems[0]));
 					else if (nelems == 7)
-						info->id = g_strdup_printf("tcl-%s", Tcl_GetString(listitems[6]));
+						info->id = strings->id = g_strdup_printf("tcl-%s", Tcl_GetString(listitems[6]));
 
 					plugin->info = info;
 
@@ -314,12 +341,9 @@
 static void tcl_destroy_plugin(PurplePlugin *plugin)
 {
 	if (plugin->info != NULL) {
-		g_free(plugin->info->id);
-		g_free(plugin->info->name);
-		g_free(plugin->info->version);
-		g_free(plugin->info->description);
-		g_free(plugin->info->author);
-		g_free(plugin->info->homepage);
+		tcl_plugin_info_strings *info_strings = plugin->info->extra_info;
+		tcl_plugin_info_strings_free(info_strings);
+		plugin->info->extra_info = NULL;
 	}
 
 	return;

mercurial