diff src/signals.c @ 6564:800ef4a51096

[gaim-migrate @ 7086] gaim_signal_register now takes a GaimValue return value and param types. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Thu, 21 Aug 2003 21:54:36 +0000
parents 9e4fa4853cfe
children 7dba3e17cb21
line wrap: on
line diff
--- a/src/signals.c	Thu Aug 21 21:21:21 2003 +0000
+++ b/src/signals.c	Thu Aug 21 21:54:36 2003 +0000
@@ -24,6 +24,7 @@
 
 #include "debug.h"
 #include "signals.h"
+#include "value.h"
 
 typedef struct
 {
@@ -42,6 +43,10 @@
 
 	GaimSignalMarshalFunc marshal;
 
+	int num_values;
+	GaimValue **values;
+	GaimValue *ret_value;
+
 	GList *handlers;
 	size_t handler_count;
 
@@ -84,15 +89,27 @@
 
 	g_list_free(signal_data->handlers);
 
+	if (signal_data->values != NULL)
+	{
+		int i;
+
+		for (i = 0; i < signal_data->num_values; i++)
+			gaim_value_destroy((GaimValue *)signal_data->values[i]);
+
+		g_free(signal_data->values);
+	}
+
 	g_free(signal_data);
 }
 
 gulong
 gaim_signal_register(void *instance, const char *signal,
-					 GaimSignalMarshalFunc marshal)
+					 GaimSignalMarshalFunc marshal,
+					 GaimValue *ret_value, int num_values, ...)
 {
 	GaimInstanceData *instance_data;
 	GaimSignalData *signal_data;
+	va_list args;
 
 	g_return_val_if_fail(instance != NULL, 0);
 	g_return_val_if_fail(signal   != NULL, 0);
@@ -119,6 +136,22 @@
 	signal_data->id              = instance_data->next_signal_id;
 	signal_data->marshal         = marshal;
 	signal_data->next_handler_id = 1;
+	signal_data->ret_value       = ret_value;
+	signal_data->num_values      = num_values;
+
+	if (num_values > 0)
+	{
+		int i;
+
+		signal_data->values = g_new0(GaimValue *, num_values);
+
+		va_start(args, num_values);
+
+		for (i = 0; i < num_values; i++)
+			signal_data->values[i] = va_arg(args, GaimValue *);
+
+		va_end(args);
+	}
 
 	g_hash_table_insert(instance_data->signals,
 						g_strdup(signal), signal_data);
@@ -169,6 +202,38 @@
 	g_return_if_fail(found);
 }
 
+void
+gaim_signal_get_values(void *instance, const char *signal,
+					   GaimValue **ret_value,
+					   int *num_values, GaimValue ***values)
+{
+	GaimInstanceData *instance_data;
+	GaimSignalData *signal_data;
+
+	g_return_if_fail(instance   != NULL);
+	g_return_if_fail(signal     != NULL);
+	g_return_if_fail(num_values != NULL);
+	g_return_if_fail(values     != NULL);
+
+	/* Get the instance data */
+	instance_data =
+		(GaimInstanceData *)g_hash_table_lookup(instance_table, instance);
+
+	g_return_if_fail(instance_data != NULL);
+
+	/* Get the signal data */
+	signal_data =
+		(GaimSignalData *)g_hash_table_lookup(instance_data->signals, signal);
+
+	g_return_if_fail(signal_data != NULL);
+
+	*num_values = signal_data->num_values;
+	*values     = signal_data->values;
+
+	if (ret_value != NULL)
+		*ret_value = signal_data->ret_value;
+}
+
 static gulong
 signal_connect_common(void *instance, const char *signal, void *handle,
 					  GaimCallback func, void *data, gboolean use_vargs)