Ethereal-dev: [Ethereal-dev] Copy functionality
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: "Greg Morris" <gmorris@xxxxxxxxxx>
Date: Tue, 09 May 2006 16:47:33 +0200
Attached are diffs to add copy functionality to the details window. Also includes a change in the copy function of the hex data window to allow copying just the text strings instead of all of the hex data.
Tested on:
Windows XP
SuSE Linux 10 GTK1
SuSE Linux 10 GTK2
Build and testing done against current SVN codebase.
Please comment/check-in,
Greg |
Index: proto_draw.c =================================================================== --- proto_draw.c (revision 18083) +++ proto_draw.c (working copy) @@ -806,7 +806,7 @@ } void -copy_hex_cb(GtkWidget * w _U_, gpointer data _U_) +copy_hex_cb(GtkWidget * w _U_, gpointer data _U_, int data_type) { GtkWidget *bv; int len; @@ -814,6 +814,7 @@ const guint8 *data_p = NULL; GString *ASCII_representation = g_string_new(""); GString *byte_str = g_string_new(""); + GString *text_str = g_string_new(""); bv = get_notebook_bv_ptr(byte_nb_ptr); if (bv == NULL) { @@ -823,15 +824,31 @@ } data_p = get_byte_view_data_and_length(GTK_WIDGET(bv), &len); - - g_string_sprintfa(byte_str,"%04x ",i); /* Offset 0000 */ + + g_string_sprintfa(byte_str,"%04x ",i); /* Offset 0000 */ for (i=0; i<len; i++){ - g_string_sprintfa(ASCII_representation,"%c",isprint(*data_p) ? *data_p : '.'); - g_string_sprintfa(byte_str," %02x",*data_p++); - if ((i+1)%16==0 && i!=0){ - g_string_sprintfa(byte_str," %s\n%04x ",ASCII_representation->str,i+1); - g_string_assign (ASCII_representation,""); - } + if (data_type==1) { + if (isprint(*data_p)) { + g_string_sprintfa(ASCII_representation,"%c", *data_p); + } + else + { + if (*data_p==0x0a) { + g_string_sprintfa(ASCII_representation,"\n"); + } + } + } + else + { + g_string_sprintfa(ASCII_representation,"%c",isprint(*data_p) ? *data_p : '.'); + } + g_string_sprintfa(byte_str," %02x",*data_p++); + if ((i+1)%16==0 && i!=0){ + g_string_sprintfa(byte_str," %s\n%04x ",ASCII_representation->str,i+1); + g_string_sprintfa(text_str,"%s",ASCII_representation->str); + + g_string_assign (ASCII_representation,""); + } } if(ASCII_representation->len){ @@ -839,10 +856,18 @@ g_string_sprintfa(byte_str," "); } g_string_sprintfa(byte_str," %s\n",ASCII_representation->str); + g_string_sprintfa(text_str,"%s",ASCII_representation->str); } /* Now that we have the byte data, copy it into the default clipboard */ + if (data_type==1) { + copy_to_clipboard(text_str); + } + else + { copy_to_clipboard(byte_str); + } g_string_free(byte_str, TRUE); /* Free the memory */ + g_string_free(text_str, TRUE); /* Free the memory */ g_string_free(ASCII_representation, TRUE); /* Free the memory */ }
Index: proto_draw.h =================================================================== --- proto_draw.h (revision 18083) +++ proto_draw.h (working copy) @@ -114,7 +114,7 @@ * @param w unused * @param data unused */ -extern void copy_hex_cb(GtkWidget * w, gpointer data); +extern void copy_hex_cb(GtkWidget * w, gpointer data, int data_type); #if GTK_MAJOR_VERSION < 2 /** Redraw a given byte view window.
Index: main.c =================================================================== --- main.c (revision 18083) +++ main.c (working copy) @@ -431,8 +431,38 @@ get_text_from_packet_list(data)); } +/* This function allows users to right click in the details window and copy the text + * information to the operating systems clipboard. + * + * We first check to see if a string representation is setup in the tree and then + * read the string. If not available then we try to grab the value. If all else + * fails we display a message to the user to indicate the copy could not be completed. + */ +void +copy_selected_plist_cb(GtkWidget *w _U_, gpointer data _U_) +{ + GString *gtk_text_str = g_string_new(""); + char labelstring[256]; + char *stringpointer = labelstring; + if (cfile.finfo_selected->rep->representation != 0) { + g_string_sprintfa(gtk_text_str, "%s", cfile.finfo_selected->rep->representation); /* Get the represented data */ + } + if (gtk_text_str->len == 0) { /* If no representation then... */ + proto_item_fill_label(cfile.finfo_selected, stringpointer); /* Try to read the value */ + g_string_sprintfa(gtk_text_str, "%s", stringpointer); + } + if (gtk_text_str->len == 0) { /* Could not get item so display error msg */ + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not acquire information to copy, try expanding or choosing another item"); + } + else + { + copy_to_clipboard(gtk_text_str); /* Copy string to clipboard */ + } + g_string_free(gtk_text_str, TRUE); /* Free the memory */ +} + /* XXX: use a preference for this setting! */ static guint dfilter_combo_max_recent = 10;
Index: main.h =================================================================== --- main.h (revision 18083) +++ main.h (working copy) @@ -122,6 +122,13 @@ /** "bitwise or" this with MATCH_SELECTED_E value for instant apply instead of prepare only */ #define MATCH_SELECTED_APPLY_NOW 0x100 +/** User highlited item in details window and then right clicked and selected the copy option + * + * @param widget parent widget + * @param data parent widget + */ +extern void copy_selected_plist_cb(GtkWidget *w _U_, gpointer data); + /** User requested one of "Apply as Filter" or "Prepare a Filter" functions * by menu or context menu of protocol tree. *
Index: menu.c =================================================================== --- menu.c (revision 18083) +++ menu.c (working copy) @@ -474,6 +474,10 @@ static GtkItemFactoryEntry tree_view_menu_items[] = { + + ITEM_FACTORY_ENTRY("/Copy", NULL, copy_selected_plist_cb, 0, NULL, NULL), + ITEM_FACTORY_ENTRY("/<separator>", NULL, NULL, 0, "<Separator>", NULL), + ITEM_FACTORY_ENTRY("/Expand Subtrees", NULL, expand_tree_cb, 0, NULL, NULL), ITEM_FACTORY_ENTRY("/Expand All", NULL, expand_all_cb, 0, NULL, NULL), ITEM_FACTORY_ENTRY("/Collapse All", NULL, collapse_all_cb, 0, NULL, NULL), @@ -529,8 +533,11 @@ static GtkItemFactoryEntry hexdump_menu_items[] = { - ITEM_FACTORY_ENTRY("/Copy", NULL, copy_hex_cb, + ITEM_FACTORY_ENTRY("/Copy", NULL, NULL, 0, "<Branch>", NULL), + ITEM_FACTORY_ENTRY("/Copy/...All Information", NULL, copy_hex_cb, 0, NULL, NULL), + ITEM_FACTORY_ENTRY("/Copy/...Text Only", NULL, copy_hex_cb, + 1, NULL, NULL), ITEM_FACTORY_ENTRY("/Export Selected Packet Bytes...", NULL, savehex_cb, 0, NULL, NULL), };
- Follow-Ups:
- SV: [Ethereal-dev] Copy functionality
- From: Anders Broman
- SV: [Ethereal-dev] Copy functionality
- Prev by Date: [Ethereal-dev] Reassembling bug?
- Next by Date: Re: [Ethereal-dev] 0.99.1 release anytime soon?
- Previous by thread: [Ethereal-dev] Reassembling bug?
- Next by thread: SV: [Ethereal-dev] Copy functionality
- Index(es):