diff options
author | Stephen Fisher <steve@stephen-fisher.com> | 2007-03-03 03:14:00 +0000 |
---|---|---|
committer | Stephen Fisher <steve@stephen-fisher.com> | 2007-03-03 03:14:00 +0000 |
commit | 2c5ccc66efff219fa0ae17b7a07f80aa7d20e93f (patch) | |
tree | 26d61397f90396266d7816d8ec264f5f86ac0756 /gtk | |
parent | 7f88f16077dcca93ec4fcfd22995c4edf6b6b674 (diff) |
Update object export code:
- Add to User's Guide
- Add a help button
- Move a lot of code into the shared export_object.c file and out of
dissector specific file export_object_http.c. This will make adding
additional protocols much easier.
- Change comment in packet-http.c to reflect new name (Export Object)
- Various other minor improvements
svn path=/trunk/; revision=20961
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/export_object.c | 269 | ||||
-rw-r--r-- | gtk/export_object.h | 17 | ||||
-rw-r--r-- | gtk/export_object_http.c | 243 | ||||
-rw-r--r-- | gtk/help_dlg.c | 3 | ||||
-rw-r--r-- | gtk/help_dlg.h | 1 |
5 files changed, 270 insertions, 263 deletions
diff --git a/gtk/export_object.c b/gtk/export_object.c index bb986ca643..7253301848 100644 --- a/gtk/export_object.c +++ b/gtk/export_object.c @@ -34,15 +34,17 @@ /* This feature has not been ported to GTK1 */ #if GTK_MAJOR_VERSION >= 2 -#include "export_object.h" - #include <alert_box.h> #include <simple_dialog.h> #include <epan/packet_info.h> +#include <epan/prefs.h> #include <epan/tap.h> +#include <gtk/compat_macros.h> +#include <gtk/dlg_utils.h> #include <gtk/file_dlg.h> #include <gtk/gui_utils.h> +#include <gtk/help_dlg.h> #include <gtk/main.h> #include <wiretap/file_util.h> @@ -54,6 +56,18 @@ #include <unistd.h> #endif +#include "export_object.h" + +enum { + EO_PKT_NUM_COLUMN, + EO_HOSTNAME_COLUMN, + EO_CONTENT_TYPE_COLUMN, + EO_BYTES_COLUMN, + EO_FILENAME_COLUMN, + EO_NUM_COLUMNS /* must be last */ +}; + + static void eo_remember_this_row(GtkTreeModel *model _U_, GtkTreePath *path, GtkTreeIter *iter _U_, gpointer arg) @@ -74,14 +88,14 @@ eo_remember_this_row(GtkTreeModel *model _U_, GtkTreePath *path, cf_goto_frame(&cfile, entry->pkt_num); } -void +static void eo_remember_row_num(GtkTreeSelection *sel, gpointer data) { gtk_tree_selection_selected_foreach(sel, eo_remember_this_row, data); } -void +static void eo_win_destroy_cb(GtkWindow *win _U_, gpointer data) { export_object_list_t *object_list = data; @@ -90,17 +104,17 @@ eo_win_destroy_cb(GtkWindow *win _U_, gpointer data) remove_tap_listener(object_list); unprotect_thread_critical_region(); - g_free(object_list); + g_free(object_list); } -void +static void eo_save_entry(gchar *save_as_filename, export_object_entry_t *entry) { int to_fd; - to_fd = eth_open(save_as_filename, O_WRONLY | O_CREAT | O_TRUNC | + to_fd = eth_open(save_as_filename, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0644); - if(to_fd == -1) { + if(to_fd == -1) { /* An error occurred */ open_failure_alert_box(save_as_filename, errno, TRUE); g_free(save_as_filename); return; @@ -123,7 +137,7 @@ eo_save_entry(gchar *save_as_filename, export_object_entry_t *entry) } -void +static void eo_save_clicked_cb(GtkWidget *widget _U_, gpointer arg) { GtkWidget *save_as_w; @@ -134,7 +148,7 @@ eo_save_clicked_cb(GtkWidget *widget _U_, gpointer arg) object_list->row_selected); if(!entry) { - simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "No object was selected for saving. Please click on an object and click on save again."); + simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "No object was selected for saving. Please click on an object and click save again."); return; } @@ -153,10 +167,10 @@ eo_save_clicked_cb(GtkWidget *widget _U_, gpointer arg) window_destroy(save_as_w); } -void +static void eo_save_all_clicked_cb(GtkWidget *widget _U_, gpointer arg) { - gchar *save_as_fullpath = NULL; + gchar *save_as_fullpath; export_object_list_t *object_list = arg; export_object_entry_t *entry; GtkWidget *save_in_w; @@ -172,7 +186,7 @@ eo_save_all_clicked_cb(GtkWidget *widget _U_, gpointer arg) if(gtk_dialog_run(GTK_DIALOG(save_in_w)) == GTK_RESPONSE_ACCEPT) { /* Find the last entry in the SList, then start at the beginning - saving each one. */ + saving each one until we reach the last entry. */ last_slist_entry = g_slist_last(object_list->entries); last_slist_entry_num = g_slist_position(object_list->entries, last_slist_entry); @@ -181,15 +195,238 @@ eo_save_all_clicked_cb(GtkWidget *widget _U_, gpointer arg) entry = g_slist_nth_data(object_list->entries, i); - save_as_fullpath = g_strdup_printf("%s%c%s", gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_in_w)), G_DIR_SEPARATOR, entry->filename); + save_as_fullpath = g_build_filename(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(save_in_w)), entry->filename, NULL); eo_save_entry(save_as_fullpath, entry); - } - } window_destroy(save_in_w); } +static void +eo_reset(void *tapdata) +{ + export_object_list_t *object_list = tapdata; + + if(object_list->entries) { + g_slist_free(object_list->entries); + object_list->entries = NULL; + } + + object_list->iter = NULL; + object_list->row_selected = -1; +} + +static void +eo_draw(void *tapdata) +{ + export_object_list_t *object_list = tapdata; + export_object_entry_t *eo_entry; + + GSList *slist_entry = NULL; + GSList *last_slist_entry = NULL; + gint last_slist_entry_num; + GtkTreeIter new_iter; + gchar *column_text[EO_NUM_COLUMNS]; + + last_slist_entry = g_slist_last(object_list->entries); + last_slist_entry_num = g_slist_position(object_list->entries, + last_slist_entry); + + while(object_list->slist_pos <= last_slist_entry_num && + last_slist_entry_num != -1) { + slist_entry = g_slist_nth(object_list->entries, + object_list->slist_pos); + eo_entry = slist_entry->data; + + column_text[0] = g_strdup_printf("%u", eo_entry->pkt_num); + column_text[1] = g_strdup_printf("%s", eo_entry->hostname); + column_text[2] = g_strdup_printf("%s", eo_entry->content_type); + column_text[3] = g_strdup_printf("%u", eo_entry->payload_len); + column_text[4] = g_strdup_printf("%s", eo_entry->filename); + + gtk_tree_store_append(object_list->store, &new_iter, + object_list->iter); + + gtk_tree_store_set(object_list->store, &new_iter, + EO_PKT_NUM_COLUMN, column_text[0], + EO_HOSTNAME_COLUMN, column_text[1], + EO_CONTENT_TYPE_COLUMN, column_text[2], + EO_BYTES_COLUMN, column_text[3], + EO_FILENAME_COLUMN, column_text[4], + -1); + + g_free(column_text[0]); + g_free(column_text[1]); + g_free(column_text[2]); + g_free(column_text[3]); + g_free(column_text[4]); + + object_list->slist_pos++; + } +} + +void +export_object_window(gchar *tapname, tap_packet_cb tap_packet) +{ + GtkWidget *sw; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeSelection *selection; + GtkWidget *vbox, *bbox, *help_bt, *close_bt, *save_bt, *save_all_bt; + GtkTooltips *button_bar_tips; + GString *error_msg; + export_object_list_t *object_list; + gchar *window_title; + + /* Initialize our object list structure */ + object_list = g_malloc0(sizeof(export_object_list_t)); + + /* Data will be gathered via a tap callback */ + error_msg = register_tap_listener(tapname, object_list, NULL, + eo_reset, + tap_packet, + eo_draw); + + if (error_msg) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, + "Can't register http tap: %s\n", error_msg->str); + g_string_free(error_msg, TRUE); + return; + } + + /* Set up our GUI window */ + button_bar_tips = gtk_tooltips_new(); + + window_title = g_strdup_printf("Wireshark: %s object list", tapname); + object_list->dlg = dlg_window_new(window_title); + g_free(window_title); + + gtk_window_set_default_size(GTK_WINDOW(object_list->dlg), + DEF_WIDTH, DEF_HEIGHT); + + vbox = gtk_vbox_new(FALSE, 5); + + gtk_container_border_width(GTK_CONTAINER(vbox), 5); + gtk_container_add(GTK_CONTAINER(object_list->dlg), vbox); + + sw = scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), + GTK_SHADOW_IN); + + gtk_container_add(GTK_CONTAINER(vbox), sw); + + object_list->store = gtk_tree_store_new(EO_NUM_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING); + + object_list->tree = tree_view_new(GTK_TREE_MODEL(object_list->store)); + + object_list->tree_view = GTK_TREE_VIEW(object_list->tree); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Packet num", + renderer, + "text", + EO_PKT_NUM_COLUMN, + NULL); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column(object_list->tree_view, column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Hostname", + renderer, + "text", + EO_HOSTNAME_COLUMN, + NULL); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column(object_list->tree_view, column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Content Type", + renderer, + "text", + EO_CONTENT_TYPE_COLUMN, + NULL); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column(object_list->tree_view, column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Bytes", + renderer, + "text", + EO_BYTES_COLUMN, + NULL); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column(object_list->tree_view, column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Filename", + renderer, + "text", + EO_FILENAME_COLUMN, + NULL); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_append_column(object_list->tree_view, column); + + gtk_container_add(GTK_CONTAINER(sw), object_list->tree); + + selection = gtk_tree_view_get_selection(object_list->tree_view); + SIGNAL_CONNECT(selection, "changed", eo_remember_row_num, object_list); + + + bbox = gtk_hbox_new(FALSE, 5); + + /* Help button */ + help_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_HELP); + SIGNAL_CONNECT(help_bt, "clicked", topic_cb, HELP_EXPORT_OBJECT_LIST); + gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips), help_bt, + "Show help on this dialog", NULL); + gtk_box_pack_start(GTK_BOX(bbox), help_bt, FALSE, FALSE, 0); + + /* Save All button */ + save_all_bt = gtk_button_new_with_mnemonic("Save _All"); + SIGNAL_CONNECT(save_all_bt, "clicked", eo_save_all_clicked_cb, + object_list); + gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips), save_all_bt, + "Save all listed objects with their displayed " + "filenames.", NULL); + gtk_box_pack_end(GTK_BOX(bbox), save_all_bt, FALSE, FALSE, 0); + + /* Save button */ + save_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_SAVE_AS); + SIGNAL_CONNECT(save_bt, "clicked", eo_save_clicked_cb, object_list); + gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips), save_bt, + "Saves the currently selected content to a file.", + NULL); + gtk_box_pack_end(GTK_BOX(bbox), save_bt, FALSE, FALSE, 0); + + /* Close button */ + close_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE); + GTK_WIDGET_SET_FLAGS(close_bt, GTK_CAN_DEFAULT); + gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips), close_bt, + "Close this dialog.", NULL); + gtk_box_pack_end(GTK_BOX(bbox), close_bt, FALSE, FALSE, 0); + + /* Pack the buttons into the "button box" */ + gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); + gtk_widget_show(bbox); + + /* Setup cancel/delete/destroy signal handlers */ + SIGNAL_CONNECT(object_list->dlg, "delete_event", + window_delete_event_cb, NULL); + SIGNAL_CONNECT(object_list->dlg, "destroy", + eo_win_destroy_cb, NULL); + window_set_cancel_button(object_list->dlg, close_bt, + window_cancel_button_cb); + + /* Show the window */ + gtk_widget_show_all(object_list->dlg); + window_present(object_list->dlg); + + cf_retap_packets(&cfile, FALSE); +} + #endif /* GTK_MAJOR_VERSION >= 2 */ diff --git a/gtk/export_object.h b/gtk/export_object.h index 861fee5c7a..dcf588e4aa 100644 --- a/gtk/export_object.h +++ b/gtk/export_object.h @@ -1,5 +1,5 @@ /* export_object.h - * Declarations of routines for tracking & saving content found in HTTP streams + * Common routines for tracking & saving objects found in streams of data * Copyright 2007, Stephen Fisher <stephentfisher@yahoo.com> * * $Id$ @@ -28,15 +28,6 @@ #define __EXPORT_OBJECT_H__ /* Common between protocols */ -enum { - EO_PKT_NUM_COLUMN, - EO_HOSTNAME_COLUMN, - EO_CONTENT_TYPE_COLUMN, - EO_BYTES_COLUMN, - EO_FILENAME_COLUMN, - EO_NUM_COLUMNS /* must be last */ -}; - typedef struct _export_object_list_t { GSList *entries; GtkWidget *tree, *dlg; @@ -55,11 +46,7 @@ typedef struct _export_object_entry_t { guint8 *payload_data; } export_object_entry_t; -void eo_remember_row_num(GtkTreeSelection *sel, gpointer data); -void eo_win_destroy_cb(GtkWindow *win _U_, gpointer data); -void eo_save_entry_cb(GtkWidget *widget, export_object_entry_t *entry); -void eo_save_clicked_cb(GtkWidget *widget _U_, gpointer arg); -void eo_save_all_clicked_cb(GtkWidget *widget _U_, gpointer arg); +void export_object_window(gchar *tapname, tap_packet_cb tap_packet); /* Protocol specific */ void eo_http_cb(GtkWidget *widget _U_, gpointer data _U_); diff --git a/gtk/export_object_http.c b/gtk/export_object_http.c index 6465612134..2665f595cd 100644 --- a/gtk/export_object_http.c +++ b/gtk/export_object_http.c @@ -35,36 +35,12 @@ /* This feature has not been ported to GTK1 */ #if GTK_MAJOR_VERSION >= 2 -#include "export_object.h" - #include <epan/dissectors/packet-http.h> + #include <epan/emem.h> -#include <epan/epan.h> -#include <epan/prefs.h> #include <epan/tap.h> -#include <file.h> -#include <globals.h> -#include <simple_dialog.h> -#include <stat_menu.h> -#include <gtk/compat_macros.h> -#include <gtk/dlg_utils.h> -#include <gtk/file_dlg.h> -#include <gtk/gui_utils.h> -#include <gtk/gui_stat_menu.h> - -static void -eo_http_reset(void *tapdata) -{ - export_object_list_t *object_list = tapdata; - - if(object_list->entries) { - g_slist_free(object_list->entries); - object_list->entries = NULL; - } - object_list->iter = NULL; - object_list->row_selected = -1; -} +#include "export_object.h" static int eo_http_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, @@ -74,225 +50,28 @@ eo_http_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, const http_info_value_t *stat_info = data; export_object_entry_t *entry; - if(stat_info->content_type && - g_ascii_strncasecmp(stat_info->content_type, "<NULL>", 6) != 0) { + if(stat_info->content_type) { /* We have new data waiting */ entry = g_malloc(sizeof(export_object_entry_t)); entry->pkt_num = pinfo->fd->num; - entry->hostname = g_strdup(stat_info->http_host); - entry->content_type = g_strdup(stat_info->content_type); - - if(stat_info->request_uri) - entry->filename = - g_path_get_basename(stat_info->request_uri); - else - entry->filename = NULL; - + entry->hostname = stat_info->http_host; + entry->content_type = stat_info->content_type; + entry->filename = g_path_get_basename(stat_info->request_uri); entry->payload_len = stat_info->payload_len; - entry->payload_data = g_memdup(stat_info->payload_data, - stat_info->payload_len); + entry->payload_data = stat_info->payload_data; object_list->entries = g_slist_append(object_list->entries, entry); - return 1; + return 1; /* State changed - window should be redrawn */ } else { - return 0; - } -} - -static void -eo_http_draw(void *tapdata) -{ - export_object_list_t *object_list = tapdata; - export_object_entry_t *eo_entry; - - GSList *slist_entry = NULL; - GSList *last_slist_entry = NULL; - gint last_slist_entry_num; - GtkTreeIter new_iter; - gchar *column_text[EO_NUM_COLUMNS]; - - last_slist_entry = g_slist_last(object_list->entries); - last_slist_entry_num = g_slist_position(object_list->entries, - last_slist_entry); - - while(object_list->slist_pos <= last_slist_entry_num && - last_slist_entry_num != -1) { - slist_entry = g_slist_nth(object_list->entries, - object_list->slist_pos); - eo_entry = slist_entry->data; - - column_text[0] = g_strdup_printf("%u", eo_entry->pkt_num); - column_text[1] = g_strdup_printf("%s", eo_entry->hostname); - column_text[2] = g_strdup_printf("%s", eo_entry->content_type); - column_text[3] = g_strdup_printf("%u", eo_entry->payload_len); - column_text[4] = g_strdup_printf("%s", eo_entry->filename); - - gtk_tree_store_append(object_list->store, &new_iter, - object_list->iter); - - gtk_tree_store_set(object_list->store, &new_iter, - EO_PKT_NUM_COLUMN, column_text[0], - EO_HOSTNAME_COLUMN, column_text[1], - EO_CONTENT_TYPE_COLUMN, column_text[2], - EO_BYTES_COLUMN, column_text[3], - EO_FILENAME_COLUMN, column_text[4], - -1); - - g_free(column_text[0]); - g_free(column_text[1]); - g_free(column_text[2]); - g_free(column_text[3]); - g_free(column_text[4]); - - object_list->slist_pos++; + return 0; /* State unchanged - no window updates needed */ } } void eo_http_cb(GtkWidget *widget _U_, gpointer data _U_) { - GString *error_msg; - GtkWidget *sw; - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; - GtkTreeSelection *selection; - GtkWidget *vbox, *bbox, *close_bt, *save_bt, *save_all_bt; - GtkTooltips *button_bar_tips; - - export_object_list_t *object_list = g_malloc0(sizeof(export_object_list_t)); - - button_bar_tips = gtk_tooltips_new(); - - /* Data will be gathered via a tap callback */ - error_msg = register_tap_listener("http", object_list, NULL, - eo_http_reset, - eo_http_packet, - eo_http_draw); - - if (error_msg) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "Can't register http tap: %s\n", error_msg->str); - g_string_free(error_msg, TRUE); - return; - } - - object_list->dlg = dlg_window_new("Wireshark: HTTP Content List"); - - gtk_window_set_default_size(GTK_WINDOW(object_list->dlg), - DEF_WIDTH, DEF_HEIGHT); - - vbox = gtk_vbox_new(FALSE, 5); - - gtk_container_border_width(GTK_CONTAINER(vbox), 5); - gtk_container_add(GTK_CONTAINER(object_list->dlg), vbox); - - sw = scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), - GTK_SHADOW_IN); - - gtk_container_add(GTK_CONTAINER(vbox), sw); - - object_list->store = gtk_tree_store_new(EO_NUM_COLUMNS, - G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING); - - object_list->tree = tree_view_new(GTK_TREE_MODEL(object_list->store)); - - object_list->tree_view = GTK_TREE_VIEW(object_list->tree); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Packet num", - renderer, - "text", - EO_PKT_NUM_COLUMN, - NULL); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column(object_list->tree_view, column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Hostname", - renderer, - "text", - EO_HOSTNAME_COLUMN, - NULL); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column(object_list->tree_view, column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Content Type", - renderer, - "text", - EO_CONTENT_TYPE_COLUMN, - NULL); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column(object_list->tree_view, column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Bytes", - renderer, - "text", - EO_BYTES_COLUMN, - NULL); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column(object_list->tree_view, column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Filename", - renderer, - "text", - EO_FILENAME_COLUMN, - NULL); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column(object_list->tree_view, column); - - gtk_container_add(GTK_CONTAINER(sw), object_list->tree); - - selection = gtk_tree_view_get_selection(object_list->tree_view); - SIGNAL_CONNECT(selection, "changed", eo_remember_row_num, object_list); - - bbox = gtk_hbox_new(FALSE, 5); - - /* Save All button */ - save_all_bt = gtk_button_new_with_mnemonic("Save _All"); - SIGNAL_CONNECT(save_all_bt, "clicked", eo_save_all_clicked_cb, - object_list); - gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips), save_all_bt, - "Save all displayed objects with their displayed " - "filenames.", NULL); - gtk_box_pack_end(GTK_BOX(bbox), save_all_bt, FALSE, FALSE, 0); - - /* Save button */ - save_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_SAVE); - SIGNAL_CONNECT(save_bt, "clicked", eo_save_clicked_cb, object_list); - gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips), save_bt, - "Saves the currently selected content to a file.", - NULL); - gtk_box_pack_end(GTK_BOX(bbox), save_bt, FALSE, FALSE, 0); - - /* Close button */ - close_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE); - window_set_cancel_button(object_list->dlg, close_bt, - window_cancel_button_cb); - gtk_tooltips_set_tip(GTK_TOOLTIPS(button_bar_tips), close_bt, - "Close this dialog.", NULL); - gtk_box_pack_end(GTK_BOX(bbox), close_bt, FALSE, FALSE, 0); - - /* Pack the buttons into the "button box" */ - gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); - gtk_widget_show(bbox); - - /* Setup delete/destroy signal handlers */ - SIGNAL_CONNECT(object_list->dlg, "delete_event", - window_delete_event_cb, NULL); - SIGNAL_CONNECT(object_list->dlg, "destroy", - eo_win_destroy_cb, NULL); - - /* Show the window */ - gtk_widget_show_all(object_list->dlg); - window_present(object_list->dlg); - - cf_retap_packets(&cfile, FALSE); + export_object_window("http", eo_http_packet); } + #endif /* GTK_MAJOR_VERSION >= 2 */ diff --git a/gtk/help_dlg.c b/gtk/help_dlg.c index 44b4ff91db..ecf1009108 100644 --- a/gtk/help_dlg.c +++ b/gtk/help_dlg.c @@ -469,6 +469,9 @@ topic_action(topic_action_e action) case(HELP_EXPORT_BYTES_WIN32_DIALOG): help_topic_html("ChIOExportSection.html#ChIOExportSelectedDialog"); break; + case(HELP_EXPORT_OBJECT_LIST): + help_topic_html("ChIOExportSection.html#ChIOExportObjectsDialog"); + break; case(HELP_OPEN_DIALOG): case(HELP_OPEN_WIN32_DIALOG): help_topic_html("ChIOOpenSection.html"); diff --git a/gtk/help_dlg.h b/gtk/help_dlg.h index 38e71865d6..e19ed45db9 100644 --- a/gtk/help_dlg.h +++ b/gtk/help_dlg.h @@ -76,6 +76,7 @@ typedef enum { HELP_CAPTURE_INFO_DIALOG, HELP_EXPORT_FILE_DIALOG, HELP_EXPORT_BYTES_DIALOG, + HELP_EXPORT_OBJECT_LIST, HELP_OPEN_DIALOG, HELP_MERGE_DIALOG, HELP_SAVE_DIALOG, |