Added support for a "prefs_change" function in Lua scripts, which is called

when the preferences for the dissector are changed.

This is not a 100% correct implementation at the time because the
prefs_changed function in all Lua plugins will be called whenever
a preference in a single Lua plugin is changed.

svn path=/trunk/; revision=51818
This commit is contained in:
Stig Bjørlykke 2013-09-07 11:27:38 +00:00
parent a8638eec90
commit 7d3d67407c
3 changed files with 44 additions and 8 deletions

View File

@ -184,6 +184,17 @@ static void wslua_init_routine(void) {
}
static int prefs_changed_error_handler(lua_State* LS) {
const gchar* error = lua_tostring(LS,1);
report_failure("Lua: Error During execution of prefs apply callback:\n %s",error);
return 0;
}
void wslua_prefs_changed(void) {
if (L) {
iter_table_and_call(L, WSLUA_PREFS_CHANGED,prefs_changed_error_handler);
}
}
static const char *getF(lua_State *LS _U_, void *ud, size_t *size)
{
@ -381,6 +392,10 @@ int wslua_init(register_cb cb, gpointer client_data) {
lua_newtable (L);
lua_dissectors_table_ref = luaL_ref(L, LUA_REGISTRYINDEX);
/* the preferences apply_cb table (accessible by the user) */
lua_newtable (L);
lua_setglobal(L, WSLUA_PREFS_CHANGED);
/* set running_superuser variable to its proper value */
WSLUA_REG_GLOBAL_BOOL(L,"running_superuser",started_with_special_privs());

View File

@ -63,6 +63,7 @@
*/
#define WSLUA_INIT_ROUTINES "init_routines"
#define WSLUA_PREFS_CHANGED "prefs_changed"
#define LOG_DOMAIN_LUA "wslua"
struct _wslua_tvb {
@ -433,7 +434,7 @@ extern gboolean wslua_optbool(lua_State* L, int n, gboolean def);
extern const gchar* lua_shiftstring(lua_State* L,int idx);
extern void wslua_setfuncs(lua_State *L, const luaL_Reg *l, int nup);
extern int dissect_lua(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, void* data);
extern void wslua_prefs_changed(void);
extern void proto_register_lua(void);
extern GString* lua_register_all_taps(void);
extern void wslua_prime_dfilter(epan_dissect_t *edt);

View File

@ -318,7 +318,7 @@ WSLUA_METAMETHOD Prefs__newindex(lua_State* L) {
pref->label = g_strdup(name);
if (!prefs_p->proto->prefs_module) {
prefs_p->proto->prefs_module = prefs_register_protocol(prefs_p->proto->hfid, NULL);
prefs_p->proto->prefs_module = prefs_register_protocol(prefs_p->proto->hfid, wslua_prefs_changed);
}
switch(pref->type) {
@ -1395,6 +1395,23 @@ static int Proto_get_prefs(lua_State* L) {
return 1;
}
static int Proto_set_prefs_changed(lua_State* L) {
Proto proto = toProto(L,1);
if (lua_isfunction(L,3)) {
/* insert the prefs changed callback into the prefs_changed table */
lua_getglobal(L, WSLUA_PREFS_CHANGED);
lua_replace(L, 1);
lua_pushstring(L,proto->name);
lua_replace(L, 2);
lua_settable(L,1);
} else {
luaL_argerror(L,3,"The prefs of a protocol must be a function");
}
return 0;
}
static int Proto_set_init(lua_State* L) {
Proto proto = toProto(L,1);
@ -1479,23 +1496,26 @@ typedef struct {
static const proto_actions_t proto_actions[] = {
/* WSLUA_ATTRIBUTE Proto_dissector RW The protocol's dissector, a function you define.
The called dissector function will be given three arguments of (1) a Tvb object, (2) a Pinfo object, and (3) a TreeItem object. */
{"dissector",Proto_get_dissector, Proto_set_dissector},
{"dissector", Proto_get_dissector, Proto_set_dissector},
/* WSLUA_ATTRIBUTE Proto_fields RO The Fields Table of this dissector */
{"fields" ,Proto_get_fields, Proto_set_fields},
{"fields", Proto_get_fields, Proto_set_fields},
/* WSLUA_ATTRIBUTE Proto_prefs RO The preferences of this dissector */
{"prefs",Proto_get_prefs,NULL},
{"prefs", Proto_get_prefs, NULL},
/* WSLUA_ATTRIBUTE Proto_prefs WO The preferences changed routine of this dissector, a function you define. */
{"prefs_changed", NULL, Proto_set_prefs_changed},
/* WSLUA_ATTRIBUTE Proto_init WO The init routine of this dissector, a function you define.
The called init function is passed no arguments. */
{"init",NULL,Proto_set_init},
{"init", NULL, Proto_set_init},
/* WSLUA_ATTRIBUTE Proto_name RO The name given to this dissector */
{"name",Proto_get_name,NULL},
{"name", Proto_get_name, NULL},
/* WSLUA_ATTRIBUTE Proto_description RO The description given to this dissector */
{"description",Proto_get_description,NULL},
{"description", Proto_get_description, NULL},
{NULL,NULL,NULL}
};