2005-11-25 23:42:52 +00:00
/* expert_comp_table.c
* expert_comp_table 2005 Greg Morris
* Portions copied from service_response_time_table . c by Ronnie Sahlberg
* Helper routines common to all composite expert statistics
* tap .
*
* $ Id $
*
2006-05-21 05:12:17 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2005-11-25 23:42:52 +00:00
* Copyright 1998 Gerald Combs
2010-08-30 16:10:01 +00:00
*
2005-11-25 23:42:52 +00:00
* 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 .
2010-08-30 16:10:01 +00:00
*
2005-11-25 23:42:52 +00:00
* 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 .
2010-08-30 16:10:01 +00:00
*
2005-11-25 23:42:52 +00:00
* 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 .
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
# include <math.h>
2008-04-13 01:54:20 +00:00
2005-11-25 23:42:52 +00:00
# include <gtk/gtk.h>
2008-04-13 01:54:20 +00:00
2005-11-25 23:42:52 +00:00
# include "epan/packet_info.h"
2009-08-19 18:37:13 +00:00
# include "epan/strutil.h"
2008-04-13 01:54:20 +00:00
# include <epan/expert.h>
2006-05-04 15:36:41 +00:00
2008-04-13 01:54:20 +00:00
# include "../simple_dialog.h"
# include "../color.h"
# include "gtk/expert_comp_table.h"
2008-05-17 22:59:52 +00:00
# include "gtk/filter_utils.h"
2005-11-25 23:42:52 +00:00
# include "gtk/find_dlg.h"
# include "gtk/color_dlg.h"
2008-04-13 01:54:20 +00:00
# include "gtk/main.h"
# include "gtk/gui_utils.h"
# include "gtk/gtkglobals.h"
# include "gtk/webbrowser.h"
2010-08-24 05:11:37 +00:00
# include "gtk/stock_icons.h"
2010-10-03 16:09:25 +00:00
# include "gtk/utf8_entities.h"
2008-04-13 01:54:20 +00:00
2009-09-02 05:48:38 +00:00
const char * packet = " Packet: " ;
2009-08-26 17:26:26 +00:00
2006-05-04 15:36:41 +00:00
enum
{
GROUP_COLUMN ,
PROTOCOL_COLUMN ,
SUMMARY_COLUMN ,
COUNT_COLUMN ,
N_COLUMNS
} ;
2005-11-25 23:42:52 +00:00
2009-09-02 05:48:38 +00:00
static void
proto_data_func ( GtkTreeViewColumn * column _U_ ,
GtkCellRenderer * renderer ,
GtkTreeModel * model ,
GtkTreeIter * iter ,
gpointer user_data )
2010-08-30 16:10:01 +00:00
{
2009-09-02 05:48:38 +00:00
gchar * str = NULL ;
gchar * grp = NULL ; /* type pointer, don't free */
/* The col to get data from is in userdata */
gint data_column = GPOINTER_TO_INT ( user_data ) ;
gtk_tree_model_get ( model , iter , data_column , & str , - 1 ) ;
gtk_tree_model_get ( model , iter , GROUP_COLUMN , & grp , - 1 ) ;
/* XXX should we check that str is non NULL and print a warning or do assert? */
g_object_set ( renderer , " text " , str , NULL ) ;
if ( grp = = packet ) {
/* it's a number right align */
g_object_set ( renderer , " xalign " , 1.0 , NULL ) ;
}
else {
g_object_set ( renderer , " xalign " , 0.0 , NULL ) ;
}
g_free ( str ) ;
}
static gint
proto_sort_func ( GtkTreeModel * model ,
GtkTreeIter * a ,
GtkTreeIter * b ,
gpointer user_data )
{
gchar * str_a = NULL ;
gchar * str_b = NULL ;
gchar * grp = NULL ; /* type pointer, don't free */
gint ret = 0 ;
/* The col to get data from is in userdata */
gint data_column = GPOINTER_TO_INT ( user_data ) ;
gtk_tree_model_get ( model , a , data_column , & str_a , - 1 ) ;
gtk_tree_model_get ( model , b , data_column , & str_b , - 1 ) ;
gtk_tree_model_get ( model , a , GROUP_COLUMN , & grp , - 1 ) ;
if ( str_a = = str_b ) {
ret = 0 ;
2010-08-30 16:10:01 +00:00
}
2009-09-02 05:48:38 +00:00
else if ( str_a = = NULL | | str_b = = NULL ) {
ret = ( str_a = = NULL ) ? - 1 : 1 ;
2010-08-30 16:10:01 +00:00
}
2009-09-02 05:48:38 +00:00
else {
if ( grp = = packet ) {
2009-09-29 19:29:03 +00:00
gint int_a = atoi ( str_a ) ;
gint int_b = atoi ( str_b ) ;
if ( int_a = = int_b )
2009-09-02 05:48:38 +00:00
ret = 0 ;
2009-09-29 19:29:03 +00:00
else if ( int_a < int_b )
2009-09-02 05:48:38 +00:00
ret = - 1 ;
2010-08-30 16:10:01 +00:00
else
2009-09-02 05:48:38 +00:00
ret = 1 ;
}
else
ret = g_ascii_strcasecmp ( str_a , str_b ) ;
}
g_free ( str_a ) ;
g_free ( str_b ) ;
return ret ;
}
2006-05-04 15:36:41 +00:00
static gint find_summary_data ( error_equiv_table * err , const expert_info_t * expert_data )
2005-11-25 23:42:52 +00:00
{
2009-08-19 18:37:13 +00:00
guint i ;
error_procedure_t * procedure ;
2010-08-30 16:10:01 +00:00
2006-05-04 15:36:41 +00:00
/* First time thru values will be 0 */
if ( err - > num_procs = = 0 ) {
return - 1 ;
2005-11-25 23:42:52 +00:00
}
2006-05-04 15:36:41 +00:00
for ( i = 0 ; i < err - > num_procs ; i + + ) {
2009-08-19 18:37:13 +00:00
procedure = & g_array_index ( err - > procs_array , error_procedure_t , i ) ;
2009-08-26 17:26:26 +00:00
if ( strcmp ( procedure - > entries [ 0 ] , expert_data - > protocol ) = = 0 & &
strcmp ( procedure - > entries [ 1 ] , expert_data - > summary ) = = 0 ) {
2006-05-04 15:36:41 +00:00
return i ;
}
}
return - 1 ;
2005-11-25 23:42:52 +00:00
}
static void
error_select_filter_cb ( GtkWidget * widget _U_ , gpointer callback_data , guint callback_action )
{
2007-12-03 21:55:44 +00:00
int action , type , selection ;
error_equiv_table * err = ( error_equiv_table * ) callback_data ;
2009-08-19 18:37:13 +00:00
char str [ 512 ] ;
2007-12-03 21:55:44 +00:00
const char * current_filter ;
2009-08-19 18:37:13 +00:00
error_procedure_t * procedure ;
2006-05-04 15:36:41 +00:00
GtkTreeIter iter ;
GtkTreeModel * model ;
2009-05-19 15:53:26 +00:00
expert_info_t expert_data ;
gchar * grp ;
2005-11-25 23:42:52 +00:00
2007-12-04 08:27:48 +00:00
action = FILTER_ACTION ( callback_action ) ;
type = FILTER_ACTYPE ( callback_action ) ;
2006-05-04 15:36:41 +00:00
2005-11-25 23:42:52 +00:00
2010-08-10 11:08:18 +00:00
if ( ! gtk_tree_selection_get_selected ( err - > select , & model , & iter ) ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " No selection made or the table is empty " ) ;
return ;
}
2006-05-04 15:36:41 +00:00
2010-08-30 16:10:01 +00:00
gtk_tree_model_get ( model , & iter ,
2009-05-19 15:53:26 +00:00
GROUP_COLUMN , & grp ,
PROTOCOL_COLUMN , & expert_data . protocol ,
SUMMARY_COLUMN , & expert_data . summary ,
- 1 ) ;
2010-08-30 16:10:01 +00:00
2009-09-02 05:48:38 +00:00
if ( strcmp ( grp , packet ) = = 0 ) {
2007-12-03 21:55:44 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " You cannot filter or search for packet number. Click on a valid item header. " ) ;
2009-05-19 15:53:26 +00:00
g_free ( expert_data . summary ) ;
2006-03-19 20:26:45 +00:00
return ;
}
2006-05-04 15:36:41 +00:00
2009-05-19 15:53:26 +00:00
/* XXX: find_summary_data doesn't (currently) reference expert_data.group. */
/* If "group" is required, then the message from GROUP_COLUMN will need */
/* to be translated to the group number (or the actual group number */
/* will also need to be stored in the TreeModel). */
2006-05-04 15:36:41 +00:00
selection = find_summary_data ( err , & expert_data ) ;
2009-09-13 16:03:46 +00:00
/* g_free(expert_data.protocol); - const */
2009-05-19 15:53:26 +00:00
g_free ( expert_data . summary ) ;
2007-12-03 21:55:44 +00:00
if ( selection > = ( int ) err - > num_procs ) {
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " No items are selected " ) ;
return ;
}
current_filter = gtk_entry_get_text ( GTK_ENTRY ( main_display_filter_widget ) ) ;
2005-11-25 23:42:52 +00:00
/* Some expert data doesn't pass an expert item. Without this we cannot create a filter */
/* But allow for searching of internet for error string */
2009-08-19 18:37:13 +00:00
procedure = & g_array_index ( err - > procs_array , error_procedure_t , selection ) ;
2010-08-10 11:08:18 +00:00
if ( action ! = ACTION_WEB_LOOKUP & & action ! = ACTION_COPY ) {
2009-08-19 18:37:13 +00:00
char * msg ;
if ( 0 /*procedure->fvalue_value==NULL*/ ) {
if ( action ! = ACTION_FIND_FRAME & & action ! = ACTION_FIND_NEXT & & action ! = ACTION_FIND_PREVIOUS ) {
2010-08-30 16:10:01 +00:00
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " Wireshark cannot create a filter on this item - %s, try using find instead. " ,
2009-08-26 17:26:26 +00:00
procedure - > entries [ 1 ] ) ;
2005-11-25 23:42:52 +00:00
return ;
}
}
2009-08-26 17:26:26 +00:00
msg = g_malloc ( escape_string_len ( procedure - > entries [ 1 ] ) ) ;
escape_string ( msg , procedure - > entries [ 1 ] ) ;
2007-12-03 21:55:44 +00:00
switch ( type ) {
2007-12-04 08:27:48 +00:00
case ACTYPE_SELECTED :
2005-11-25 23:42:52 +00:00
/* if no expert item was passed */
2009-08-19 18:37:13 +00:00
if ( procedure - > fvalue_value = = NULL ) {
g_snprintf ( str , sizeof ( str ) , " expert.message==%s " , msg ) ;
2005-11-25 23:42:52 +00:00
}
else
{
/* expert item exists. Use it. */
2009-08-19 18:37:13 +00:00
g_strlcpy ( str , procedure - > fvalue_value , sizeof ( str ) ) ;
2005-11-25 23:42:52 +00:00
}
2007-12-03 21:55:44 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTYPE_NOT_SELECTED :
2005-11-25 23:42:52 +00:00
/* if no expert item was passed */
2009-08-19 18:37:13 +00:00
if ( procedure - > fvalue_value = = NULL ) {
g_snprintf ( str , sizeof ( str ) , " !(expert.message==%s) " , msg ) ;
2005-11-25 23:42:52 +00:00
}
else
{
/* expert item exists. Use it. */
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " !(%s) " , procedure - > fvalue_value ) ;
2005-11-25 23:42:52 +00:00
}
2007-12-03 21:55:44 +00:00
break ;
2005-11-25 23:42:52 +00:00
/* the remaining cases will only exist if the expert item exists so no need to check */
2007-12-04 08:27:48 +00:00
case ACTYPE_AND_SELECTED :
2008-05-17 22:59:52 +00:00
if ( ( ! current_filter ) | | ( 0 = = strlen ( current_filter ) ) )
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " expert.message==%s " , msg ) ;
2008-05-17 22:59:52 +00:00
else
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " (%s) && (expert.message==%s) " , current_filter , msg ) ;
2007-12-03 21:55:44 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTYPE_OR_SELECTED :
2008-05-17 22:59:52 +00:00
if ( ( ! current_filter ) | | ( 0 = = strlen ( current_filter ) ) )
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " expert.message==%s " , msg ) ;
2008-05-17 22:59:52 +00:00
else
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " (%s) || (expert.message==%s) " , current_filter , msg ) ;
2007-12-03 21:55:44 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTYPE_AND_NOT_SELECTED :
2008-05-17 22:59:52 +00:00
if ( ( ! current_filter ) | | ( 0 = = strlen ( current_filter ) ) )
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " !(expert.message==%s) " , msg ) ;
2008-05-17 22:59:52 +00:00
else
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " (%s) && !(expert.message==%s) " , current_filter , msg ) ;
2007-12-03 21:55:44 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTYPE_OR_NOT_SELECTED :
2008-05-17 22:59:52 +00:00
if ( ( ! current_filter ) | | ( 0 = = strlen ( current_filter ) ) )
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " !(expert.message==%s) " , msg ) ;
2008-05-17 22:59:52 +00:00
else
2009-08-19 18:37:13 +00:00
g_snprintf ( str , sizeof ( str ) , " (%s) || !(expert.message==%s) " , current_filter , msg ) ;
2007-12-03 21:55:44 +00:00
break ;
2005-11-25 23:42:52 +00:00
default :
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " Can't find menu type - %u " , type ) ;
2007-12-03 21:55:44 +00:00
}
2009-08-19 18:37:13 +00:00
g_free ( msg ) ;
2005-11-25 23:42:52 +00:00
}
2007-12-03 21:55:44 +00:00
switch ( action ) {
2007-12-04 08:27:48 +00:00
case ACTION_MATCH :
2010-08-24 20:03:33 +00:00
gtk_entry_set_text ( GTK_ENTRY ( main_display_filter_widget ) , str ) ;
2007-12-03 21:55:44 +00:00
main_filter_packets ( & cfile , str , FALSE ) ;
2010-08-24 20:03:33 +00:00
gdk_window_raise ( top_level - > window ) ;
2005-11-25 23:42:52 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTION_PREPARE :
2005-11-25 23:42:52 +00:00
gtk_entry_set_text ( GTK_ENTRY ( main_display_filter_widget ) , str ) ;
2007-12-03 21:55:44 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTION_FIND_FRAME :
2005-11-25 23:42:52 +00:00
/* When trying to perform a find without expert item, we must pass
* the expert string to the find window . The user might need to modify
* the string and click on the text search to locate the packet in question .
* So regardless of the type we will just bring up the find window and allow
* the user to modify the search criteria and options .
*/
2007-12-04 07:50:44 +00:00
find_frame_with_filter ( str ) ;
2007-12-03 21:55:44 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTION_FIND_NEXT :
2005-11-25 23:42:52 +00:00
/* In the case of find next, if there was no expert item, then most likely the expert
* string was modified to locate the text inside the message . So we can ' t just perform
* a find with the expert string or we will not really be performing a find next .
* In an effort to allow the user to modify the string and / or continue searching , we
* will just present the user with the find window again with the default expert string .
2010-08-30 16:10:01 +00:00
* A better aproach would be to attempt in capturing the last find string and utilize this
2005-11-25 23:42:52 +00:00
* with a find next / previous . Also a better approach might be to just send a < Ctl - N > keystroke .
*/
2010-08-24 20:03:33 +00:00
/* Fall trough */
2007-12-04 08:27:48 +00:00
case ACTION_FIND_PREVIOUS :
2005-11-25 23:42:52 +00:00
/* In the case of find previous, if there was no expert item, then most likely the expert
* string was modified to locate the text inside the message . So we can ' t just perform
* a find with the expert string or we will not really be performing a find previous .
* In an effort to allow the user to modify the string and / or continue searching , we
* will just present the user with the find window again with the default expert string .
2010-08-30 16:10:01 +00:00
* A better aproach would be to attempt in capturing the last find string and utilize this
2005-11-25 23:42:52 +00:00
* with a find next / previous . Also a better approach might be to just send a < Ctl - B > keystroke .
*/
2009-08-19 18:37:13 +00:00
if ( procedure - > fvalue_value = = NULL ) {
2005-11-25 23:42:52 +00:00
find_frame_with_filter ( str ) ;
}
else
2010-08-30 16:10:01 +00:00
{
2005-11-25 23:42:52 +00:00
/* We have an expert item so just continue search without find dialog. */
2010-08-24 20:03:33 +00:00
cf_find_packet_dfilter_string ( & cfile , str , SD_FORWARD ) ;
2005-11-25 23:42:52 +00:00
}
2007-12-03 21:55:44 +00:00
break ;
2007-12-04 08:27:48 +00:00
case ACTION_COLORIZE :
2007-12-03 21:55:44 +00:00
color_display_with_filter ( str ) ;
break ;
2007-12-04 08:27:48 +00:00
case ACTION_WEB_LOOKUP :
2007-12-03 21:55:44 +00:00
/* Lookup expert string on internet. Default search via www.google.com */
2009-08-26 17:26:26 +00:00
g_snprintf ( str , sizeof ( str ) , " http://www.google.com/search?hl=en&q=%s+'%s' " , procedure - > entries [ 0 ] , procedure - > entries [ 1 ] ) ;
2005-11-25 23:42:52 +00:00
browser_open_url ( str ) ;
2007-12-03 21:55:44 +00:00
break ;
2010-06-13 14:55:11 +00:00
case ACTION_COPY :
{
GString * copyString = g_string_sized_new ( 0 ) ;
g_string_printf ( copyString , " %s: %s " ,
procedure - > entries [ 0 ] , procedure - > entries [ 1 ] ) ;
copy_to_clipboard ( copyString ) ;
g_string_free ( copyString , TRUE ) ;
}
break ;
2005-11-25 23:42:52 +00:00
default :
simple_dialog ( ESD_TYPE_ERROR , ESD_BTN_OK , " Can't find menu action - %u " , action ) ;
2007-12-03 21:55:44 +00:00
}
2005-11-25 23:42:52 +00:00
}
2010-07-30 12:41:56 +00:00
static gboolean
2010-08-23 19:29:08 +00:00
error_show_popup_menu_cb ( void * widg _U_ , GdkEvent * event , gpointer user_data )
2005-11-25 23:42:52 +00:00
{
2010-08-23 19:29:08 +00:00
error_equiv_table * err = user_data ;
2005-11-25 23:42:52 +00:00
GdkEventButton * bevent = ( GdkEventButton * ) event ;
if ( event - > type = = GDK_BUTTON_PRESS & & bevent - > button = = 3 ) {
2010-08-30 16:10:01 +00:00
gtk_menu_popup ( GTK_MENU ( err - > menu ) , NULL , NULL , NULL , NULL ,
2005-11-25 23:42:52 +00:00
bevent - > button , bevent - > time ) ;
}
return FALSE ;
}
2010-08-10 11:08:18 +00:00
2009-10-05 08:32:59 +00:00
static void
2010-08-10 11:08:18 +00:00
apply_as_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
apply_as_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
apply_as_and_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_AND_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
apply_as_or_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_OR_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
apply_as_and_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_AND_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
apply_as_or_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_MATCH ( ACTYPE_OR_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
prep_as_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
prep_as_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
prep_as_and_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_AND_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
prep_as_or_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_OR_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
prep_as_and_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_AND_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
prep_as_or_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_PREPARE ( ACTYPE_OR_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
find_selected_cb ( GtkWidget * widget , gpointer user_data )
{
error_select_filter_cb ( widget , user_data , CALLBACK_FIND_FRAME ( ACTYPE_SELECTED , 0 ) ) ;
}
static void
find_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_FIND_FRAME ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
find_prev_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_FIND_PREVIOUS ( ACTYPE_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
find_prev_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_FIND_PREVIOUS ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
find_next_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_FIND_NEXT ( ACTYPE_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
find_next_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_FIND_NEXT ( ACTYPE_NOT_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
color_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_COLORIZE ( ACTYPE_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
color_not_selected_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_COLORIZE ( ACTYPE_SELECTED , 0 ) ) ;
2009-10-05 08:32:59 +00:00
}
static void
2010-08-10 11:08:18 +00:00
internet_search_cb ( GtkWidget * widget , gpointer user_data )
2009-10-05 08:32:59 +00:00
{
2010-08-10 11:08:18 +00:00
error_select_filter_cb ( widget , user_data , CALLBACK_WEB_LOOKUP ) ;
2009-10-05 08:32:59 +00:00
}
2010-08-10 11:08:18 +00:00
static void
copy_cb ( GtkWidget * widget , gpointer user_data )
{
error_select_filter_cb ( widget , user_data , CALLBACK_COPY ) ;
}
2010-08-19 19:05:56 +00:00
static const char * ui_desc_expert_filter_popup =
" <ui> \n "
" <popup name='ExpertFilterPopup'> \n "
" <menu action='/Apply as Filter'> \n "
" <menuitem action='/Apply as Filter/Selected'/> \n "
2010-10-03 16:09:25 +00:00
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " not Selected'/> \n "
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected'/> \n "
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected'/> \n "
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/> \n "
" <menuitem action='/Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/> \n "
2010-08-19 19:05:56 +00:00
" </menu> \n "
" <menu action='/Prepare a Filter'> \n "
" <menuitem action='/Prepare a Filter/Selected'/> \n "
2010-10-03 16:09:25 +00:00
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " not Selected'/> \n "
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected'/> \n "
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected'/> \n "
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected'/> \n "
" <menuitem action='/Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected'/> \n "
2010-08-19 19:05:56 +00:00
" </menu> \n "
" <menu action='/Find Frame'> \n "
" <menu action='/Find Frame/Find Frame'> \n "
" <menuitem action='/Find Frame/Selected'/> \n "
" <menuitem action='/Find Frame/Not Selected'/> \n "
" </menu> \n "
" <menu action='/Find Frame/Find Next'> \n "
" <menuitem action='/Find Next/Selected'/> \n "
" <menuitem action='/Find Next/Not Selected'/> \n "
" </menu> \n "
" <menu action='/Find Frame/Find Previous'> \n "
" <menuitem action='/Find Previous/Selected'/> \n "
" <menuitem action='/Find Previous/Not Selected'/> \n "
" </menu> \n "
" </menu> \n "
" <menu action='/Colorize Procedure'> \n "
" <menuitem action='/Colorize Procedure/Selected'/> \n "
" <menuitem action='/Colorize Procedure/Not Selected'/> \n "
" </menu> \n "
2010-08-24 05:11:37 +00:00
" <menu action='/Internet Search'> \n "
" <menuitem action='/For Info Text'/> \n "
2010-08-19 19:05:56 +00:00
" </menu> \n "
" <menu action='/Copy'> \n "
2010-08-24 05:11:37 +00:00
" <menuitem action='/Copy/Protocol Plus Summary'/> \n "
2010-08-19 19:05:56 +00:00
" </menu> \n "
" </popup> \n "
" </ui> \n " ;
2009-10-05 08:32:59 +00:00
2010-08-30 16:10:01 +00:00
/*
2010-08-09 16:16:58 +00:00
* GtkActionEntry
* typedef struct {
* const gchar * name ;
* const gchar * stock_id ;
* const gchar * label ;
* const gchar * accelerator ;
* const gchar * tooltip ;
* GCallback callback ;
* } GtkActionEntry ;
2010-08-30 16:10:01 +00:00
* const gchar * name ; The name of the action .
* const gchar * stock_id ; The stock id for the action , or the name of an icon from the icon theme .
* const gchar * label ; The label for the action . This field should typically be marked for translation ,
* see gtk_action_group_set_translation_domain ( ) .
* If label is NULL , the label of the stock item with id stock_id is used .
* const gchar * accelerator ; The accelerator for the action , in the format understood by gtk_accelerator_parse ( ) .
* const gchar * tooltip ; The tooltip for the action . This field should typically be marked for translation ,
* see gtk_action_group_set_translation_domain ( ) .
* GCallback callback ; The function to call when the action is activated .
2010-08-09 16:16:58 +00:00
*
*/
2010-08-19 19:05:56 +00:00
static const GtkActionEntry expert_popup_entries [ ] = {
2010-08-10 11:08:18 +00:00
{ " /Apply as Filter " , NULL , " Apply as Filter " , NULL , NULL , NULL } ,
{ " /Prepare a Filter " , NULL , " Prepare a Filter " , NULL , NULL , NULL } ,
{ " /Find Frame " , NULL , " Find Frame " , NULL , NULL , NULL } ,
{ " /Find Frame/Find Frame " , NULL , " Find Frame " , NULL , NULL , NULL } ,
{ " /Find Frame/Find Next " , NULL , " Find Next " , NULL , NULL , NULL } ,
{ " /Find Frame/Find Previous " , NULL , " Find Previous " , NULL , NULL , NULL } ,
{ " /Colorize Procedure " , NULL , " Colorize Procedure " , NULL , NULL , NULL } ,
{ " /Apply as Filter/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( apply_as_selected_cb ) } ,
2010-10-03 16:09:25 +00:00
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " not Selected " , G_CALLBACK ( apply_as_not_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , G_CALLBACK ( apply_as_and_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , G_CALLBACK ( apply_as_or_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , G_CALLBACK ( apply_as_and_not_selected_cb ) } ,
{ " /Apply as Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , G_CALLBACK ( apply_as_or_not_selected_cb ) } ,
2010-08-10 11:08:18 +00:00
{ " /Prepare a Filter/Selected " , NULL , " Selected " , NULL , " selcted " , G_CALLBACK ( prep_as_selected_cb ) } ,
2010-10-03 16:09:25 +00:00
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " not Selected " , G_CALLBACK ( prep_as_not_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and Selected " , G_CALLBACK ( prep_as_and_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or Selected " , G_CALLBACK ( prep_as_or_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " and not Selected " , G_CALLBACK ( prep_as_and_not_selected_cb ) } ,
{ " /Prepare a Filter/ " UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , NULL , UTF8_HORIZONTAL_ELLIPSIS " or not Selected " , G_CALLBACK ( prep_as_or_not_selected_cb ) } ,
2010-08-10 11:08:18 +00:00
{ " /Find Frame/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( find_selected_cb ) } ,
{ " /Find Frame/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( find_not_selected_cb ) } ,
{ " /Find Previous/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( find_prev_selected_cb ) } ,
{ " /Find Previous/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( find_prev_not_selected_cb ) } ,
{ " /Find Next/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( find_next_selected_cb ) } ,
{ " /Find Next/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( find_next_not_selected_cb ) } ,
{ " /Colorize Procedure/Selected " , NULL , " Selected " , NULL , " Selected " , G_CALLBACK ( color_selected_cb ) } ,
{ " /Colorize Procedure/Not Selected " , NULL , " Not Selected " , NULL , " Not Selected " , G_CALLBACK ( color_not_selected_cb ) } ,
2010-08-24 05:11:37 +00:00
{ " /Internet Search " , WIRESHARK_STOCK_INTERNET , " Internet Search " , NULL , " Internet Search " , NULL } ,
{ " /For Info Text " , NULL , " For Info Text " , NULL , " For Info Text " , G_CALLBACK ( internet_search_cb ) } ,
2010-08-10 15:47:29 +00:00
{ " /Copy " , NULL , " Copy " , NULL , " Copy " , NULL } ,
2010-08-24 05:11:37 +00:00
{ " /Copy/Protocol Plus Summary " , NULL , " Protocol Plus Summary " , NULL , " Protocol Plus Summary " , G_CALLBACK ( copy_cb ) } ,
2009-10-05 08:32:59 +00:00
} ;
2010-08-30 20:30:20 +00:00
2006-05-04 15:36:41 +00:00
static void
2007-02-19 15:30:06 +00:00
expert_goto_pkt_cb ( GtkTreeSelection * selection , gpointer data _U_ )
2006-05-04 15:36:41 +00:00
{
GtkTreeIter iter ;
GtkTreeModel * model ;
gchar * pkt ;
gchar * grp ;
if ( gtk_tree_selection_get_selected ( selection , & model , & iter ) )
{
2010-08-30 16:10:01 +00:00
gtk_tree_model_get ( model , & iter ,
2009-05-19 15:53:26 +00:00
PROTOCOL_COLUMN , & pkt ,
GROUP_COLUMN , & grp ,
- 1 ) ;
2006-05-04 15:36:41 +00:00
2009-09-02 05:48:38 +00:00
if ( strcmp ( grp , packet ) = = 0 ) {
2006-05-04 15:36:41 +00:00
cf_goto_frame ( & cfile , atoi ( pkt ) ) ;
}
g_free ( pkt ) ;
}
}
2005-11-25 23:42:52 +00:00
static void
error_create_popup_menu ( error_equiv_table * err )
{
2010-08-09 16:16:58 +00:00
GtkUIManager * ui_manager ;
GtkActionGroup * action_group ;
GError * error = NULL ;
err - > select = gtk_tree_view_get_selection ( GTK_TREE_VIEW ( err - > tree_view ) ) ;
gtk_tree_selection_set_mode ( err - > select , GTK_SELECTION_SINGLE ) ;
2010-08-23 19:29:08 +00:00
g_signal_connect ( G_OBJECT ( err - > select ) , " changed " , G_CALLBACK ( expert_goto_pkt_cb ) , NULL ) ;
2010-08-09 16:16:58 +00:00
2010-08-30 16:10:01 +00:00
action_group = gtk_action_group_new ( " ExpertFilterPopupActionGroup " ) ;
2010-08-10 11:08:18 +00:00
gtk_action_group_add_actions ( action_group , /* the action group */
2010-08-19 19:05:56 +00:00
expert_popup_entries , /* an array of action descriptions */
G_N_ELEMENTS ( expert_popup_entries ) , /* the number of entries */
2010-08-10 11:08:18 +00:00
err ) ; /* data to pass to the action callbacks */
2010-08-09 16:16:58 +00:00
ui_manager = gtk_ui_manager_new ( ) ;
gtk_ui_manager_insert_action_group ( ui_manager , action_group , 0 ) ;
2010-08-30 16:10:01 +00:00
gtk_ui_manager_add_ui_from_string ( ui_manager , ui_desc_expert_filter_popup , - 1 , & error ) ;
if ( error ! = NULL )
{
fprintf ( stderr , " Warning: building expert filter popup failed: %s \n " ,
error - > message ) ;
g_error_free ( error ) ;
error = NULL ;
}
2010-08-19 19:05:56 +00:00
err - > menu = gtk_ui_manager_get_widget ( ui_manager , " /ExpertFilterPopup " ) ;
2010-08-09 16:16:58 +00:00
g_signal_connect ( err - > tree_view , " button_press_event " , G_CALLBACK ( error_show_popup_menu_cb ) , err ) ;
2005-11-25 23:42:52 +00:00
}
void
2009-08-19 18:37:13 +00:00
init_error_table ( error_equiv_table * err , guint num_procs , GtkWidget * vbox )
2005-11-25 23:42:52 +00:00
{
2006-05-04 15:36:41 +00:00
GtkTreeStore * store ;
GtkWidget * tree ;
GtkTreeViewColumn * column ;
GtkCellRenderer * renderer ;
GtkTreeSortable * sortable ;
/* Create the store */
store = gtk_tree_store_new ( 4 , /* Total number of columns */
2009-08-19 18:37:13 +00:00
G_TYPE_POINTER , /* Group */
2006-05-04 15:36:41 +00:00
G_TYPE_STRING , /* Protocol */
G_TYPE_STRING , /* Summary */
2007-04-20 23:10:03 +00:00
G_TYPE_INT ) ; /* Count */
2006-05-04 15:36:41 +00:00
/* Create a view */
tree = gtk_tree_view_new_with_model ( GTK_TREE_MODEL ( store ) ) ;
err - > tree_view = GTK_TREE_VIEW ( tree ) ;
sortable = GTK_TREE_SORTABLE ( store ) ;
2009-08-24 16:11:00 +00:00
# if GTK_CHECK_VERSION(2,6,0)
/* Speed up the list display */
2009-09-02 05:48:38 +00:00
gtk_tree_view_set_fixed_height_mode ( err - > tree_view , TRUE ) ;
2009-08-24 16:11:00 +00:00
# endif
2006-05-04 15:36:41 +00:00
gtk_tree_view_set_headers_clickable ( GTK_TREE_VIEW ( tree ) , FALSE ) ;
/* The view now holds a reference. We can get rid of our own reference */
g_object_unref ( G_OBJECT ( store ) ) ;
2009-05-19 15:53:26 +00:00
/* Create a cell renderer */
2006-05-04 15:36:41 +00:00
renderer = gtk_cell_renderer_text_new ( ) ;
/* Create the first column, associating the "text" attribute of the
* cell_renderer to the first column of the model */
2009-09-02 05:48:38 +00:00
column = gtk_tree_view_column_new_with_attributes ( " Group " , renderer , NULL ) ;
2009-08-22 16:17:42 +00:00
gtk_tree_view_column_set_sort_column_id ( column , GROUP_COLUMN ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_column_set_resizable ( column , TRUE ) ;
2010-08-30 16:10:01 +00:00
gtk_tree_view_column_set_cell_data_func ( column , renderer , str_ptr_data_func ,
2009-09-02 05:48:38 +00:00
GINT_TO_POINTER ( GROUP_COLUMN ) , NULL ) ;
gtk_tree_sortable_set_sort_func ( sortable , GROUP_COLUMN , str_ptr_sort_func ,
GINT_TO_POINTER ( GROUP_COLUMN ) , NULL ) ;
2009-08-24 16:11:00 +00:00
gtk_tree_view_column_set_sizing ( column , GTK_TREE_VIEW_COLUMN_FIXED ) ;
gtk_tree_view_column_set_min_width ( column , 80 ) ;
2006-05-04 15:36:41 +00:00
/* Add the column to the view. */
gtk_tree_view_append_column ( GTK_TREE_VIEW ( err - > tree_view ) , column ) ;
2010-08-30 16:10:01 +00:00
2006-05-04 15:36:41 +00:00
/* Second column.. Protocol. */
renderer = gtk_cell_renderer_text_new ( ) ;
column = gtk_tree_view_column_new_with_attributes ( " Protocol " , renderer , " text " , PROTOCOL_COLUMN , NULL ) ;
2009-08-22 16:17:42 +00:00
gtk_tree_view_column_set_sort_column_id ( column , PROTOCOL_COLUMN ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_column_set_resizable ( column , TRUE ) ;
2010-08-30 16:10:01 +00:00
gtk_tree_view_column_set_cell_data_func ( column , renderer , proto_data_func ,
2009-09-02 05:48:38 +00:00
GINT_TO_POINTER ( PROTOCOL_COLUMN ) , NULL ) ;
gtk_tree_sortable_set_sort_func ( sortable , PROTOCOL_COLUMN , proto_sort_func ,
GINT_TO_POINTER ( PROTOCOL_COLUMN ) , NULL ) ;
2009-08-24 16:11:00 +00:00
gtk_tree_view_column_set_sizing ( column , GTK_TREE_VIEW_COLUMN_FIXED ) ;
2009-08-24 20:33:49 +00:00
gtk_tree_view_column_set_min_width ( column , 40 ) ;
gtk_tree_view_column_set_fixed_width ( column , 100 ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_append_column ( GTK_TREE_VIEW ( err - > tree_view ) , column ) ;
2010-08-30 16:10:01 +00:00
2006-05-04 15:36:41 +00:00
/* Third column.. Summary. */
renderer = gtk_cell_renderer_text_new ( ) ;
column = gtk_tree_view_column_new_with_attributes ( " Summary " , renderer , " text " , SUMMARY_COLUMN , NULL ) ;
2009-08-22 16:17:42 +00:00
gtk_tree_view_column_set_sort_column_id ( column , SUMMARY_COLUMN ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_column_set_resizable ( column , TRUE ) ;
2009-08-24 16:11:00 +00:00
gtk_tree_view_column_set_sizing ( column , GTK_TREE_VIEW_COLUMN_FIXED ) ;
2009-08-24 20:33:49 +00:00
gtk_tree_view_column_set_min_width ( column , 80 ) ;
gtk_tree_view_column_set_fixed_width ( column , 230 ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_append_column ( GTK_TREE_VIEW ( err - > tree_view ) , column ) ;
2010-08-30 16:10:01 +00:00
2006-05-04 15:36:41 +00:00
/* Last column.. Count. */
2009-09-02 05:48:38 +00:00
renderer = gtk_cell_renderer_text_new ( ) ;
/* right align */
g_object_set ( G_OBJECT ( renderer ) , " xalign " , 1.0 , NULL ) ;
2006-05-04 15:36:41 +00:00
column = gtk_tree_view_column_new_with_attributes ( " Count " , renderer , " text " , COUNT_COLUMN , NULL ) ;
2009-08-22 16:17:42 +00:00
gtk_tree_view_column_set_sort_column_id ( column , COUNT_COLUMN ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_column_set_resizable ( column , TRUE ) ;
2009-08-24 16:11:00 +00:00
gtk_tree_view_column_set_sizing ( column , GTK_TREE_VIEW_COLUMN_FIXED ) ;
gtk_tree_view_column_set_min_width ( column , 80 ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_append_column ( GTK_TREE_VIEW ( err - > tree_view ) , column ) ;
2010-08-30 16:10:01 +00:00
2006-12-11 03:32:01 +00:00
err - > scrolled_window = scrolled_window_new ( NULL , NULL ) ;
2006-05-04 15:36:41 +00:00
gtk_container_add ( GTK_CONTAINER ( err - > scrolled_window ) , GTK_WIDGET ( err - > tree_view ) ) ;
2006-12-11 03:32:01 +00:00
gtk_box_pack_start ( GTK_BOX ( vbox ) , err - > scrolled_window , TRUE , TRUE , 0 ) ;
2006-05-04 15:36:41 +00:00
gtk_tree_view_set_search_column ( err - > tree_view , SUMMARY_COLUMN ) ; /* Allow searching the summary */
gtk_tree_view_set_reorderable ( err - > tree_view , TRUE ) ; /* Allow user to reorder data with drag n drop */
2010-08-30 16:10:01 +00:00
2006-05-04 15:36:41 +00:00
/* Now enable the sorting of each column */
gtk_tree_view_set_rules_hint ( GTK_TREE_VIEW ( err - > tree_view ) , TRUE ) ;
gtk_tree_view_set_headers_clickable ( GTK_TREE_VIEW ( err - > tree_view ) , TRUE ) ;
2005-11-25 23:42:52 +00:00
2006-12-11 03:32:01 +00:00
gtk_widget_show ( err - > scrolled_window ) ;
2005-11-25 23:42:52 +00:00
2006-03-19 20:26:45 +00:00
err - > num_procs = num_procs ;
2009-08-19 18:37:13 +00:00
err - > text = g_string_chunk_new ( 100 ) ;
err - > procs_array = g_array_sized_new ( FALSE , FALSE , sizeof ( error_procedure_t ) , num_procs ) ;
2005-11-25 23:42:52 +00:00
2006-12-11 03:32:01 +00:00
/* create popup menu for this table */
error_create_popup_menu ( err ) ;
2005-11-25 23:42:52 +00:00
}
void
init_error_table_row ( error_equiv_table * err , const expert_info_t * expert_data )
{
2009-08-19 18:37:13 +00:00
guint old_num_procs = err - > num_procs ;
2005-11-25 23:42:52 +00:00
gint row = 0 ;
2009-08-19 18:37:13 +00:00
error_procedure_t * procedure ;
2006-05-04 15:36:41 +00:00
GtkTreeStore * store ;
2009-08-19 18:37:13 +00:00
GtkTreeIter new_iter ;
2009-08-26 17:26:26 +00:00
gchar num [ 10 ] ;
2006-05-04 15:36:41 +00:00
2006-05-15 02:43:39 +00:00
/* we have discovered a new procedure. Extend the table accordingly */
2005-11-25 23:42:52 +00:00
row = find_summary_data ( err , expert_data ) ;
2006-05-15 02:43:39 +00:00
if ( row = = - 1 ) {
2009-08-19 18:37:13 +00:00
error_procedure_t new_procedure ;
2006-05-04 15:36:41 +00:00
/* First time we have seen this event so initialize memory table */
row = old_num_procs ; /* Number of expert events since this is a new event */
2009-08-19 18:37:13 +00:00
new_procedure . count = 0 ; /* count of events for this item */
new_procedure . fvalue_value = NULL ; /* Filter string value */
2009-08-26 17:26:26 +00:00
2009-08-19 18:37:13 +00:00
g_array_append_val ( err - > procs_array , new_procedure ) ;
procedure = & g_array_index ( err - > procs_array , error_procedure_t , row ) ;
2010-08-30 16:10:01 +00:00
2006-05-15 02:43:39 +00:00
/* Create the item in our memory table */
2009-09-09 19:34:14 +00:00
procedure - > entries [ 0 ] = ( char * ) g_string_chunk_insert_const ( err - > text , expert_data - > protocol ) ; /* Protocol */
procedure - > entries [ 1 ] = ( char * ) g_string_chunk_insert_const ( err - > text , expert_data - > summary ) ; /* Summary */
2006-05-04 15:36:41 +00:00
/* Create a new item in our tree view */
store = GTK_TREE_STORE ( gtk_tree_view_get_model ( err - > tree_view ) ) ; /* Get store */
2009-08-19 18:37:13 +00:00
gtk_tree_store_append ( store , & procedure - > iter , NULL ) ; /* Acquire an iterator */
2010-08-30 16:10:01 +00:00
/* match_strval return a static constant or null */
2009-08-19 18:37:13 +00:00
gtk_tree_store_set ( store , & procedure - > iter ,
2010-08-30 16:10:01 +00:00
GROUP_COLUMN , match_strval ( expert_data - > group , expert_group_vals ) ,
2009-08-26 17:26:26 +00:00
PROTOCOL_COLUMN , procedure - > entries [ 0 ] ,
SUMMARY_COLUMN , procedure - > entries [ 1 ] , - 1 ) ;
2010-08-30 16:10:01 +00:00
2006-05-04 15:36:41 +00:00
/* If an expert item was passed then build the filter string */
2006-11-23 21:16:46 +00:00
if ( expert_data - > pitem ) {
char * filter ;
2010-08-30 16:10:01 +00:00
2009-08-21 11:03:30 +00:00
g_assert ( PITEM_FINFO ( expert_data - > pitem ) ) ;
2009-08-09 17:57:31 +00:00
filter = proto_construct_match_selected_string ( PITEM_FINFO ( expert_data - > pitem ) , NULL ) ;
2006-11-24 18:25:23 +00:00
if ( filter ! = NULL )
2009-09-09 19:34:14 +00:00
procedure - > fvalue_value = g_string_chunk_insert_const ( err - > text , filter ) ;
2006-03-19 20:26:45 +00:00
}
2006-05-04 15:36:41 +00:00
/* Store the updated count of events */
err - > num_procs = + + old_num_procs ;
2006-05-15 02:43:39 +00:00
}
2006-05-04 15:36:41 +00:00
/* Update our memory table with event data */
2009-08-19 18:37:13 +00:00
procedure = & g_array_index ( err - > procs_array , error_procedure_t , row ) ;
procedure - > count + + ; /* increment the count of events for this item */
2006-05-04 15:36:41 +00:00
/* Update the tree with new count for this event */
store = GTK_TREE_STORE ( gtk_tree_view_get_model ( err - > tree_view ) ) ;
2010-08-30 16:10:01 +00:00
gtk_tree_store_set ( store , & procedure - > iter ,
COUNT_COLUMN , procedure - > count ,
2009-08-24 20:33:49 +00:00
- 1 ) ;
2009-08-26 17:26:26 +00:00
g_snprintf ( num , sizeof ( num ) , " %d " , expert_data - > packet_num ) ;
2009-08-24 20:33:49 +00:00
#if 0
This does not have a big performance improvment : (
if GTK_CHECK_VERSION ( 2 , 10 , 0 )
gtk_tree_store_insert_with_values ( store ,
& new_iter , /* *iter */
& procedure - > iter , /* *parent*/
G_MAXINT , /* position */
# else
2010-08-30 16:10:01 +00:00
/* FIXME gtk is plagued with slow algorithms
2009-08-24 20:33:49 +00:00
gtk_tree_store_append call new_path and its nice recursive linear search . . . .
*/
if ( procedure - > count > 1000 ) {
2010-08-30 16:10:01 +00:00
/* If there's more than 1000 sub rows give up and prepend new rows, at least
2009-08-24 20:33:49 +00:00
it will end in a reasonable time . Anyway with so many rows it ' s not
2010-08-30 16:10:01 +00:00
very useful and if sorted the right order is restored .
2009-08-24 20:33:49 +00:00
*/
gtk_tree_store_prepend ( store , & new_iter , & procedure - > iter ) ;
}
else {
gtk_tree_store_append ( store , & new_iter , & procedure - > iter ) ;
}
2006-05-04 15:36:41 +00:00
gtk_tree_store_set ( store , & new_iter ,
2009-08-24 20:33:49 +00:00
# endif
2009-09-02 05:48:38 +00:00
GROUP_COLUMN , packet ,
2009-08-26 17:26:26 +00:00
PROTOCOL_COLUMN , num ,
2009-05-19 15:53:26 +00:00
COUNT_COLUMN , 1 ,
- 1 ) ;
2005-11-25 23:42:52 +00:00
}
void
reset_error_table_data ( error_equiv_table * err )
{
2006-05-04 15:36:41 +00:00
GtkTreeStore * store ;
2005-11-25 23:42:52 +00:00
2006-05-04 15:36:41 +00:00
store = GTK_TREE_STORE ( gtk_tree_view_get_model ( err - > tree_view ) ) ;
gtk_tree_store_clear ( store ) ;
2005-11-25 23:42:52 +00:00
err - > num_procs = 0 ;
2009-08-23 18:13:03 +00:00
/* g_string_chunk_clear() is introduced in glib 2.14 */
g_string_chunk_free ( err - > text ) ;
err - > text = g_string_chunk_new ( 100 ) ;
2009-08-19 18:37:13 +00:00
g_array_set_size ( err - > procs_array , 0 ) ;
2005-11-25 23:42:52 +00:00
}
void
free_error_table_data ( error_equiv_table * err )
{
2007-12-03 21:55:44 +00:00
err - > num_procs = 0 ;
2009-08-19 18:37:13 +00:00
g_string_chunk_free ( err - > text ) ;
g_array_free ( err - > procs_array , TRUE ) ;
2005-11-25 23:42:52 +00:00
}