diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2003-11-16 23:46:48 +0000 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2003-11-16 23:46:48 +0000 |
commit | fe4ca016156b01a1c66410dcecce5a970aa55bd3 (patch) | |
tree | 30ba613649121e70b6cbac2eb6ffaf12d0190433 /src/plugins | |
parent | 62fabde3730fecc487380406d341917dd480c211 (diff) | |
download | weechat-fe4ca016156b01a1c66410dcecce5a970aa55bd3.zip |
Added Perl handlers
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/perl/wee-perl.c | 93 | ||||
-rw-r--r-- | src/plugins/perl/wee-perl.h | 1 | ||||
-rw-r--r-- | src/plugins/plugins.c | 83 | ||||
-rw-r--r-- | src/plugins/plugins.h | 17 |
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 */ |