2006-09-25 01:09:00 +00:00
/*
2006-09-27 17:12:42 +00:00
* wslua_gui . c
2008-04-10 15:26:22 +00:00
*
2008-08-05 21:03:46 +00:00
* ( c ) 2006 , Luis E . Garcia Ontanon < luis @ ontanon . org >
2008-04-10 15:26:22 +00:00
*
2006-10-18 17:59:49 +00:00
* $ Id $
2006-09-25 01:09:00 +00:00
*
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
* Copyright 1998 Gerald Combs
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*/
# include "wslua.h"
2006-10-24 13:16:57 +00:00
/* WSLUA_MODULE Gui GUI support */
2006-10-18 17:59:49 +00:00
2006-09-25 01:09:00 +00:00
static const funnel_ops_t * ops = NULL ;
struct _lua_menu_data {
lua_State * L ;
int cb_ref ;
} ;
static int menu_cb_error_handler ( lua_State * L ) {
const gchar * error = lua_tostring ( L , 1 ) ;
report_failure ( " Lua: Error During execution of Menu Callback: \n %s " , error ) ;
2008-04-10 15:26:22 +00:00
return 0 ;
2006-09-25 01:09:00 +00:00
}
WSLUA_FUNCTION wslua_gui_enabled ( lua_State * L ) { /* Checks whether the GUI facility is enabled. */
2007-01-21 17:05:33 +00:00
lua_pushboolean ( L , GPOINTER_TO_INT ( ops & & ops - > add_button ) ) ;
2006-09-25 01:09:00 +00:00
WSLUA_RETURN ( 1 ) ; /* A boolean: true if it is enabled, false if it isn't. */
}
void lua_menu_callback ( gpointer data ) {
struct _lua_menu_data * md = data ;
2006-10-19 17:02:23 +00:00
lua_State * L = md - > L ;
2008-04-10 15:26:22 +00:00
2006-10-19 17:02:23 +00:00
lua_settop ( L , 0 ) ;
lua_pushcfunction ( L , menu_cb_error_handler ) ;
lua_rawgeti ( L , LUA_REGISTRYINDEX , md - > cb_ref ) ;
2008-04-10 15:26:22 +00:00
2006-10-19 17:02:23 +00:00
switch ( lua_pcall ( L , 0 , 0 , 1 ) ) {
case 0 :
break ;
case LUA_ERRRUN :
g_warning ( " Runtime error while calling menu callback " ) ;
break ;
case LUA_ERRMEM :
g_warning ( " Memory alloc error while calling menu callback " ) ;
break ;
default :
g_assert_not_reached ( ) ;
break ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
return ;
}
2008-04-10 20:07:58 +00:00
WSLUA_FUNCTION wslua_register_menu ( lua_State * L ) { /* Register a menu item in one of the main menus. */
# define WSLUA_ARG_register_menu_NAME 1 /* The name of the menu item. The submenus are to be separated by '/'s. (string) */
# define WSLUA_ARG_register_menu_ACTION 2 /* The function to be called when the menu item is invoked. (function taking no arguments and returning nothing) */
2008-04-10 23:28:15 +00:00
# define WSLUA_OPTARG_register_menu_GROUP 3 /* The menu group into which the menu item is to be inserted. If omitted, defaults to MENU_STAT_GENERIC. One of MENU_STAT (Statistics), MENU_STAT_GENERIC (Statistics, first section), MENU_STAT_CONVERSATION (Statistics/Conversation List), MENU_STAT_ENDPOINT (Statistics/Endpoint List), MENU_STAT_RESPONSE (Statistics/Service Response Time), MENU_STAT_TELEPHONY (Statistics, third section), MENU_ANALYZE (Analyze), MENU_ANALYZE_CONVERSATION (Analyze/Conversation Filter), MENU_TOOLS (Tools). (number) */
2006-09-27 17:12:42 +00:00
2006-09-25 01:09:00 +00:00
const gchar * name = luaL_checkstring ( L , WSLUA_ARG_register_menu_NAME ) ;
struct _lua_menu_data * md ;
gboolean retap = FALSE ;
2008-04-10 20:07:58 +00:00
register_stat_group_t group = ( int ) luaL_optnumber ( L , WSLUA_OPTARG_register_menu_GROUP , REGISTER_STAT_GROUP_GENERIC ) ;
2006-09-27 17:12:42 +00:00
2008-04-17 02:16:39 +00:00
if ( group > REGISTER_TOOLS_GROUP_UNSORTED )
2008-04-10 20:07:58 +00:00
WSLUA_OPTARG_ERROR ( register_menu , GROUP , " must be a defined MENU_* (see init.lua) " ) ;
2006-09-27 17:12:42 +00:00
2006-09-25 01:09:00 +00:00
if ( ! name )
WSLUA_ARG_ERROR ( register_menu , NAME , " must be a string " ) ;
2008-04-10 15:26:22 +00:00
if ( ! lua_isfunction ( L , WSLUA_ARG_register_menu_ACTION ) )
2006-09-25 01:09:00 +00:00
WSLUA_ARG_ERROR ( register_menu , ACTION , " must be a function " ) ;
2006-09-27 17:12:42 +00:00
2006-09-25 01:09:00 +00:00
md = g_malloc ( sizeof ( struct _lua_menu_data ) ) ;
md - > L = L ;
2006-09-27 17:12:42 +00:00
lua_pushvalue ( L , 2 ) ;
md - > cb_ref = luaL_ref ( L , LUA_REGISTRYINDEX ) ;
lua_remove ( L , 2 ) ;
2006-09-25 01:09:00 +00:00
funnel_register_menu ( name ,
2006-09-27 17:12:42 +00:00
group ,
2006-09-25 01:09:00 +00:00
lua_menu_callback ,
md ,
retap ) ;
WSLUA_RETURN ( 0 ) ;
}
struct _dlg_cb_data {
lua_State * L ;
int func_ref ;
} ;
static int dlg_cb_error_handler ( lua_State * L ) {
const gchar * error = lua_tostring ( L , 1 ) ;
report_failure ( " Lua: Error During execution of dialog callback: \n %s " , error ) ;
return 0 ;
}
static void lua_dialog_cb ( gchar * * user_input , void * data ) {
struct _dlg_cb_data * dcbd = data ;
int i = 0 ;
gchar * input ;
lua_State * L = dcbd - > L ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
lua_settop ( L , 0 ) ;
lua_pushcfunction ( L , dlg_cb_error_handler ) ;
lua_rawgeti ( L , LUA_REGISTRYINDEX , dcbd - > func_ref ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
for ( i = 0 ; ( input = user_input [ i ] ) ; i + + ) {
lua_pushstring ( L , input ) ;
g_free ( input ) ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
g_free ( user_input ) ;
2008-04-10 15:26:22 +00:00
2006-10-19 17:02:23 +00:00
switch ( lua_pcall ( L , i , 0 , 1 ) ) {
2006-09-25 01:09:00 +00:00
case 0 :
break ;
case LUA_ERRRUN :
g_warning ( " Runtime error while calling dialog callback " ) ;
break ;
case LUA_ERRMEM :
g_warning ( " Memory alloc error while calling dialog callback " ) ;
break ;
default :
g_assert_not_reached ( ) ;
break ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
}
WSLUA_FUNCTION wslua_new_dialog ( lua_State * L ) { /* Pops up a new dialog */
# define WSLUA_ARG_new_dialog_TITLE 1 /* Title of the dialog's window. */
# define WSLUA_ARG_new_dialog_ACTION 2 /* Action to be performed when OKd. */
/* WSLUA_MOREARGS new_dialog A series of strings to be used as labels of the dialog's fields */
const gchar * title ;
int top = lua_gettop ( L ) ;
int i ;
GPtrArray * labels ;
struct _dlg_cb_data * dcbd ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! ops ) {
luaL_error ( L , " the GUI facility has to be enabled " ) ;
return 0 ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! ( title = luaL_checkstring ( L , WSLUA_ARG_new_dialog_TITLE ) ) ) {
WSLUA_ARG_ERROR ( new_dialog , TITLE , " must be a string " ) ;
return 0 ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! lua_isfunction ( L , WSLUA_ARG_new_dialog_ACTION ) ) {
WSLUA_ARG_ERROR ( new_dialog , ACTION , " must be a function " ) ;
return 0 ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( top < 3 ) {
WSLUA_ERROR ( new_dialog , " at least one field required " ) ;
return 0 ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
dcbd = g_malloc ( sizeof ( struct _dlg_cb_data ) ) ;
dcbd - > L = L ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
lua_remove ( L , 1 ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
lua_pushvalue ( L , 1 ) ;
dcbd - > func_ref = luaL_ref ( L , LUA_REGISTRYINDEX ) ;
lua_remove ( L , 1 ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
labels = g_ptr_array_new ( ) ;
2008-04-10 15:26:22 +00:00
2006-10-19 17:02:23 +00:00
top - = 2 ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
for ( i = 1 ; i < = top ; i + + ) {
gchar * label = ( void * ) luaL_checkstring ( L , i ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
/* XXX leaks labels on error */
2008-04-10 15:26:22 +00:00
if ( ! label )
2006-09-25 01:09:00 +00:00
WSLUA_ERROR ( new_dialog , " all fields must be strings " ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
g_ptr_array_add ( labels , label ) ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
g_ptr_array_add ( labels , NULL ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
ops - > new_dialog ( title , ( const gchar * * ) labels - > pdata , lua_dialog_cb , dcbd ) ;
2008-04-10 15:26:22 +00:00
2006-10-19 17:02:23 +00:00
g_ptr_array_free ( labels , FALSE ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
WSLUA_RETURN ( 0 ) ;
}
WSLUA_CLASS_DEFINE ( TextWindow , NOP , NOP ) ; /* Manages a text window. */
2006-10-19 17:02:23 +00:00
/* XXX: button and close callback data is being leaked */
2006-09-25 01:09:00 +00:00
WSLUA_CONSTRUCTOR TextWindow_new ( lua_State * L ) { /* Creates a new TextWindow. */
# define WSLUA_OPTARG_TextWindow_new_TITLE 1 /* Title of the new window. */
const gchar * title ;
TextWindow tw ;
title = luaL_optstring ( L , WSLUA_OPTARG_TextWindow_new_TITLE , " Untitled Window " ) ;
tw = ops - > new_text_window ( title ) ;
pushTextWindow ( L , tw ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
WSLUA_RETURN ( 1 ) ; /* The newly created TextWindow object. */
}
struct _close_cb_data {
lua_State * L ;
int func_ref ;
} ;
int text_win_close_cb_error_handler ( lua_State * L ) {
const gchar * error = lua_tostring ( L , 1 ) ;
report_failure ( " Lua: Error During execution of TextWindow close callback: \n %s " , error ) ;
2008-04-10 15:26:22 +00:00
return 0 ;
2006-09-25 01:09:00 +00:00
}
static void text_win_close_cb ( void * data ) {
struct _close_cb_data * cbd = data ;
lua_State * L = cbd - > L ;
2006-10-19 17:02:23 +00:00
lua_settop ( L , 0 ) ;
2006-09-25 01:09:00 +00:00
lua_pushcfunction ( L , text_win_close_cb_error_handler ) ;
lua_rawgeti ( L , LUA_REGISTRYINDEX , cbd - > func_ref ) ;
2008-04-10 15:26:22 +00:00
2006-10-19 17:02:23 +00:00
switch ( lua_pcall ( L , 0 , 0 , 1 ) ) {
2006-09-25 01:09:00 +00:00
case 0 :
break ;
case LUA_ERRRUN :
g_warning ( " Runtime error during execution of TextWindow close callback " ) ;
break ;
case LUA_ERRMEM :
g_warning ( " Memory alloc error during execution of TextWindow close callback " ) ;
break ;
default :
g_assert_not_reached ( ) ;
break ;
}
}
WSLUA_METHOD TextWindow_set_atclose ( lua_State * L ) { /* Set the function that will be called when the window closes */
# define WSLUA_ARG_TextWindow_at_close_ACTION 2 /* A function to be executed when the user closes the window */
TextWindow tw = checkTextWindow ( L , 1 ) ;
struct _close_cb_data * cbd ;
if ( ! tw )
WSLUA_ERROR ( TextWindow_at_close , " cannot be called for something not a TextWindow " ) ;
2006-10-19 17:02:23 +00:00
lua_settop ( L , 2 ) ;
2006-09-25 01:09:00 +00:00
if ( ! lua_isfunction ( L , 2 ) )
WSLUA_ARG_ERROR ( TextWindow_at_close , ACTION , " must be a function " ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
cbd = g_malloc ( sizeof ( struct _close_cb_data ) ) ;
cbd - > L = L ;
cbd - > func_ref = luaL_ref ( L , LUA_REGISTRYINDEX ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
ops - > set_close_cb ( tw , text_win_close_cb , cbd ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
pushTextWindow ( L , tw ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow object. */
}
WSLUA_METHOD TextWindow_set ( lua_State * L ) { /* Sets the text. */
# define WSLUA_ARG_TextWindow_set_TEXT 2 /* The text to be used. */
TextWindow tw = checkTextWindow ( L , 1 ) ;
const gchar * text = luaL_checkstring ( L , 2 ) ;
if ( ! tw )
WSLUA_ERROR ( TextWindow_set , " cannot be called for something not a TextWindow " ) ;
if ( ! text )
WSLUA_ARG_ERROR ( TextWindow_set , TEXT , " must be a string " ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
ops - > set_text ( tw , text ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
pushTextWindow ( L , tw ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow object. */
}
WSLUA_METHOD TextWindow_append ( lua_State * L ) { /* Appends text */
2008-04-10 15:26:22 +00:00
# define WSLUA_ARG_TextWindow_append_TEXT 2 /* The text to be appended */
2006-09-25 01:09:00 +00:00
TextWindow tw = checkTextWindow ( L , 1 ) ;
const gchar * text = luaL_checkstring ( L , 2 ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! tw )
WSLUA_ERROR ( TextWindow_append , " cannot be called for something not a TextWindow " ) ;
if ( ! text )
WSLUA_ARG_ERROR ( TextWindow_append , TEXT , " must be a string " ) ;
ops - > append_text ( tw , text ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
pushTextWindow ( L , tw ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow object. */
}
WSLUA_METHOD TextWindow_prepend ( lua_State * L ) { /* Prepends text */
2008-04-10 15:26:22 +00:00
# define WSLUA_ARG_TextWindow_prepend_TEXT 2 /* The text to be appended */
2006-09-25 01:09:00 +00:00
TextWindow tw = checkTextWindow ( L , 1 ) ;
const gchar * text = luaL_checkstring ( L , 2 ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! tw )
WSLUA_ERROR ( TextWindow_prepend , " cannot be called for something not a TextWindow " ) ;
if ( ! text )
WSLUA_ARG_ERROR ( TextWindow_prepend , TEXT , " must be a string " ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
ops - > prepend_text ( tw , text ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
pushTextWindow ( L , tw ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow object. */
}
WSLUA_METHOD TextWindow_clear ( lua_State * L ) { /* Errases all text in the window. */
TextWindow tw = checkTextWindow ( L , 1 ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! tw )
WSLUA_ERROR ( TextWindow_clear , " cannot be called for something not a TextWindow " ) ;
ops - > clear_text ( tw ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
pushTextWindow ( L , tw ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow object. */
}
WSLUA_METHOD TextWindow_get_text ( lua_State * L ) { /* Get the text of the window */
TextWindow tw = checkTextWindow ( L , 1 ) ;
const gchar * text ;
if ( ! tw )
WSLUA_ERROR ( TextWindow_get_text , " cannot be called for something not a TextWindow " ) ;
text = ops - > get_text ( tw ) ;
lua_pushstring ( L , text ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow's text. */
}
static int TextWindow__gc ( lua_State * L ) {
TextWindow tw = checkTextWindow ( L , 1 ) ;
if ( ! tw )
WSLUA_ERROR ( TextWindow_gc , " cannot be called for something not a TextWindow " ) ;
ops - > destroy_text_window ( tw ) ;
2006-10-19 17:02:23 +00:00
return 0 ;
2006-09-25 01:09:00 +00:00
}
2006-10-17 18:20:44 +00:00
WSLUA_METHOD TextWindow_set_editable ( lua_State * L ) { /* Make this window editable */
# define WSLUA_OPTARG_TextWindow_set_editable_EDITABLE 2 /* A boolean flag, defaults to true */
2006-09-25 01:09:00 +00:00
TextWindow tw = checkTextWindow ( L , 1 ) ;
2006-10-19 17:02:23 +00:00
gboolean editable = wslua_optbool ( L , 2 , TRUE ) ;
2006-09-25 01:09:00 +00:00
if ( ! tw )
2006-10-17 18:20:44 +00:00
WSLUA_ERROR ( TextWindow_set_editable , " cannot be called for something not a TextWindow " ) ;
2006-09-25 01:09:00 +00:00
if ( ops - > set_editable )
ops - > set_editable ( tw , editable ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
pushTextWindow ( L , tw ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow object. */
}
typedef struct _wslua_bt_cb_t {
lua_State * L ;
int func_ref ;
} wslua_bt_cb_t ;
static gboolean wslua_button_callback ( funnel_text_window_t * tw , void * data ) {
wslua_bt_cb_t * cbd = data ;
lua_State * L = cbd - > L ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
lua_settop ( L , 0 ) ;
lua_pushcfunction ( L , dlg_cb_error_handler ) ;
lua_rawgeti ( L , LUA_REGISTRYINDEX , cbd - > func_ref ) ;
pushTextWindow ( L , tw ) ;
2008-04-10 15:26:22 +00:00
2006-10-19 17:02:23 +00:00
switch ( lua_pcall ( L , 1 , 0 , 1 ) ) {
2006-09-25 01:09:00 +00:00
case 0 :
break ;
case LUA_ERRRUN :
g_warning ( " Runtime error while calling button callback " ) ;
break ;
case LUA_ERRMEM :
g_warning ( " Memory alloc error while calling button callback " ) ;
break ;
default :
g_assert_not_reached ( ) ;
break ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
return TRUE ;
}
WSLUA_METHOD TextWindow_add_button ( lua_State * L ) {
2008-04-10 15:26:22 +00:00
# define WSLUA_ARG_TextWindow_add_button_LABEL 2 /* The label of the button */
# define WSLUA_ARG_TextWindow_add_button_FUNCTION 3 /* The function to be called when clicked */
2006-09-25 01:09:00 +00:00
TextWindow tw = checkTextWindow ( L , 1 ) ;
const gchar * label = luaL_checkstring ( L , WSLUA_ARG_TextWindow_add_button_LABEL ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
funnel_bt_t * fbt ;
wslua_bt_cb_t * cbd ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! tw )
2006-10-17 18:20:44 +00:00
WSLUA_ERROR ( TextWindow_add_button , " cannot be called for something not a TextWindow " ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
if ( ! lua_isfunction ( L , WSLUA_ARG_TextWindow_add_button_FUNCTION ) )
WSLUA_ARG_ERROR ( TextWindow_add_button , FUNCTION , " must be a function " ) ;
2006-10-19 17:02:23 +00:00
lua_settop ( L , 3 ) ;
2006-09-25 01:09:00 +00:00
if ( ops - > add_button ) {
2006-10-04 18:45:26 +00:00
fbt = g_malloc ( sizeof ( funnel_bt_t ) ) ;
cbd = g_malloc ( sizeof ( wslua_bt_cb_t ) ) ;
2006-09-25 01:09:00 +00:00
fbt - > tw = tw ;
fbt - > func = wslua_button_callback ;
fbt - > data = cbd ;
2006-10-05 16:25:13 +00:00
fbt - > free = g_free ;
fbt - > free_data = g_free ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
cbd - > L = L ;
cbd - > func_ref = luaL_ref ( L , LUA_REGISTRYINDEX ) ;
ops - > add_button ( tw , fbt , label ) ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
pushTextWindow ( L , tw ) ;
WSLUA_RETURN ( 1 ) ; /* The TextWindow object. */
}
WSLUA_METHODS TextWindow_methods [ ] = {
WSLUA_CLASS_FNREG ( TextWindow , new ) ,
WSLUA_CLASS_FNREG ( TextWindow , set ) ,
WSLUA_CLASS_FNREG ( TextWindow , new ) ,
WSLUA_CLASS_FNREG ( TextWindow , append ) ,
WSLUA_CLASS_FNREG ( TextWindow , prepend ) ,
WSLUA_CLASS_FNREG ( TextWindow , clear ) ,
WSLUA_CLASS_FNREG ( TextWindow , set_atclose ) ,
WSLUA_CLASS_FNREG ( TextWindow , set_editable ) ,
WSLUA_CLASS_FNREG ( TextWindow , get_text ) ,
WSLUA_CLASS_FNREG ( TextWindow , add_button ) ,
{ 0 , 0 }
} ;
WSLUA_META TextWindow_meta [ ] = {
{ " __tostring " , TextWindow_get_text } ,
{ " __gc " , TextWindow__gc } ,
{ 0 , 0 }
} ;
int TextWindow_register ( lua_State * L ) {
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
ops = funnel_get_funnel_ops ( ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
WSLUA_REGISTER_CLASS ( TextWindow ) ;
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
return 1 ;
}
WSLUA_FUNCTION wslua_retap_packets ( lua_State * L ) {
/*
Rescan all packets and just run taps - don ' t reconstruct the display .
*/
if ( ops - > retap_packets ) {
ops - > retap_packets ( ) ;
} else {
WSLUA_ERROR ( wslua_retap_packets , " does not work on TShark " ) ;
}
2008-04-10 15:26:22 +00:00
2006-09-25 01:09:00 +00:00
return 0 ;
}
2006-10-03 12:07:10 +00:00
WSLUA_FUNCTION wslua_copy_to_clipboard ( lua_State * L ) { /* copy a string into the clipboard */
# define WSLUA_ARG_copy_to_clipboard_TEXT 1 /* The string to be copied into the clipboard. */
const char * copied_str = luaL_checkstring ( L , WSLUA_ARG_copy_to_clipboard_TEXT ) ;
GString * gstr ;
if ( ! ops - > copy_to_clipboard ) {
WSLUA_ERROR ( wslua_copy_to_clipboard , " does not work on TShark " ) ;
}
if ( ! copied_str ) {
WSLUA_ARG_ERROR ( copy_to_clipboard , TEXT , " must be a string " ) ;
}
gstr = g_string_new ( copied_str ) ;
ops - > copy_to_clipboard ( gstr ) ;
g_string_free ( gstr , TRUE ) ;
return 0 ;
}
2006-10-17 18:20:44 +00:00
WSLUA_FUNCTION wslua_open_capture_file ( lua_State * L ) { /* open and display a capture file */
2006-10-03 12:07:10 +00:00
# define WSLUA_ARG_open_capture_file_FILENAME 1 /* The name of the file to be opened. */
2008-04-10 15:26:22 +00:00
# define WSLUA_ARG_open_capture_file_FILTER 2 /* A filter to be applied as the file gets opened. */
2006-10-03 12:07:10 +00:00
const char * fname = luaL_checkstring ( L , WSLUA_ARG_open_capture_file_FILENAME ) ;
const char * filter = luaL_optstring ( L , WSLUA_ARG_open_capture_file_FILTER , NULL ) ;
2007-05-02 23:54:01 +00:00
const char * error = NULL ;
2006-10-03 12:07:10 +00:00
if ( ! ops - > open_file ) {
WSLUA_ERROR ( wslua_open_capture_file , " does not work on TShark " ) ;
}
if ( ! fname ) {
WSLUA_ARG_ERROR ( open_capture_file , FILENAME , " must be a string " ) ;
}
if ( ! ops - > open_file ( fname , filter , & error ) ) {
lua_pushboolean ( L , FALSE ) ;
2008-04-10 15:26:22 +00:00
2006-10-03 12:07:10 +00:00
if ( error )
lua_pushstring ( L , error ) ;
else
lua_pushnil ( L ) ;
2008-04-10 15:26:22 +00:00
2006-10-03 12:07:10 +00:00
return 2 ;
} else {
lua_pushboolean ( L , TRUE ) ;
return 1 ;
}
}
WSLUA_FUNCTION wslua_set_filter ( lua_State * L ) { /* set the main filter text */
# define WSLUA_ARG_set_filter_TEXT 1 /* The filter's text. */
const char * filter_str = luaL_checkstring ( L , WSLUA_ARG_set_filter_TEXT ) ;
if ( ! ops - > set_filter ) {
WSLUA_ERROR ( wslua_set_filter , " does not work on TShark " ) ;
}
if ( ! filter_str ) {
WSLUA_ARG_ERROR ( set_filter , TEXT , " must be a string " ) ;
}
ops - > set_filter ( filter_str ) ;
return 0 ;
}
2006-10-03 14:27:45 +00:00
WSLUA_FUNCTION wslua_apply_filter ( lua_State * L ) { /* apply the filter in the main filter box */
if ( ! ops - > apply_filter ) {
2006-10-04 14:37:46 +00:00
WSLUA_ERROR ( wslua_apply_filter , " does not work on TShark " ) ;
2006-10-03 14:27:45 +00:00
}
ops - > apply_filter ( ) ;
return 0 ;
}
2006-10-04 14:37:46 +00:00
WSLUA_FUNCTION wslua_reload ( lua_State * L ) { /* reload the current capture file */
2006-10-03 14:27:45 +00:00
if ( ! ops - > reload ) {
WSLUA_ERROR ( wslua_reload , " does not work on TShark " ) ;
}
ops - > reload ( ) ;
return 0 ;
}
2006-12-27 01:46:42 +00:00
WSLUA_FUNCTION wslua_browser_open_url ( lua_State * L ) { /* open an url in a browser */
# define WSLUA_ARG_browser_open_url_URL 1 /* The url. */
const char * url = luaL_checkstring ( L , WSLUA_ARG_browser_open_url_URL ) ;
if ( ! ops - > browser_open_url ) {
WSLUA_ERROR ( browser_open_url , " does not work on TShark " ) ;
}
if ( ! url ) {
WSLUA_ARG_ERROR ( browser_open_url , URL , " must be a string " ) ;
}
ops - > browser_open_url ( url ) ;
return 0 ;
}
WSLUA_FUNCTION wslua_browser_open_data_file ( lua_State * L ) { /* open an file in a browser */
# define WSLUA_ARG_browser_open_data_file_FILENAME 1 /* The url. */
2007-01-05 12:14:42 +00:00
const char * file = luaL_checkstring ( L , WSLUA_ARG_browser_open_data_file_FILENAME ) ;
2006-12-27 01:46:42 +00:00
2007-01-05 12:14:42 +00:00
if ( ! ops - > browser_open_data_file ) {
2006-12-27 01:46:42 +00:00
WSLUA_ERROR ( browser_open_data_file , " does not work on TShark " ) ;
}
2007-01-05 12:14:42 +00:00
if ( ! file ) {
2006-12-27 01:46:42 +00:00
WSLUA_ARG_ERROR ( browser_open_data_file , FILENAME , " must be a string " ) ;
}
2007-01-05 12:14:42 +00:00
ops - > browser_open_data_file ( file ) ;
2006-12-27 01:46:42 +00:00
return 0 ;
}
2007-05-02 23:54:01 +00:00