mirror of
https://github.com/weechat/weechat.git
synced 2026-07-06 09:43:13 +02:00
- Perl unloading is now ok (unload all scripts),
- /perl prints all Perl scripts, - error if registering 2 Perl scripts with same (internal) name.
This commit is contained in:
+71
-16
@@ -61,9 +61,8 @@ t_weechat_command weechat_commands[] =
|
||||
N_("[command]"), N_("command: name of a WeeChat or IRC command"),
|
||||
0, 1, weechat_cmd_help, NULL },
|
||||
{ "perl", N_("list/load/unload Perl scripts"),
|
||||
N_("[load filename] | [unload scriptname]"),
|
||||
N_("[load filename] | [unload]"),
|
||||
N_("filename: Perl script (file) to load\n"
|
||||
"scriptname: name of script to unload\n"
|
||||
"Without argument, /perl command lists all loaded Perl scripts."),
|
||||
0, 2, weechat_cmd_perl, NULL },
|
||||
{ "server", N_("list, add or remove servers"),
|
||||
@@ -990,31 +989,85 @@ weechat_cmd_help (int argc, char **argv)
|
||||
int
|
||||
weechat_cmd_perl (int argc, char **argv)
|
||||
{
|
||||
#ifdef PLUGINS
|
||||
t_plugin_script *ptr_plugin_script;
|
||||
t_plugin_handler *ptr_plugin_handler;
|
||||
int handler_found;
|
||||
|
||||
#ifdef PLUGIN_PERL
|
||||
switch (argc)
|
||||
{
|
||||
case 0:
|
||||
/* list all Perl scripts */
|
||||
/* TODO: get list and display it */
|
||||
/* list registered Perl scripts */
|
||||
gui_printf (NULL, _("Registered Perl scripts:\n"));
|
||||
if (perl_scripts)
|
||||
{
|
||||
for (ptr_plugin_script = perl_scripts; ptr_plugin_script;
|
||||
ptr_plugin_script = ptr_plugin_script->next_script)
|
||||
{
|
||||
gui_printf (NULL, " %s v%s%s%s\n",
|
||||
ptr_plugin_script->name,
|
||||
ptr_plugin_script->version,
|
||||
(ptr_plugin_script->description[0]) ? " - " : "",
|
||||
ptr_plugin_script->description);
|
||||
}
|
||||
}
|
||||
else
|
||||
gui_printf (NULL, _(" (none)\n"));
|
||||
|
||||
/* list Perl message handlers */
|
||||
gui_printf (NULL, _("Perl message handlers:\n"));
|
||||
handler_found = 0;
|
||||
for (ptr_plugin_handler = plugin_msg_handlers; ptr_plugin_handler;
|
||||
ptr_plugin_handler = ptr_plugin_handler->next_handler)
|
||||
{
|
||||
if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PERL)
|
||||
{
|
||||
handler_found = 1;
|
||||
gui_printf (NULL, " IRC(%s) => Perl(%s)\n",
|
||||
ptr_plugin_handler->name,
|
||||
ptr_plugin_handler->function_name);
|
||||
}
|
||||
}
|
||||
if (!handler_found)
|
||||
gui_printf (NULL, _(" (none)\n"));
|
||||
|
||||
/* list Perl command handlers */
|
||||
gui_printf (NULL, _("Perl command handlers:\n"));
|
||||
handler_found = 0;
|
||||
for (ptr_plugin_handler = plugin_cmd_handlers; ptr_plugin_handler;
|
||||
ptr_plugin_handler = ptr_plugin_handler->next_handler)
|
||||
{
|
||||
if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PERL)
|
||||
{
|
||||
handler_found = 1;
|
||||
gui_printf (NULL, " Command /%s => Perl(%s)\n",
|
||||
ptr_plugin_handler->name,
|
||||
ptr_plugin_handler->function_name);
|
||||
}
|
||||
}
|
||||
if (!handler_found)
|
||||
gui_printf (NULL, _(" (none)\n"));
|
||||
|
||||
break;
|
||||
case 1:
|
||||
if (strcmp (argv[0], "unload") == 0)
|
||||
{
|
||||
/* unload all Perl scripts */
|
||||
plugin_unload (PLUGIN_TYPE_PERL, NULL);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (strcmp (argv[0], "load") == 0)
|
||||
{
|
||||
/* load Perl script */
|
||||
plugin_load (PLUGIN_PERL, argv[1]);
|
||||
plugin_load (PLUGIN_TYPE_PERL, argv[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp (argv[0], "unload") == 0)
|
||||
{
|
||||
/* unload Perl script */
|
||||
}
|
||||
else
|
||||
{
|
||||
gui_printf (NULL,
|
||||
_("%s unknown option for \"%s\" command\n"),
|
||||
WEECHAT_ERROR, "perl");
|
||||
}
|
||||
gui_printf (NULL,
|
||||
_("%s unknown option for \"%s\" command\n"),
|
||||
WEECHAT_ERROR, "perl");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -1030,7 +1083,9 @@ weechat_cmd_perl (int argc, char **argv)
|
||||
/* make gcc happy */
|
||||
(void) argc;
|
||||
(void) argv;
|
||||
#endif
|
||||
#endif /* PLUGIN_PERL */
|
||||
|
||||
#endif /* PLUGINS */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+58
-36
@@ -39,8 +39,8 @@
|
||||
|
||||
static PerlInterpreter *my_perl = NULL;
|
||||
|
||||
t_perl_script *perl_scripts = NULL;
|
||||
t_perl_script *last_perl_script = NULL;
|
||||
t_plugin_script *perl_scripts = NULL;
|
||||
t_plugin_script *last_perl_script = NULL;
|
||||
|
||||
extern void boot_DynaLoader (pTHX_ CV* cv);
|
||||
|
||||
@@ -53,7 +53,7 @@ static XS (XS_IRC_register)
|
||||
{
|
||||
char *name, *version, *shutdown_func, *description;
|
||||
int integer;
|
||||
t_perl_script *new_perl_script;
|
||||
t_plugin_script *ptr_perl_script, *perl_script_found, *new_perl_script;
|
||||
dXSARGS;
|
||||
|
||||
name = SvPV (ST (0), integer);
|
||||
@@ -61,30 +61,53 @@ static XS (XS_IRC_register)
|
||||
shutdown_func = SvPV (ST (2), integer);
|
||||
description = SvPV (ST (3), integer);
|
||||
|
||||
new_perl_script = (t_perl_script *)malloc (sizeof (t_perl_script));
|
||||
if (new_perl_script)
|
||||
perl_script_found = NULL;
|
||||
for (ptr_perl_script = perl_scripts; ptr_perl_script;
|
||||
ptr_perl_script = ptr_perl_script->next_script)
|
||||
{
|
||||
new_perl_script->name = strdup (name);
|
||||
new_perl_script->version = strdup (version);
|
||||
new_perl_script->shutdown_func = strdup (shutdown_func);
|
||||
new_perl_script->description = strdup (description);
|
||||
|
||||
/* 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);
|
||||
if (strcasecmp (ptr_perl_script->name, name) == 0)
|
||||
{
|
||||
perl_script_found = ptr_perl_script;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (perl_script_found)
|
||||
{
|
||||
/* error: another scripts already exists with this name! */
|
||||
gui_printf (NULL,
|
||||
_("Perl error: unable to register Perl script \"%s\" (another script "
|
||||
"already exists with this name)\n"),
|
||||
name);
|
||||
}
|
||||
else
|
||||
gui_printf (gui_current_window,
|
||||
_("%s unable to load Perl script \"%s\" (not enough memory)\n"),
|
||||
WEECHAT_ERROR, name);
|
||||
{
|
||||
/* registering script */
|
||||
new_perl_script = (t_plugin_script *)malloc (sizeof (t_plugin_script));
|
||||
if (new_perl_script)
|
||||
{
|
||||
new_perl_script->name = strdup (name);
|
||||
new_perl_script->version = strdup (version);
|
||||
new_perl_script->shutdown_func = strdup (shutdown_func);
|
||||
new_perl_script->description = strdup (description);
|
||||
|
||||
/* 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\" (not enough memory)\n"),
|
||||
WEECHAT_ERROR, name);
|
||||
}
|
||||
XST_mPV (0, VERSION);
|
||||
XSRETURN (1);
|
||||
}
|
||||
@@ -102,9 +125,7 @@ static XS (XS_IRC_print)
|
||||
for (i = 0; i < items; i++)
|
||||
{
|
||||
message = SvPV (ST (i), integer);
|
||||
gui_printf (gui_current_window, "%s%s",
|
||||
message,
|
||||
(message[strlen (message) - 1] == '\n') ? "" : "\n");
|
||||
gui_printf (gui_current_window, "%s", message);
|
||||
}
|
||||
|
||||
XSRETURN_EMPTY;
|
||||
@@ -123,7 +144,7 @@ static XS (XS_IRC_add_message_handler)
|
||||
name = SvPV (ST (0), integer);
|
||||
function = SvPV (ST (1), integer);
|
||||
plugin_handler_add (&plugin_msg_handlers, &last_plugin_msg_handler,
|
||||
PLUGIN_PERL, name, function);
|
||||
PLUGIN_TYPE_PERL, name, function);
|
||||
XSRETURN_EMPTY;
|
||||
}
|
||||
|
||||
@@ -150,7 +171,7 @@ static XS (XS_IRC_add_command_handler)
|
||||
}
|
||||
else
|
||||
plugin_handler_add (&plugin_cmd_handlers, &last_plugin_cmd_handler,
|
||||
PLUGIN_PERL, name, function);
|
||||
PLUGIN_TYPE_PERL, name, function);
|
||||
XSRETURN_EMPTY;
|
||||
}
|
||||
|
||||
@@ -220,10 +241,10 @@ wee_perl_init ()
|
||||
* wee_perl_search: search a (loaded) Perl script by name
|
||||
*/
|
||||
|
||||
t_perl_script *
|
||||
t_plugin_script *
|
||||
wee_perl_search (char *name)
|
||||
{
|
||||
t_perl_script *ptr_perl_script;
|
||||
t_plugin_script *ptr_perl_script;
|
||||
|
||||
for (ptr_perl_script = perl_scripts; ptr_perl_script;
|
||||
ptr_perl_script = ptr_perl_script->next_script)
|
||||
@@ -262,7 +283,7 @@ wee_perl_exec (char *function, char *arguments)
|
||||
return_code = 1;
|
||||
if (SvTRUE (sv))
|
||||
{
|
||||
gui_printf (gui_current_window,
|
||||
gui_printf (NULL,
|
||||
_("Perl error: %s\n"),
|
||||
SvPV (sv, count));
|
||||
POPs;
|
||||
@@ -271,7 +292,7 @@ wee_perl_exec (char *function, char *arguments)
|
||||
{
|
||||
if (count != 1)
|
||||
{
|
||||
gui_printf (gui_current_window,
|
||||
gui_printf (NULL,
|
||||
_("Perl error: too much values from \"%s\" (%d). Expected: 1.\n"),
|
||||
function, count);
|
||||
}
|
||||
@@ -303,9 +324,9 @@ wee_perl_load (char *filename)
|
||||
*/
|
||||
|
||||
void
|
||||
wee_perl_script_free (t_perl_script *ptr_perl_script)
|
||||
wee_perl_script_free (t_plugin_script *ptr_perl_script)
|
||||
{
|
||||
t_perl_script *new_perl_scripts;
|
||||
t_plugin_script *new_perl_scripts;
|
||||
|
||||
/* remove script from list */
|
||||
if (last_perl_script == ptr_perl_script)
|
||||
@@ -339,7 +360,7 @@ wee_perl_script_free (t_perl_script *ptr_perl_script)
|
||||
*/
|
||||
|
||||
void
|
||||
wee_perl_unload (t_perl_script *ptr_perl_script)
|
||||
wee_perl_unload (t_plugin_script *ptr_perl_script)
|
||||
{
|
||||
if (ptr_perl_script)
|
||||
{
|
||||
@@ -360,6 +381,7 @@ wee_perl_unload (t_perl_script *ptr_perl_script)
|
||||
void
|
||||
wee_perl_unload_all ()
|
||||
{
|
||||
wee_log_printf (_("unloading all Perl scripts...\n"));
|
||||
while (perl_scripts)
|
||||
wee_perl_unload (perl_scripts);
|
||||
}
|
||||
|
||||
@@ -23,23 +23,13 @@
|
||||
#ifndef __WEECHAT_PERL_H
|
||||
#define __WEECHAT_PERL_H 1
|
||||
|
||||
typedef struct t_perl_script t_perl_script;
|
||||
|
||||
struct t_perl_script
|
||||
{
|
||||
char *name; /* name of 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 */
|
||||
};
|
||||
#include "../plugins.h"
|
||||
|
||||
extern void wee_perl_init ();
|
||||
extern t_perl_script *wee_perl_search (char *);
|
||||
extern t_plugin_script *wee_perl_search (char *);
|
||||
extern int wee_perl_exec (char *, char *);
|
||||
extern int wee_perl_load (char *);
|
||||
extern void wee_perl_unload (t_perl_script *);
|
||||
extern void wee_perl_unload (t_plugin_script *);
|
||||
extern void wee_perl_unload_all ();
|
||||
extern void wee_perl_end ();
|
||||
|
||||
|
||||
+58
-25
@@ -81,31 +81,6 @@ plugin_load (int plugin_type, char *filename)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_unload: unload a plugin
|
||||
*/
|
||||
|
||||
void
|
||||
plugin_unload (int plugin_type, char *scriptname)
|
||||
{
|
||||
#ifdef PLUGINS
|
||||
switch (plugin_type)
|
||||
{
|
||||
case PLUGIN_TYPE_PERL:
|
||||
#ifdef PLUGIN_PERL
|
||||
wee_perl_unload (wee_perl_search (scriptname));
|
||||
#endif
|
||||
break;
|
||||
case PLUGIN_TYPE_PYTHON:
|
||||
/* TODO: load Python script */
|
||||
break;
|
||||
case PLUGIN_TYPE_RUBY:
|
||||
/* TODO: load Ruby script */
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_handler_search: look for message/command handler
|
||||
*/
|
||||
@@ -204,6 +179,32 @@ plugin_handler_free_all (t_plugin_handler **plugin_handlers,
|
||||
*plugin_handlers);
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_handler_free_all_type: remove all message/command handlers for one type
|
||||
*/
|
||||
|
||||
void
|
||||
plugin_handler_free_all_type (t_plugin_handler **plugin_handlers,
|
||||
t_plugin_handler **last_plugin_handler,
|
||||
int plugin_type)
|
||||
{
|
||||
t_plugin_handler *ptr_plugin_handler, *new_plugin_handler;
|
||||
|
||||
ptr_plugin_handler = *plugin_handlers;
|
||||
while (ptr_plugin_handler)
|
||||
{
|
||||
if (ptr_plugin_handler->plugin_type == plugin_type)
|
||||
{
|
||||
new_plugin_handler = ptr_plugin_handler->next_handler;
|
||||
plugin_handler_free (plugin_handlers, last_plugin_handler,
|
||||
ptr_plugin_handler);
|
||||
ptr_plugin_handler = new_plugin_handler;
|
||||
}
|
||||
else
|
||||
ptr_plugin_handler = ptr_plugin_handler->next_handler;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_event_msg: IRC message received => call all handlers for this message
|
||||
*/
|
||||
@@ -266,6 +267,38 @@ plugin_exec_command (char *user_command, char *arguments)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_unload: unload all scripts for a plugin type
|
||||
*/
|
||||
|
||||
void
|
||||
plugin_unload (int plugin_type, char *scriptname)
|
||||
{
|
||||
#ifdef PLUGINS
|
||||
switch (plugin_type)
|
||||
{
|
||||
case PLUGIN_TYPE_PERL:
|
||||
#ifdef PLUGIN_PERL
|
||||
wee_perl_unload_all ();
|
||||
/* impossible to unload only one Perl script */
|
||||
plugin_handler_free_all_type (&plugin_msg_handlers,
|
||||
&last_plugin_msg_handler,
|
||||
PLUGIN_TYPE_PERL);
|
||||
plugin_handler_free_all_type (&plugin_cmd_handlers,
|
||||
&last_plugin_cmd_handler,
|
||||
PLUGIN_TYPE_PERL);
|
||||
#endif
|
||||
break;
|
||||
case PLUGIN_TYPE_PYTHON:
|
||||
/* TODO: unload Python scripts */
|
||||
break;
|
||||
case PLUGIN_TYPE_RUBY:
|
||||
/* TODO: unload Ruby scripts */
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_end: shutdown plugin interface
|
||||
*/
|
||||
|
||||
+18
-4
@@ -23,10 +23,21 @@
|
||||
#ifndef __WEECHAT_PLUGINS_H
|
||||
#define __WEECHAT_PLUGINS_H 1
|
||||
|
||||
#define PLUGIN_TYPE_UNKNOWN 0
|
||||
#define PLUGIN_TYPE_PERL 1
|
||||
#define PLUGIN_TYPE_PYTHON 2
|
||||
#define PLUGIN_TYPE_RUBY 3
|
||||
#define PLUGIN_TYPE_PERL 0
|
||||
#define PLUGIN_TYPE_PYTHON 1
|
||||
#define PLUGIN_TYPE_RUBY 2
|
||||
|
||||
typedef struct t_plugin_script t_plugin_script;
|
||||
|
||||
struct t_plugin_script
|
||||
{
|
||||
char *name; /* name of script */
|
||||
char *version; /* version of script */
|
||||
char *shutdown_func; /* function when script ends */
|
||||
char *description; /* description of script */
|
||||
t_plugin_script *prev_script; /* link to previous Perl script */
|
||||
t_plugin_script *next_script; /* link to next Perl script */
|
||||
};
|
||||
|
||||
typedef struct t_plugin_handler t_plugin_handler;
|
||||
|
||||
@@ -46,6 +57,9 @@ extern t_plugin_handler *last_plugin_msg_handler;
|
||||
extern t_plugin_handler *plugin_cmd_handlers;
|
||||
extern t_plugin_handler *last_plugin_cmd_handler;
|
||||
|
||||
#ifdef PLUGIN_PERL
|
||||
extern t_plugin_script *perl_scripts;
|
||||
#endif
|
||||
|
||||
extern void plugin_init ();
|
||||
extern void plugin_load (int, char *);
|
||||
|
||||
@@ -61,9 +61,8 @@ t_weechat_command weechat_commands[] =
|
||||
N_("[command]"), N_("command: name of a WeeChat or IRC command"),
|
||||
0, 1, weechat_cmd_help, NULL },
|
||||
{ "perl", N_("list/load/unload Perl scripts"),
|
||||
N_("[load filename] | [unload scriptname]"),
|
||||
N_("[load filename] | [unload]"),
|
||||
N_("filename: Perl script (file) to load\n"
|
||||
"scriptname: name of script to unload\n"
|
||||
"Without argument, /perl command lists all loaded Perl scripts."),
|
||||
0, 2, weechat_cmd_perl, NULL },
|
||||
{ "server", N_("list, add or remove servers"),
|
||||
@@ -990,31 +989,85 @@ weechat_cmd_help (int argc, char **argv)
|
||||
int
|
||||
weechat_cmd_perl (int argc, char **argv)
|
||||
{
|
||||
#ifdef PLUGINS
|
||||
t_plugin_script *ptr_plugin_script;
|
||||
t_plugin_handler *ptr_plugin_handler;
|
||||
int handler_found;
|
||||
|
||||
#ifdef PLUGIN_PERL
|
||||
switch (argc)
|
||||
{
|
||||
case 0:
|
||||
/* list all Perl scripts */
|
||||
/* TODO: get list and display it */
|
||||
/* list registered Perl scripts */
|
||||
gui_printf (NULL, _("Registered Perl scripts:\n"));
|
||||
if (perl_scripts)
|
||||
{
|
||||
for (ptr_plugin_script = perl_scripts; ptr_plugin_script;
|
||||
ptr_plugin_script = ptr_plugin_script->next_script)
|
||||
{
|
||||
gui_printf (NULL, " %s v%s%s%s\n",
|
||||
ptr_plugin_script->name,
|
||||
ptr_plugin_script->version,
|
||||
(ptr_plugin_script->description[0]) ? " - " : "",
|
||||
ptr_plugin_script->description);
|
||||
}
|
||||
}
|
||||
else
|
||||
gui_printf (NULL, _(" (none)\n"));
|
||||
|
||||
/* list Perl message handlers */
|
||||
gui_printf (NULL, _("Perl message handlers:\n"));
|
||||
handler_found = 0;
|
||||
for (ptr_plugin_handler = plugin_msg_handlers; ptr_plugin_handler;
|
||||
ptr_plugin_handler = ptr_plugin_handler->next_handler)
|
||||
{
|
||||
if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PERL)
|
||||
{
|
||||
handler_found = 1;
|
||||
gui_printf (NULL, " IRC(%s) => Perl(%s)\n",
|
||||
ptr_plugin_handler->name,
|
||||
ptr_plugin_handler->function_name);
|
||||
}
|
||||
}
|
||||
if (!handler_found)
|
||||
gui_printf (NULL, _(" (none)\n"));
|
||||
|
||||
/* list Perl command handlers */
|
||||
gui_printf (NULL, _("Perl command handlers:\n"));
|
||||
handler_found = 0;
|
||||
for (ptr_plugin_handler = plugin_cmd_handlers; ptr_plugin_handler;
|
||||
ptr_plugin_handler = ptr_plugin_handler->next_handler)
|
||||
{
|
||||
if (ptr_plugin_handler->plugin_type == PLUGIN_TYPE_PERL)
|
||||
{
|
||||
handler_found = 1;
|
||||
gui_printf (NULL, " Command /%s => Perl(%s)\n",
|
||||
ptr_plugin_handler->name,
|
||||
ptr_plugin_handler->function_name);
|
||||
}
|
||||
}
|
||||
if (!handler_found)
|
||||
gui_printf (NULL, _(" (none)\n"));
|
||||
|
||||
break;
|
||||
case 1:
|
||||
if (strcmp (argv[0], "unload") == 0)
|
||||
{
|
||||
/* unload all Perl scripts */
|
||||
plugin_unload (PLUGIN_TYPE_PERL, NULL);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (strcmp (argv[0], "load") == 0)
|
||||
{
|
||||
/* load Perl script */
|
||||
plugin_load (PLUGIN_PERL, argv[1]);
|
||||
plugin_load (PLUGIN_TYPE_PERL, argv[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strcmp (argv[0], "unload") == 0)
|
||||
{
|
||||
/* unload Perl script */
|
||||
}
|
||||
else
|
||||
{
|
||||
gui_printf (NULL,
|
||||
_("%s unknown option for \"%s\" command\n"),
|
||||
WEECHAT_ERROR, "perl");
|
||||
}
|
||||
gui_printf (NULL,
|
||||
_("%s unknown option for \"%s\" command\n"),
|
||||
WEECHAT_ERROR, "perl");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -1030,7 +1083,9 @@ weechat_cmd_perl (int argc, char **argv)
|
||||
/* make gcc happy */
|
||||
(void) argc;
|
||||
(void) argv;
|
||||
#endif
|
||||
#endif /* PLUGIN_PERL */
|
||||
|
||||
#endif /* PLUGINS */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
|
||||
static PerlInterpreter *my_perl = NULL;
|
||||
|
||||
t_perl_script *perl_scripts = NULL;
|
||||
t_perl_script *last_perl_script = NULL;
|
||||
t_plugin_script *perl_scripts = NULL;
|
||||
t_plugin_script *last_perl_script = NULL;
|
||||
|
||||
extern void boot_DynaLoader (pTHX_ CV* cv);
|
||||
|
||||
@@ -53,7 +53,7 @@ static XS (XS_IRC_register)
|
||||
{
|
||||
char *name, *version, *shutdown_func, *description;
|
||||
int integer;
|
||||
t_perl_script *new_perl_script;
|
||||
t_plugin_script *ptr_perl_script, *perl_script_found, *new_perl_script;
|
||||
dXSARGS;
|
||||
|
||||
name = SvPV (ST (0), integer);
|
||||
@@ -61,30 +61,53 @@ static XS (XS_IRC_register)
|
||||
shutdown_func = SvPV (ST (2), integer);
|
||||
description = SvPV (ST (3), integer);
|
||||
|
||||
new_perl_script = (t_perl_script *)malloc (sizeof (t_perl_script));
|
||||
if (new_perl_script)
|
||||
perl_script_found = NULL;
|
||||
for (ptr_perl_script = perl_scripts; ptr_perl_script;
|
||||
ptr_perl_script = ptr_perl_script->next_script)
|
||||
{
|
||||
new_perl_script->name = strdup (name);
|
||||
new_perl_script->version = strdup (version);
|
||||
new_perl_script->shutdown_func = strdup (shutdown_func);
|
||||
new_perl_script->description = strdup (description);
|
||||
|
||||
/* 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);
|
||||
if (strcasecmp (ptr_perl_script->name, name) == 0)
|
||||
{
|
||||
perl_script_found = ptr_perl_script;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (perl_script_found)
|
||||
{
|
||||
/* error: another scripts already exists with this name! */
|
||||
gui_printf (NULL,
|
||||
_("Perl error: unable to register Perl script \"%s\" (another script "
|
||||
"already exists with this name)\n"),
|
||||
name);
|
||||
}
|
||||
else
|
||||
gui_printf (gui_current_window,
|
||||
_("%s unable to load Perl script \"%s\" (not enough memory)\n"),
|
||||
WEECHAT_ERROR, name);
|
||||
{
|
||||
/* registering script */
|
||||
new_perl_script = (t_plugin_script *)malloc (sizeof (t_plugin_script));
|
||||
if (new_perl_script)
|
||||
{
|
||||
new_perl_script->name = strdup (name);
|
||||
new_perl_script->version = strdup (version);
|
||||
new_perl_script->shutdown_func = strdup (shutdown_func);
|
||||
new_perl_script->description = strdup (description);
|
||||
|
||||
/* 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\" (not enough memory)\n"),
|
||||
WEECHAT_ERROR, name);
|
||||
}
|
||||
XST_mPV (0, VERSION);
|
||||
XSRETURN (1);
|
||||
}
|
||||
@@ -102,9 +125,7 @@ static XS (XS_IRC_print)
|
||||
for (i = 0; i < items; i++)
|
||||
{
|
||||
message = SvPV (ST (i), integer);
|
||||
gui_printf (gui_current_window, "%s%s",
|
||||
message,
|
||||
(message[strlen (message) - 1] == '\n') ? "" : "\n");
|
||||
gui_printf (gui_current_window, "%s", message);
|
||||
}
|
||||
|
||||
XSRETURN_EMPTY;
|
||||
@@ -123,7 +144,7 @@ static XS (XS_IRC_add_message_handler)
|
||||
name = SvPV (ST (0), integer);
|
||||
function = SvPV (ST (1), integer);
|
||||
plugin_handler_add (&plugin_msg_handlers, &last_plugin_msg_handler,
|
||||
PLUGIN_PERL, name, function);
|
||||
PLUGIN_TYPE_PERL, name, function);
|
||||
XSRETURN_EMPTY;
|
||||
}
|
||||
|
||||
@@ -150,7 +171,7 @@ static XS (XS_IRC_add_command_handler)
|
||||
}
|
||||
else
|
||||
plugin_handler_add (&plugin_cmd_handlers, &last_plugin_cmd_handler,
|
||||
PLUGIN_PERL, name, function);
|
||||
PLUGIN_TYPE_PERL, name, function);
|
||||
XSRETURN_EMPTY;
|
||||
}
|
||||
|
||||
@@ -220,10 +241,10 @@ wee_perl_init ()
|
||||
* wee_perl_search: search a (loaded) Perl script by name
|
||||
*/
|
||||
|
||||
t_perl_script *
|
||||
t_plugin_script *
|
||||
wee_perl_search (char *name)
|
||||
{
|
||||
t_perl_script *ptr_perl_script;
|
||||
t_plugin_script *ptr_perl_script;
|
||||
|
||||
for (ptr_perl_script = perl_scripts; ptr_perl_script;
|
||||
ptr_perl_script = ptr_perl_script->next_script)
|
||||
@@ -262,7 +283,7 @@ wee_perl_exec (char *function, char *arguments)
|
||||
return_code = 1;
|
||||
if (SvTRUE (sv))
|
||||
{
|
||||
gui_printf (gui_current_window,
|
||||
gui_printf (NULL,
|
||||
_("Perl error: %s\n"),
|
||||
SvPV (sv, count));
|
||||
POPs;
|
||||
@@ -271,7 +292,7 @@ wee_perl_exec (char *function, char *arguments)
|
||||
{
|
||||
if (count != 1)
|
||||
{
|
||||
gui_printf (gui_current_window,
|
||||
gui_printf (NULL,
|
||||
_("Perl error: too much values from \"%s\" (%d). Expected: 1.\n"),
|
||||
function, count);
|
||||
}
|
||||
@@ -303,9 +324,9 @@ wee_perl_load (char *filename)
|
||||
*/
|
||||
|
||||
void
|
||||
wee_perl_script_free (t_perl_script *ptr_perl_script)
|
||||
wee_perl_script_free (t_plugin_script *ptr_perl_script)
|
||||
{
|
||||
t_perl_script *new_perl_scripts;
|
||||
t_plugin_script *new_perl_scripts;
|
||||
|
||||
/* remove script from list */
|
||||
if (last_perl_script == ptr_perl_script)
|
||||
@@ -339,7 +360,7 @@ wee_perl_script_free (t_perl_script *ptr_perl_script)
|
||||
*/
|
||||
|
||||
void
|
||||
wee_perl_unload (t_perl_script *ptr_perl_script)
|
||||
wee_perl_unload (t_plugin_script *ptr_perl_script)
|
||||
{
|
||||
if (ptr_perl_script)
|
||||
{
|
||||
@@ -360,6 +381,7 @@ wee_perl_unload (t_perl_script *ptr_perl_script)
|
||||
void
|
||||
wee_perl_unload_all ()
|
||||
{
|
||||
wee_log_printf (_("unloading all Perl scripts...\n"));
|
||||
while (perl_scripts)
|
||||
wee_perl_unload (perl_scripts);
|
||||
}
|
||||
|
||||
@@ -23,23 +23,13 @@
|
||||
#ifndef __WEECHAT_PERL_H
|
||||
#define __WEECHAT_PERL_H 1
|
||||
|
||||
typedef struct t_perl_script t_perl_script;
|
||||
|
||||
struct t_perl_script
|
||||
{
|
||||
char *name; /* name of 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 */
|
||||
};
|
||||
#include "../plugins.h"
|
||||
|
||||
extern void wee_perl_init ();
|
||||
extern t_perl_script *wee_perl_search (char *);
|
||||
extern t_plugin_script *wee_perl_search (char *);
|
||||
extern int wee_perl_exec (char *, char *);
|
||||
extern int wee_perl_load (char *);
|
||||
extern void wee_perl_unload (t_perl_script *);
|
||||
extern void wee_perl_unload (t_plugin_script *);
|
||||
extern void wee_perl_unload_all ();
|
||||
extern void wee_perl_end ();
|
||||
|
||||
|
||||
@@ -81,31 +81,6 @@ plugin_load (int plugin_type, char *filename)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_unload: unload a plugin
|
||||
*/
|
||||
|
||||
void
|
||||
plugin_unload (int plugin_type, char *scriptname)
|
||||
{
|
||||
#ifdef PLUGINS
|
||||
switch (plugin_type)
|
||||
{
|
||||
case PLUGIN_TYPE_PERL:
|
||||
#ifdef PLUGIN_PERL
|
||||
wee_perl_unload (wee_perl_search (scriptname));
|
||||
#endif
|
||||
break;
|
||||
case PLUGIN_TYPE_PYTHON:
|
||||
/* TODO: load Python script */
|
||||
break;
|
||||
case PLUGIN_TYPE_RUBY:
|
||||
/* TODO: load Ruby script */
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_handler_search: look for message/command handler
|
||||
*/
|
||||
@@ -204,6 +179,32 @@ plugin_handler_free_all (t_plugin_handler **plugin_handlers,
|
||||
*plugin_handlers);
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_handler_free_all_type: remove all message/command handlers for one type
|
||||
*/
|
||||
|
||||
void
|
||||
plugin_handler_free_all_type (t_plugin_handler **plugin_handlers,
|
||||
t_plugin_handler **last_plugin_handler,
|
||||
int plugin_type)
|
||||
{
|
||||
t_plugin_handler *ptr_plugin_handler, *new_plugin_handler;
|
||||
|
||||
ptr_plugin_handler = *plugin_handlers;
|
||||
while (ptr_plugin_handler)
|
||||
{
|
||||
if (ptr_plugin_handler->plugin_type == plugin_type)
|
||||
{
|
||||
new_plugin_handler = ptr_plugin_handler->next_handler;
|
||||
plugin_handler_free (plugin_handlers, last_plugin_handler,
|
||||
ptr_plugin_handler);
|
||||
ptr_plugin_handler = new_plugin_handler;
|
||||
}
|
||||
else
|
||||
ptr_plugin_handler = ptr_plugin_handler->next_handler;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_event_msg: IRC message received => call all handlers for this message
|
||||
*/
|
||||
@@ -266,6 +267,38 @@ plugin_exec_command (char *user_command, char *arguments)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_unload: unload all scripts for a plugin type
|
||||
*/
|
||||
|
||||
void
|
||||
plugin_unload (int plugin_type, char *scriptname)
|
||||
{
|
||||
#ifdef PLUGINS
|
||||
switch (plugin_type)
|
||||
{
|
||||
case PLUGIN_TYPE_PERL:
|
||||
#ifdef PLUGIN_PERL
|
||||
wee_perl_unload_all ();
|
||||
/* impossible to unload only one Perl script */
|
||||
plugin_handler_free_all_type (&plugin_msg_handlers,
|
||||
&last_plugin_msg_handler,
|
||||
PLUGIN_TYPE_PERL);
|
||||
plugin_handler_free_all_type (&plugin_cmd_handlers,
|
||||
&last_plugin_cmd_handler,
|
||||
PLUGIN_TYPE_PERL);
|
||||
#endif
|
||||
break;
|
||||
case PLUGIN_TYPE_PYTHON:
|
||||
/* TODO: unload Python scripts */
|
||||
break;
|
||||
case PLUGIN_TYPE_RUBY:
|
||||
/* TODO: unload Ruby scripts */
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* plugin_end: shutdown plugin interface
|
||||
*/
|
||||
|
||||
@@ -23,10 +23,21 @@
|
||||
#ifndef __WEECHAT_PLUGINS_H
|
||||
#define __WEECHAT_PLUGINS_H 1
|
||||
|
||||
#define PLUGIN_TYPE_UNKNOWN 0
|
||||
#define PLUGIN_TYPE_PERL 1
|
||||
#define PLUGIN_TYPE_PYTHON 2
|
||||
#define PLUGIN_TYPE_RUBY 3
|
||||
#define PLUGIN_TYPE_PERL 0
|
||||
#define PLUGIN_TYPE_PYTHON 1
|
||||
#define PLUGIN_TYPE_RUBY 2
|
||||
|
||||
typedef struct t_plugin_script t_plugin_script;
|
||||
|
||||
struct t_plugin_script
|
||||
{
|
||||
char *name; /* name of script */
|
||||
char *version; /* version of script */
|
||||
char *shutdown_func; /* function when script ends */
|
||||
char *description; /* description of script */
|
||||
t_plugin_script *prev_script; /* link to previous Perl script */
|
||||
t_plugin_script *next_script; /* link to next Perl script */
|
||||
};
|
||||
|
||||
typedef struct t_plugin_handler t_plugin_handler;
|
||||
|
||||
@@ -46,6 +57,9 @@ extern t_plugin_handler *last_plugin_msg_handler;
|
||||
extern t_plugin_handler *plugin_cmd_handlers;
|
||||
extern t_plugin_handler *last_plugin_cmd_handler;
|
||||
|
||||
#ifdef PLUGIN_PERL
|
||||
extern t_plugin_script *perl_scripts;
|
||||
#endif
|
||||
|
||||
extern void plugin_init ();
|
||||
extern void plugin_load (int, char *);
|
||||
|
||||
Reference in New Issue
Block a user