From 400bff055f697534ca0f1de034c4e38f13454a09 Mon Sep 17 00:00:00 2001 From: Jakub Zawadzki Date: Mon, 15 May 2017 15:07:34 +0200 Subject: [PATCH] sharkd: export uat records. Move gtk's fld_tostr() to epan API as uat_fld_tostr. Change-Id: I01e3b66ca9ea3cd1e2e06e2122190ee42b9ad44b Reviewed-on: https://code.wireshark.org/review/21664 Petri-Dish: Jakub Zawadzki Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman --- debian/libwireshark0.symbols | 1 + epan/uat-int.h | 6 +++++ epan/uat.c | 36 ++++++++++++++++++++++++++++ sharkd_session.c | 32 +++++++++++++++++++++++++ ui/gtk/uat_gui.c | 46 ++++-------------------------------- 5 files changed, 79 insertions(+), 42 deletions(-) diff --git a/debian/libwireshark0.symbols b/debian/libwireshark0.symbols index f7bdddbfd3..07839a867e 100644 --- a/debian/libwireshark0.symbols +++ b/debian/libwireshark0.symbols @@ -1683,6 +1683,7 @@ libwireshark.so.0 libwireshark0 #MINVER# uat_fld_chk_str_isdigit@Base 1.9.1 uat_fld_chk_str_isprint@Base 1.9.1 uat_fld_chk_str_isxdigit@Base 1.9.1 + uat_fld_tostr@Base 2.3.0 uat_foreach_table@Base 1.9.1 uat_get_actual_filename@Base 1.12.0~rc1 uat_get_table_by_name@Base 1.9.1 diff --git a/epan/uat-int.h b/epan/uat-int.h index 2624779e2a..c36a5c136e 100644 --- a/epan/uat-int.h +++ b/epan/uat-int.h @@ -130,6 +130,12 @@ gboolean uat_save(uat_t *uat, char **error); */ void uat_load_all(void); +/** + * Dump given UAT record to string in form, which can be later loaded with uat_load_str(). + */ +WS_DLL_PUBLIC +char *uat_fld_tostr(void *rec, uat_field_t *f); + /** * Exposes the array of valid records to the UAT consumer (dissectors), updating * the contents of 'data_ptr' and 'num_items_ptr' (see 'uat_new'). diff --git a/epan/uat.c b/epan/uat.c index 385779a7c5..3c1a0ec7dc 100644 --- a/epan/uat.c +++ b/epan/uat.c @@ -262,6 +262,42 @@ uat_t* uat_get_table_by_name(const char* name) { return NULL; } +char *uat_fld_tostr(void *rec, uat_field_t *f) { + guint len; + char *ptr; + char *out; + + f->cb.tostr(rec, &ptr, &len, f->cbdata.tostr, f->fld_data); + + switch(f->mode) { + case PT_TXTMOD_NONE: + case PT_TXTMOD_STRING: + case PT_TXTMOD_ENUM: + case PT_TXTMOD_FILENAME: + case PT_TXTMOD_DIRECTORYNAME: + out = g_strndup(ptr, len); + break; + case PT_TXTMOD_HEXBYTES: { + GString *s = g_string_sized_new( len*2 + 1 ); + guint i; + + for (i=0; istr); + + g_string_free(s, TRUE); + break; + } + default: + g_assert_not_reached(); + out = NULL; + break; + } + + g_free(ptr); + return out; +} + static void putfld(FILE* fp, void* rec, uat_field_t* f) { guint fld_len; char* fld_ptr; diff --git a/sharkd_session.c b/sharkd_session.c index 16655e63f2..591aa5ce02 100644 --- a/sharkd_session.c +++ b/sharkd_session.c @@ -3128,6 +3128,38 @@ sharkd_session_process_dumpconf_cb(pref_t *pref, gpointer d) } case PREF_UAT: + { + uat_t *uat = prefs_get_uat_value(pref); + guint idx; + + printf("\"t\":["); + for (idx = 0; idx < uat->raw_data->len; idx++) + { + void *rec = UAT_INDEX_PTR(uat, idx); + guint colnum; + + if (idx) + printf(","); + + printf("["); + for (colnum = 0; colnum < uat->ncols; colnum++) + { + char *str = uat_fld_tostr(rec, &(uat->fields[colnum])); + + if (colnum) + printf(","); + + json_puts_string(str); + g_free(str); + } + + printf("]"); + } + + printf("]"); + break; + } + case PREF_COLOR: case PREF_CUSTOM: case PREF_STATIC_TEXT: diff --git a/ui/gtk/uat_gui.c b/ui/gtk/uat_gui.c index aea06302cb..13c89489d9 100644 --- a/ui/gtk/uat_gui.c +++ b/ui/gtk/uat_gui.c @@ -167,44 +167,6 @@ static void limit_buttons(uat_t *uat) { gtk_widget_set_sensitive (uat->rep->bt_clear, FALSE); } -static char *fld_tostr(void *rec, uat_field_t *f) { - guint len; - char *ptr; - char *out; - - f->cb.tostr(rec, &ptr, &len, f->cbdata.tostr, f->fld_data); - - switch(f->mode) { - case PT_TXTMOD_NONE: - case PT_TXTMOD_STRING: - case PT_TXTMOD_ENUM: - case PT_TXTMOD_FILENAME: - case PT_TXTMOD_DIRECTORYNAME: - out = g_strndup(ptr, len); - break; - case PT_TXTMOD_HEXBYTES: { - GString *s = g_string_sized_new( len*2 + 1 ); - guint i; - - for (i=0; istr); - - g_string_free(s, TRUE); - break; - } - default: - g_assert_not_reached(); - out = NULL; - break; - } - - g_free(ptr); - return out; -} - - - static void append_row(uat_t *uat, guint idx) { void *rec = UAT_INDEX_PTR(uat, idx); uat_field_t *f = uat->fields; @@ -216,7 +178,7 @@ static void append_row(uat_t *uat, guint idx) { gtk_list_store_insert_before(uat->rep->list_store, &iter, NULL); for ( colnum = 0; colnum < uat->ncols; colnum++ ) { - tmp_str = fld_tostr(rec, &(f[colnum])); + tmp_str = uat_fld_tostr(rec, &(f[colnum])); gtk_list_store_set(uat->rep->list_store, &iter, colnum, tmp_str, -1); g_free(tmp_str); } @@ -238,7 +200,7 @@ static void reset_row(uat_t *uat, guint idx) { } for ( colnum = 0; colnum < uat->ncols; colnum++ ) { - tmp_str = fld_tostr(rec, &(f[colnum])); + tmp_str = uat_fld_tostr(rec, &(f[colnum])); gtk_list_store_set(uat->rep->list_store, &iter, colnum, tmp_str, -1); g_free(tmp_str); } @@ -511,7 +473,7 @@ static void uat_edit_dialog(uat_t *uat, gint row, gboolean copy) { for ( colnum = 0; colnum < uat->ncols; colnum++ ) { GtkWidget *entry, *label, *event_box; - char *text = fld_tostr(dd->rec, &(f[colnum])); + char *text = uat_fld_tostr(dd->rec, &(f[colnum])); char *label_text; gchar *fc_filename; @@ -681,7 +643,7 @@ static void uat_del_dlg(uat_t *uat, int idx) { for ( colnum = 0; colnum < uat->ncols; colnum++ ) { GtkWidget *label; - char *text = fld_tostr(rec, &(f[colnum])); + char *text = uat_fld_tostr(rec, &(f[colnum])); tmp_str = g_strdup_printf("%s:", f[colnum].title); label = gtk_label_new(tmp_str);