summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2003-11-16 23:46:48 +0000
committerSebastien Helleu <flashcode@flashtux.org>2003-11-16 23:46:48 +0000
commitfe4ca016156b01a1c66410dcecce5a970aa55bd3 (patch)
tree30ba613649121e70b6cbac2eb6ffaf12d0190433 /src/plugins
parent62fabde3730fecc487380406d341917dd480c211 (diff)
downloadweechat-fe4ca016156b01a1c66410dcecce5a970aa55bd3.zip
Added Perl handlers
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/perl/wee-perl.c93
-rw-r--r--src/plugins/perl/wee-perl.h1
-rw-r--r--src/plugins/plugins.c83
-rw-r--r--src/plugins/plugins.h17
4 files changed, 170 insertions, 24 deletions
diff --git a/src/plugins/perl/wee-perl.c b/src/plugins/perl/wee-perl.c
index 709f575ad..f0d105843 100644
--- a/src/plugins/perl/wee-perl.c
+++ b/src/plugins/perl/wee-perl.c
@@ -32,11 +32,14 @@
#include <XSUB.h>
#include "../../common/weechat.h"
#include "wee-perl.h"
+#include "../plugins.h"
#include "../../gui/gui.h"
static PerlInterpreter *my_perl = NULL;
-static t_perl_script *perl_scripts = NULL;
+
+t_perl_script *perl_scripts = NULL;
+t_perl_script *last_perl_script = NULL;
extern void boot_DynaLoader (pTHX_ CV* cv);
@@ -64,13 +67,22 @@ static XS (XS_IRC_register)
new_perl_script->version = strdup (version);
new_perl_script->shutdown_func = strdup (shutdown_func);
new_perl_script->description = strdup (description);
- new_perl_script->next_script = perl_scripts;
- perl_scripts = new_perl_script;
- wee_log_printf (_("registered Perl script: \"%s\"\n"), name);
+
+ /* add new script to list */
+ new_perl_script->prev_script = last_perl_script;
+ new_perl_script->next_script = NULL;
+ if (perl_scripts)
+ last_perl_script->next_script = new_perl_script;
+ else
+ perl_scripts = new_perl_script;
+ last_perl_script = new_perl_script;
+
+ wee_log_printf (_("registered Perl script: \"%s\", version %s (%s)\n"),
+ name, version, description);
}
else
gui_printf (NULL,
- _("%s unable to load Perl script \"%s\"\n"),
+ _("%s unable to load Perl script \"%s\" (not enough memory)\n"),
WEECHAT_ERROR, name);
XST_mPV (0, VERSION);
XSRETURN (1);
@@ -96,6 +108,22 @@ static XS (XS_IRC_print)
}
/*
+ * IRC::add_message_handler: add handler for messages (privmsg, ...)
+ */
+
+static XS (XS_IRC_add_message_handler)
+{
+ char *name, *function;
+ int integer;
+ dXSARGS;
+
+ name = SvPV (ST (0), integer);
+ function = SvPV (ST (1), integer);
+ plugins_msg_handler_add (PLUGIN_PERL, name, function);
+ XSRETURN_EMPTY;
+}
+
+/*
* xs_init: initialize subroutines
*/
@@ -105,6 +133,7 @@ xs_init (pTHX)
newXS ("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
newXS ("IRC::register", XS_IRC_register, "IRC");
newXS ("IRC::print", XS_IRC_print, "IRC");
+ newXS ("IRC::add_message_handler", XS_IRC_add_message_handler, "IRC");
}
/*
@@ -238,6 +267,42 @@ wee_perl_load (char *filename)
}
/*
+ * wee_perl_script_free: free a Perl script
+ */
+
+void
+wee_perl_script_free (t_perl_script *ptr_perl_script)
+{
+ t_perl_script *new_perl_scripts;
+
+ /* remove script from list */
+ if (last_perl_script == ptr_perl_script)
+ last_perl_script = ptr_perl_script->prev_script;
+ if (ptr_perl_script->prev_script)
+ {
+ (ptr_perl_script->prev_script)->next_script = ptr_perl_script->next_script;
+ new_perl_scripts = perl_scripts;
+ }
+ else
+ new_perl_scripts = ptr_perl_script->next_script;
+
+ if (ptr_perl_script->next_script)
+ (ptr_perl_script->next_script)->prev_script = ptr_perl_script->prev_script;
+
+ /* free data */
+ if (ptr_perl_script->name)
+ free (ptr_perl_script->name);
+ if (ptr_perl_script->version)
+ free (ptr_perl_script->version);
+ if (ptr_perl_script->shutdown_func)
+ free (ptr_perl_script->shutdown_func);
+ if (ptr_perl_script->description)
+ free (ptr_perl_script->description);
+ free (ptr_perl_script);
+ perl_scripts = new_perl_scripts;
+}
+
+/*
* wee_perl_unload: unload a Perl script
*/
@@ -252,16 +317,7 @@ wee_perl_unload (t_perl_script *ptr_perl_script)
/* call shutdown callback function */
if (ptr_perl_script->shutdown_func[0])
wee_perl_exec (ptr_perl_script->shutdown_func, "");
-
- /* free data */
- if (ptr_perl_script->name)
- free (ptr_perl_script->name);
- if (ptr_perl_script->version)
- free (ptr_perl_script->version);
- if (ptr_perl_script->shutdown_func)
- free (ptr_perl_script->shutdown_func);
- if (ptr_perl_script->description)
- free (ptr_perl_script->description);
+ wee_perl_script_free (ptr_perl_script);
}
}
@@ -272,15 +328,8 @@ wee_perl_unload (t_perl_script *ptr_perl_script)
void
wee_perl_unload_all ()
{
- t_perl_script *ptr_perl_script;
-
while (perl_scripts)
- {
wee_perl_unload (perl_scripts);
- ptr_perl_script = perl_scripts->next_script;
- free (perl_scripts);
- perl_scripts = ptr_perl_script;
- }
}
/*
diff --git a/src/plugins/perl/wee-perl.h b/src/plugins/perl/wee-perl.h
index 31a40481b..5898285ca 100644
--- a/src/plugins/perl/wee-perl.h
+++ b/src/plugins/perl/wee-perl.h
@@ -31,6 +31,7 @@ struct t_perl_script
char *version; /* version of script */
char *shutdown_func; /* function when script ends */
char *description; /* description of script */
+ t_perl_script *prev_script; /* link to previous Perl script */
t_perl_script *next_script; /* link to next Perl script */
};
diff --git a/src/plugins/plugins.c b/src/plugins/plugins.c
index 50b8e60ef..f7cde6d6d 100644
--- a/src/plugins/plugins.c
+++ b/src/plugins/plugins.c
@@ -27,13 +27,22 @@
#endif
#include <stdlib.h>
+#include <string.h>
+#include "../common/weechat.h"
#include "plugins.h"
+#include "../gui/gui.h"
#ifdef PLUGIN_PERL
#include "perl/wee-perl.h"
#endif
+t_plugin_handler *plugins_msg_handlers = NULL;
+t_plugin_handler *last_plugin_msg_handler = NULL;
+t_plugin_handler *plugins_cmd_handlers = NULL;
+t_plugin_handler *last_plugin_cmd_handler = NULL;
+
+
/*
* plugins_init: initialize all plugins
*/
@@ -93,12 +102,86 @@ plugins_unload (int plugin_type, char *scriptname)
}
/*
+ * plugins_msg_handler_add: add a message handler
+ */
+
+void
+plugins_msg_handler_add (int plugin_type, char *message, char *function)
+{
+ t_plugin_handler *new_plugin_handler;
+
+ new_plugin_handler = (t_plugin_handler *)malloc (sizeof (t_plugin_handler));
+ if (new_plugin_handler)
+ {
+ new_plugin_handler->plugin_type = plugin_type;
+ new_plugin_handler->name = strdup (message);
+ new_plugin_handler->function_name = strdup (function);
+
+ /* add new handler to list */
+ new_plugin_handler->prev_handler = last_plugin_msg_handler;
+ new_plugin_handler->next_handler = NULL;
+ if (plugins_msg_handlers)
+ last_plugin_msg_handler->next_handler = new_plugin_handler;
+ else
+ plugins_msg_handlers = new_plugin_handler;
+ last_plugin_msg_handler = new_plugin_handler;
+ }
+ else
+ gui_printf (NULL,
+ _("%s unable to add handler for \"%s\" message (not enough memory)\n"),
+ WEECHAT_ERROR, message);
+}
+
+/*
+ * plugins_msg_handler_free: free message handler
+ */
+
+void
+plugins_msg_handler_free (t_plugin_handler *ptr_plugin_handler)
+{
+ t_plugin_handler *new_plugins_msg_handlers;
+
+ /* remove handler from list */
+ if (last_plugin_msg_handler == ptr_plugin_handler)
+ last_plugin_msg_handler = ptr_plugin_handler->prev_handler;
+ if (ptr_plugin_handler->prev_handler)
+ {
+ (ptr_plugin_handler->prev_handler)->next_handler = ptr_plugin_handler->next_handler;
+ new_plugins_msg_handlers = plugins_msg_handlers;
+ }
+ else
+ new_plugins_msg_handlers = ptr_plugin_handler->next_handler;
+
+ if (ptr_plugin_handler->next_handler)
+ (ptr_plugin_handler->next_handler)->prev_handler = ptr_plugin_handler->prev_handler;
+
+ /* free data */
+ free (ptr_plugin_handler->name);
+ free (ptr_plugin_handler->function_name);
+ free (ptr_plugin_handler);
+ plugins_msg_handlers = new_plugins_msg_handlers;
+}
+
+/*
+ * plugins_remove_all_msg_handlers: remove all message handlers
+ */
+
+void
+plugins_msg_handlers_free_all ()
+{
+ while (plugins_msg_handlers)
+ plugins_msg_handler_free (plugins_msg_handlers);
+}
+
+/*
* plugins_end: shutdown plugin interface
*/
void
plugins_end ()
{
+ plugins_msg_handlers_free_all ();
+
#ifdef PLUGIN_PERL
wee_perl_end();
#endif
diff --git a/src/plugins/plugins.h b/src/plugins/plugins.h
index fcd6309f7..68ea44c27 100644
--- a/src/plugins/plugins.h
+++ b/src/plugins/plugins.h
@@ -20,17 +20,30 @@
*/
-#ifndef __WEECHAT_PLUGIN_H
-#define __WEECHAT_PLUGIN_H 1
+#ifndef __WEECHAT_PLUGINS_H
+#define __WEECHAT_PLUGINS_H 1
#define PLUGIN_UNKNOWN 0
#define PLUGIN_PERL 1
#define PLUGIN_PYTHON 2
#define PLUGIN_RUBY 3
+typedef struct t_plugin_handler t_plugin_handler;
+
+struct t_plugin_handler
+{
+ int plugin_type; /* plugin type (Perl, Python, Ruby) */
+ char *name; /* name (message or command) */
+ char *function_name; /* name of function (handler) */
+ t_plugin_handler *prev_handler; /* link to previous handler */
+ t_plugin_handler *next_handler; /* link to next handler */
+};
+
+
extern void plugins_init ();
extern void plugins_load (int, char *);
extern void plugins_unload (int, char *);
+extern void plugins_msg_handler_add (int, char *, char *);
extern void plugins_end ();
#endif /* plugins.h */