libpurple/plugins/perl/perl-handlers.c

changeset 22845
7ccb529edf3f
parent 19336
065a79d2d0e5
child 23182
e32645a28cad
--- a/libpurple/plugins/perl/perl-handlers.c	Wed Apr 23 02:59:37 2008 +0000
+++ b/libpurple/plugins/perl/perl-handlers.c	Wed Apr 23 03:06:49 2008 +0000
@@ -207,13 +207,15 @@
 	return ret_frame;
 }
 
-static void
+static gboolean
 destroy_timeout_handler(PurplePerlTimeoutHandler *handler)
 {
+	gboolean ret = FALSE;
+
 	timeout_handlers = g_list_remove(timeout_handlers, handler);
 
 	if (handler->iotag > 0)
-		purple_timeout_remove(handler->iotag);
+		ret = purple_timeout_remove(handler->iotag);
 
 	if (handler->callback != NULL)
 		SvREFCNT_dec(handler->callback);
@@ -222,6 +224,8 @@
 		SvREFCNT_dec(handler->data);
 
 	g_free(handler);
+
+	return ret;
 }
 
 static void
@@ -301,8 +305,8 @@
 
 	for (i = 0; i < value_count; i++) {
 		sv_args[i] = purple_perl_sv_from_vargs(values[i],
-		                                     (va_list*)&args,
-		                                     &copy_args[i]);
+		                                       (va_list*)&args,
+		                                       &copy_args[i]);
 
 		XPUSHs(sv_args[i]);
 	}
@@ -422,14 +426,14 @@
 	return NULL;
 }
 
-void
+guint
 purple_perl_timeout_add(PurplePlugin *plugin, int seconds, SV *callback, SV *data)
 {
 	PurplePerlTimeoutHandler *handler;
 
 	if (plugin == NULL) {
 		croak("Invalid handle in adding perl timeout handler.\n");
-		return;
+		return 0;
 	}
 
 	handler = g_new0(PurplePerlTimeoutHandler, 1);
@@ -443,15 +447,39 @@
 	timeout_handlers = g_list_append(timeout_handlers, handler);
 
 	handler->iotag = purple_timeout_add(seconds * 1000, perl_timeout_cb, handler);
+
+	return handler->iotag;
+}
+
+gboolean
+purple_perl_timeout_remove(guint handle)
+{
+	GList *l, *l_next;
+
+	for (l = timeout_handlers; l != NULL; l = l_next) {
+		PurplePerlTimeoutHandler *handler;
+
+		l_next = l->next;
+
+		handler = (PurplePerlTimeoutHandler *)l->data;
+
+		if (handler->iotag == handle)
+			return destroy_timeout_handler(handler);
+	}
+
+	purple_debug_info("perl", "No timeout handler found with handle %u.\n",
+	                  handle);
+	return FALSE;
 }
 
 void
 purple_perl_timeout_clear_for_plugin(PurplePlugin *plugin)
 {
-	PurplePerlTimeoutHandler *handler;
 	GList *l, *l_next;
 
 	for (l = timeout_handlers; l != NULL; l = l_next) {
+		PurplePerlTimeoutHandler *handler;
+
 		l_next = l->next;
 
 		handler = (PurplePerlTimeoutHandler *)l->data;

mercurial