Ethereal-dev: [Ethereal-dev] [PATCH] rtp_analysis, rtp_streams_dlg: Decimal separator fix, CSV
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: "Lars Ruoff" <lars.ruoff@xxxxxxx>
Date: Sun, 13 Mar 2005 16:44:02 +0100
Please apply the following patches: rtp_streams_dlg: - Applied the workaround for fixing the problem with locale dependent decimal separator (cf. http://www.ethereal.com/lists/ethereal-dev/200503/msg00276.html) - Added a Copy button that copies all data from the CList to clipboard as CSV. rtp_analysis: - Applied the workaround for fixing the problem with locale dependent decimal separator (cf. http://www.ethereal.com/lists/ethereal-dev/200503/msg00276.html) Attached is relevant output of 'svn diff'. regards, Lars Ruoff
Index: ethereal/gtk/rtp_stream_dlg.c =================================================================== --- ethereal/gtk/rtp_stream_dlg.c (Revision 13743) +++ ethereal/gtk/rtp_stream_dlg.c (Arbeitskopie) @@ -50,6 +50,7 @@ #include <epan/address.h> #include <string.h> +#include <locale.h> #include <epan/addr_resolv.h> @@ -74,6 +75,7 @@ static guint32 streams_nb = 0; /* number of displayed streams */ #define NUM_COLS 12 +static const gchar *titles[NUM_COLS] = {"Src IP addr", "Src port", "Dest IP addr", "Dest port", "SSRC", "Payload", "Packets", "Lost", "Max Delta (ms)", "Max Jitter (ms)", "Mean Jitter (ms)", "Pb?"}; /****************************************************************************/ /* append a line to clist */ @@ -86,7 +88,14 @@ gint32 lost; double perc; int i; + char *savelocale; + /* save the current locale */ + savelocale = setlocale(LC_NUMERIC, NULL); + /* switch to "C" locale to avoid problems with localized decimal separators + in g_snprintf("%f") functions */ + setlocale(LC_NUMERIC, "C"); + data[0] = g_strdup(get_addr_name(&(strinfo->src_addr))); data[1] = g_strdup_printf("%u", strinfo->src_port); data[2] = g_strdup(get_addr_name(&(strinfo->dest_addr))); @@ -113,6 +122,9 @@ else data[11] = g_strdup(""); + /* restore previous locale setting */ + setlocale(LC_NUMERIC, savelocale); + added_row = gtk_clist_append(GTK_CLIST(clist), data); for (i = 0; i < NUM_COLS; i++) g_free(data[i]); @@ -408,7 +420,43 @@ /****************************************************************************/ +#if (GTK_MAJOR_VERSION >= 2) static void +rtpstream_on_copy_as_csv(GtkWindow *win _U_, gpointer data) +{ + int i,j; + gchar *table_entry; + gchar *CSV_str; + GtkClipboard *cb; + + CSV_str = g_new(gchar,(240*(GTK_CLIST(clist)->rows+1))); + strcpy(CSV_str,""); + /* Add the column headers to the CSV data */ + for (j=0; j<NUM_COLS; j++) { + strcat(CSV_str, titles[j]); + strcat(CSV_str, ","); + } + strcat(CSV_str,"\n"); + + /* Add the column values to the CSV data */ + for (i=0; i<GTK_CLIST(clist)->rows; i++) { + for (j=0; j<NUM_COLS; j++) { + gtk_clist_get_text(GTK_CLIST(clist),i,j,&table_entry); + strcat(CSV_str,table_entry); + strcat(CSV_str,","); + } + strcat(CSV_str,"\n"); + } + + /* Now that we have the CSV data, copy it into the default clipboard */ + cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); + gtk_clipboard_set_text(cb, CSV_str, -1); + g_free(CSV_str); +} +#endif + +/****************************************************************************/ +static void rtpstream_on_analyse (GtkButton *button _U_, gpointer user_data _U_) { @@ -605,9 +653,11 @@ GtkWidget *bt_filter; GtkWidget *bt_analyze; GtkWidget *bt_close; +#if (GTK_MAJOR_VERSION >= 2) + GtkWidget *bt_copy; +#endif GtkTooltips *tooltips = gtk_tooltips_new(); - gchar *titles[NUM_COLS] = {"Src IP addr", "Src port", "Dest IP addr", "Dest port", "SSRC", "Payload", "Packets", "Lost", "Max Delta (ms)", "Max Jitter (ms)", "Mean Jitter (ms)", "Pb?"}; column_arrows *col_arrows; GtkWidget *column_lb; int i; @@ -721,6 +771,15 @@ gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_filter); gtk_tooltips_set_tip (tooltips, bt_filter, "Prepare a display filter of the selected stream(s)", NULL); +#if (GTK_MAJOR_VERSION >= 2) + /* XXX - maybe we want to have a "Copy as CSV" stock button here? */ + /*bt_copy = gtk_button_new_with_label ("Copy content to clipboard as CSV");*/ + bt_copy = BUTTON_NEW_FROM_STOCK(GTK_STOCK_COPY); + gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_copy); + gtk_tooltips_set_tip(tooltips, bt_copy, + "Copy all statistical values of this page to the clipboard in CSV (Comma Seperated Values) format.", NULL); +#endif + bt_analyze = gtk_button_new_with_label ("Analyze"); gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_analyze); gtk_tooltips_set_tip (tooltips, bt_analyze, "Open an analyze window of the selected stream(s)", NULL); @@ -739,6 +798,7 @@ SIGNAL_CONNECT(bt_save, "clicked", rtpstream_on_save, NULL); SIGNAL_CONNECT(bt_mark, "clicked", rtpstream_on_mark, NULL); SIGNAL_CONNECT(bt_filter, "clicked", rtpstream_on_filter, NULL); + SIGNAL_CONNECT(bt_copy, "clicked", rtpstream_on_copy_as_csv, NULL); SIGNAL_CONNECT(bt_analyze, "clicked", rtpstream_on_analyse, NULL); window_set_cancel_button(rtpstream_dlg_w, bt_close, window_cancel_button_cb); Index: ethereal/gtk/rtp_analysis.c =================================================================== --- ethereal/gtk/rtp_analysis.c (Revision 13743) +++ ethereal/gtk/rtp_analysis.c (Arbeitskopie) @@ -79,6 +79,7 @@ #include <math.h> #include <fcntl.h> #include <string.h> +#include <locale.h> #ifdef HAVE_UNISTD_H #include <unistd.h> @@ -2995,6 +2996,7 @@ guint added_row; gchar *data[9]; gchar field[9][32]; + char *savelocale; data[0]=&field[0][0]; data[1]=&field[1][0]; @@ -3006,6 +3008,11 @@ data[7]=&field[7][0]; data[8]=&field[8][0]; + /* save the current locale */ + savelocale = setlocale(LC_NUMERIC, NULL); + /* switch to "C" locale to avoid problems with localized decimal separators + in g_snprintf("%f") functions */ + setlocale(LC_NUMERIC, "C"); g_snprintf(field[0], 20, "%u", number); g_snprintf(field[1], 20, "%u", seq_num); g_snprintf(field[2], 20, "%.2f", delta); @@ -3015,6 +3022,9 @@ g_snprintf(field[6], 40, "%s", status); g_snprintf(field[7], 32, "%s", timeStr); g_snprintf(field[8], 20, "%u", pkt_len); + /* restore previous locale setting */ + setlocale(LC_NUMERIC, savelocale); + added_row = gtk_clist_append(GTK_CLIST(clist), data); gtk_clist_set_row_data(GTK_CLIST(clist), added_row, GUINT_TO_POINTER(number)); gtk_clist_set_background(GTK_CLIST(clist), added_row, color);
- Follow-Ups:
- Prev by Date: Re: [Ethereal-dev] Bug with localized decimal separator
- Next by Date: Re: [Ethereal-dev] Bug ugly protocol graph
- Previous by thread: [Ethereal-dev] Dissection of NTLMSSP blob inside ResponseToken of SPNEGO (in SMB Sessions Setup AndX Request)
- Next by thread: Re: [Ethereal-dev] [PATCH] rtp_analysis, rtp_streams_dlg: Decimal separator fix, CSV clipboard copy
- Index(es):