From 5051ae1cbe00fb57dd94d584554f731a83f932f6 Mon Sep 17 00:00:00 2001 From: Bill Meier Date: Mon, 6 Oct 2014 14:03:47 -0400 Subject: Convert "4 space tabs" to spaces; Adjust editor modelines. Change-Id: I8d61d959c79e6aa9875c58680c54a331d18079cc Reviewed-on: https://code.wireshark.org/review/4504 Reviewed-by: Bill Meier --- epan/dissectors/packet-paltalk.c | 128 +-- epan/stats_tree.c | 2004 +++++++++++++++++++------------------- epan/stats_tree.h | 216 ++-- extcap.c | 1042 ++++++++++---------- extcap.h | 20 +- extcap_parser.c | 1372 +++++++++++++------------- extcap_parser.h | 172 ++-- ui/gtk/extcap_gtk.c | 1488 ++++++++++++++-------------- ui/gtk/extcap_gtk.h | 69 +- ui/gtk/mcast_stream_dlg.c | 1142 +++++++++++----------- ui/gtk/rtp_stream_dlg.c | 1530 ++++++++++++++--------------- 11 files changed, 4592 insertions(+), 4591 deletions(-) diff --git a/epan/dissectors/packet-paltalk.c b/epan/dissectors/packet-paltalk.c index cddfc6a140..4983e3230b 100644 --- a/epan/dissectors/packet-paltalk.c +++ b/epan/dissectors/packet-paltalk.c @@ -53,86 +53,86 @@ static gint ett_paltalk = -1; static guint dissect_paltalk_get_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset) { - return tvb_get_ntohs(tvb, offset + 4) + PALTALK_HEADER_LENGTH; + return tvb_get_ntohs(tvb, offset + 4) + PALTALK_HEADER_LENGTH; } static int dissect_paltalk_desegmented(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { - proto_item *ti = NULL; - proto_tree *pt_tree = NULL; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "Paltalk"); - col_clear(pinfo->cinfo, COL_INFO); - - if (tree) /* we are being asked for details */ - { - ti = proto_tree_add_item(tree, proto_paltalk, tvb, 0, -1, ENC_NA); - pt_tree = proto_item_add_subtree(ti, ett_paltalk); - proto_tree_add_item(pt_tree, hf_paltalk_pdu_type, tvb, 0, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(pt_tree, hf_paltalk_version, tvb, 2, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(pt_tree, hf_paltalk_length, tvb, 4, 2, ENC_BIG_ENDIAN); - proto_tree_add_item(pt_tree, hf_paltalk_content, tvb, 6, tvb_get_ntohs(tvb, 4), ENC_NA); - } - - return tvb_captured_length(tvb); + proto_item *ti = NULL; + proto_tree *pt_tree = NULL; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "Paltalk"); + col_clear(pinfo->cinfo, COL_INFO); + + if (tree) /* we are being asked for details */ + { + ti = proto_tree_add_item(tree, proto_paltalk, tvb, 0, -1, ENC_NA); + pt_tree = proto_item_add_subtree(ti, ett_paltalk); + proto_tree_add_item(pt_tree, hf_paltalk_pdu_type, tvb, 0, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(pt_tree, hf_paltalk_version, tvb, 2, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(pt_tree, hf_paltalk_length, tvb, 4, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(pt_tree, hf_paltalk_content, tvb, 6, tvb_get_ntohs(tvb, 4), ENC_NA); + } + + return tvb_captured_length(tvb); } static gboolean dissect_paltalk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { - guint32 src32, dst32; - - /* Detect if this TCP session is a Paltalk one */ - /* TODO: Optimize detection logic if possible */ - - if ((pinfo->net_src.type != AT_IPv4) - || (pinfo->net_dst.type != AT_IPv4) - || (pinfo->net_src.len != 4) - || (pinfo->net_dst.len != 4) - || !pinfo->net_src.data - || !pinfo->net_dst.data) - return FALSE; - - memcpy((guint8 *)&src32, pinfo->net_src.data, 4); /* *Network* order */ - memcpy((guint8 *)&dst32, pinfo->net_dst.data, 4); /* *Network* order */ - - if ( ((src32 & PALTALK_SERVERS_NETMASK) != PALTALK_SERVERS_ADDRESS) - && - ((dst32 & PALTALK_SERVERS_NETMASK) != PALTALK_SERVERS_ADDRESS)) - return FALSE; - - /* Dissect result of desegmented TCP data */ - tcp_dissect_pdus(tvb, pinfo, tree, TRUE, PALTALK_HEADER_LENGTH, - dissect_paltalk_get_len, dissect_paltalk_desegmented, data); - return TRUE; + guint32 src32, dst32; + + /* Detect if this TCP session is a Paltalk one */ + /* TODO: Optimize detection logic if possible */ + + if ((pinfo->net_src.type != AT_IPv4) + || (pinfo->net_dst.type != AT_IPv4) + || (pinfo->net_src.len != 4) + || (pinfo->net_dst.len != 4) + || !pinfo->net_src.data + || !pinfo->net_dst.data) + return FALSE; + + memcpy((guint8 *)&src32, pinfo->net_src.data, 4); /* *Network* order */ + memcpy((guint8 *)&dst32, pinfo->net_dst.data, 4); /* *Network* order */ + + if ( ((src32 & PALTALK_SERVERS_NETMASK) != PALTALK_SERVERS_ADDRESS) + && + ((dst32 & PALTALK_SERVERS_NETMASK) != PALTALK_SERVERS_ADDRESS)) + return FALSE; + + /* Dissect result of desegmented TCP data */ + tcp_dissect_pdus(tvb, pinfo, tree, TRUE, PALTALK_HEADER_LENGTH, + dissect_paltalk_get_len, dissect_paltalk_desegmented, data); + return TRUE; } void proto_register_paltalk(void) { - static hf_register_info hf[] = { - { &hf_paltalk_pdu_type, { "Packet Type", "paltalk.type", - FT_UINT16, BASE_HEX, NULL, 0x00, NULL, HFILL }}, - { &hf_paltalk_version, { "Protocol Version", "paltalk.version", - FT_INT16, BASE_DEC, NULL, 0x00, NULL, HFILL }}, - { &hf_paltalk_length, { "Payload Length", "paltalk.length", - FT_INT16, BASE_DEC, NULL, 0x00, NULL, HFILL }}, - { &hf_paltalk_content, { "Payload Content", "paltalk.content", - FT_BYTES, BASE_NONE, NULL, 0x00, NULL, HFILL }} - }; - - static gint *ett[] = { &ett_paltalk }; - - proto_paltalk = proto_register_protocol("Paltalk Messenger Protocol", "Paltalk", "paltalk"); - proto_register_field_array(proto_paltalk, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); + static hf_register_info hf[] = { + { &hf_paltalk_pdu_type, { "Packet Type", "paltalk.type", + FT_UINT16, BASE_HEX, NULL, 0x00, NULL, HFILL }}, + { &hf_paltalk_version, { "Protocol Version", "paltalk.version", + FT_INT16, BASE_DEC, NULL, 0x00, NULL, HFILL }}, + { &hf_paltalk_length, { "Payload Length", "paltalk.length", + FT_INT16, BASE_DEC, NULL, 0x00, NULL, HFILL }}, + { &hf_paltalk_content, { "Payload Content", "paltalk.content", + FT_BYTES, BASE_NONE, NULL, 0x00, NULL, HFILL }} + }; + + static gint *ett[] = { &ett_paltalk }; + + proto_paltalk = proto_register_protocol("Paltalk Messenger Protocol", "Paltalk", "paltalk"); + proto_register_field_array(proto_paltalk, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); } void proto_reg_handoff_paltalk(void) { - heur_dissector_add("tcp", dissect_paltalk, proto_paltalk); + heur_dissector_add("tcp", dissect_paltalk, proto_paltalk); } /* @@ -140,10 +140,10 @@ proto_reg_handoff_paltalk(void) * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/epan/stats_tree.c b/epan/stats_tree.c index 958e3af57e..aae2356803 100644 --- a/epan/stats_tree.c +++ b/epan/stats_tree.c @@ -45,16 +45,16 @@ #include "stats_tree.h" enum _stat_tree_columns { - COL_NAME, - COL_COUNT, - COL_AVERAGE, - COL_MIN, - COL_MAX, - COL_RATE, - COL_PERCENT, - COL_BURSTRATE, - COL_BURSTTIME, - N_COLUMNS + COL_NAME, + COL_COUNT, + COL_AVERAGE, + COL_MIN, + COL_MAX, + COL_RATE, + COL_PERCENT, + COL_BURSTRATE, + COL_BURSTTIME, + N_COLUMNS }; /* used to contain the registered stat trees */ @@ -65,99 +65,99 @@ if buffer is NULL returns a newly allocated string */ extern gchar* stats_tree_node_to_str(const stat_node *node, gchar *buffer, guint len) { - if (buffer) { - g_snprintf(buffer,len,"%s: %i",node->name, node->counter); - return buffer; - } else { - return g_strdup_printf("%s: %i",node->name, node->counter); - } + if (buffer) { + g_snprintf(buffer,len,"%s: %i",node->name, node->counter); + return buffer; + } else { + return g_strdup_printf("%s: %i",node->name, node->counter); + } } extern guint stats_tree_branch_max_namelen(const stat_node *node, guint indent) { - stat_node *child; - guint maxlen = 0; - guint len; - - indent = indent > INDENT_MAX ? INDENT_MAX : indent; - - if (node->children) { - for (child = node->children; child; child = child->next ) { - len = stats_tree_branch_max_namelen(child,indent+1); - maxlen = len > maxlen ? len : maxlen; - } - } - - if (node->st_flags&ST_FLG_ROOTCHILD) { - gchar *display_name= stats_tree_get_displayname(node->name); - len = (guint) strlen(display_name) + indent; - g_free(display_name); - } - else { - len = (guint) strlen(node->name) + indent; - } - maxlen = len > maxlen ? len : maxlen; - - return maxlen; + stat_node *child; + guint maxlen = 0; + guint len; + + indent = indent > INDENT_MAX ? INDENT_MAX : indent; + + if (node->children) { + for (child = node->children; child; child = child->next ) { + len = stats_tree_branch_max_namelen(child,indent+1); + maxlen = len > maxlen ? len : maxlen; + } + } + + if (node->st_flags&ST_FLG_ROOTCHILD) { + gchar *display_name= stats_tree_get_displayname(node->name); + len = (guint) strlen(display_name) + indent; + g_free(display_name); + } + else { + len = (guint) strlen(node->name) + indent; + } + maxlen = len > maxlen ? len : maxlen; + + return maxlen; } /* frees the resources allocated by a stat_tree node */ static void free_stat_node(stat_node *node) { - stat_node *child; - stat_node *next; - burst_bucket *bucket; - - if (node->children) { - for (child = node->children; child; child = next ) { - /* child->next will be gone after free_stat_node, so cache it here */ - next = child->next; - free_stat_node(child); - } - } - - if(node->st->cfg->free_node_pr) node->st->cfg->free_node_pr(node); - - if (node->hash) g_hash_table_destroy(node->hash); - - while (node->bh) { - bucket = node->bh; - node->bh = bucket->next; - g_free(bucket); - } - - g_free(node->rng); - g_free(node->name); - g_free(node); + stat_node *child; + stat_node *next; + burst_bucket *bucket; + + if (node->children) { + for (child = node->children; child; child = next ) { + /* child->next will be gone after free_stat_node, so cache it here */ + next = child->next; + free_stat_node(child); + } + } + + if(node->st->cfg->free_node_pr) node->st->cfg->free_node_pr(node); + + if (node->hash) g_hash_table_destroy(node->hash); + + while (node->bh) { + bucket = node->bh; + node->bh = bucket->next; + g_free(bucket); + } + + g_free(node->rng); + g_free(node->name); + g_free(node); } /* destroys the whole tree instance */ extern void stats_tree_free(stats_tree *st) { - stat_node *child; - stat_node *next; + stat_node *child; + stat_node *next; - g_free(st->filter); - g_hash_table_destroy(st->names); - g_ptr_array_free(st->parents,TRUE); - g_free(st->display_name); + g_free(st->filter); + g_hash_table_destroy(st->names); + g_ptr_array_free(st->parents,TRUE); + g_free(st->display_name); - for (child = st->root.children; child; child = next ) { - /* child->next will be gone after free_stat_node, so cache it here */ - next = child->next; - free_stat_node(child); - } + for (child = st->root.children; child; child = next ) { + /* child->next will be gone after free_stat_node, so cache it here */ + next = child->next; + free_stat_node(child); + } - if (st->cfg->free_tree_pr) - st->cfg->free_tree_pr(st); + if (st->cfg->free_tree_pr) + st->cfg->free_tree_pr(st); - if (st->cfg->cleanup) - st->cfg->cleanup(st); + if (st->cfg->cleanup) + st->cfg->cleanup(st); - g_free(st); + g_free(st); } @@ -165,34 +165,34 @@ stats_tree_free(stats_tree *st) static void reset_stat_node(stat_node *node) { - stat_node *child; - burst_bucket *bucket; - - node->counter = 0; - node->total = 0; - node->minvalue = G_MAXINT; - node->maxvalue = G_MININT; - node->st_flags = 0; - - while (node->bh) { - bucket = node->bh; - node->bh = bucket->next; - g_free(bucket); - } - node->bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); - node->bt = node->bh; - node->bcount = 0; - node->max_burst = 0; - node->burst_time = -1.0; - - if (node->children) { - for (child = node->children; child; child = child->next ) - reset_stat_node(child); - } - - if(node->st->cfg->reset_node) { - node->st->cfg->reset_node(node); - } + stat_node *child; + burst_bucket *bucket; + + node->counter = 0; + node->total = 0; + node->minvalue = G_MAXINT; + node->maxvalue = G_MININT; + node->st_flags = 0; + + while (node->bh) { + bucket = node->bh; + node->bh = bucket->next; + g_free(bucket); + } + node->bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); + node->bt = node->bh; + node->bcount = 0; + node->max_burst = 0; + node->burst_time = -1.0; + + if (node->children) { + for (child = node->children; child; child = child->next ) + reset_stat_node(child); + } + + if(node->st->cfg->reset_node) { + node->st->cfg->reset_node(node); + } } @@ -200,268 +200,268 @@ reset_stat_node(stat_node *node) extern void stats_tree_reset(void *p) { - stats_tree *st = (stats_tree *)p; + stats_tree *st = (stats_tree *)p; - st->start = -1.0; - st->elapsed = 0.0; - st->now = - 1.0; + st->start = -1.0; + st->elapsed = 0.0; + st->now = - 1.0; - reset_stat_node(&st->root); + reset_stat_node(&st->root); - if (st->cfg->reset_tree) { - st->cfg->reset_tree(st); - } + if (st->cfg->reset_tree) { + st->cfg->reset_tree(st); + } } extern void stats_tree_reinit(void *p) { - stats_tree *st = (stats_tree *)p; - stat_node *child; - stat_node *next; - - for (child = st->root.children; child; child = next) { - /* child->next will be gone after free_stat_node, so cache it here */ - next = child->next; - free_stat_node(child); - } - - st->root.children = NULL; - st->root.counter = 0; - st->root.total = 0; - st->root.minvalue = G_MAXINT; - st->root.maxvalue = G_MININT; - st->root.st_flags = 0; - - st->root.bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); - st->root.bt = st->root.bh; - st->root.bcount = 0; - st->root.max_burst = 0; - st->root.burst_time = -1.0; - - /* No more stat_nodes left in tree - clean out hash, array */ - g_hash_table_remove_all(st->names); - if (st->parents->len>1) { - g_ptr_array_remove_range(st->parents, 1, st->parents->len-1); - } - - /* Do not update st_flags for the tree (sorting) - leave as was */ - st->num_columns = N_COLUMNS; - g_free(st->display_name); - st->display_name= stats_tree_get_displayname(st->cfg->name); - - if (st->cfg->init) { - st->cfg->init(st); - } + stats_tree *st = (stats_tree *)p; + stat_node *child; + stat_node *next; + + for (child = st->root.children; child; child = next) { + /* child->next will be gone after free_stat_node, so cache it here */ + next = child->next; + free_stat_node(child); + } + + st->root.children = NULL; + st->root.counter = 0; + st->root.total = 0; + st->root.minvalue = G_MAXINT; + st->root.maxvalue = G_MININT; + st->root.st_flags = 0; + + st->root.bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); + st->root.bt = st->root.bh; + st->root.bcount = 0; + st->root.max_burst = 0; + st->root.burst_time = -1.0; + + /* No more stat_nodes left in tree - clean out hash, array */ + g_hash_table_remove_all(st->names); + if (st->parents->len>1) { + g_ptr_array_remove_range(st->parents, 1, st->parents->len-1); + } + + /* Do not update st_flags for the tree (sorting) - leave as was */ + st->num_columns = N_COLUMNS; + g_free(st->display_name); + st->display_name= stats_tree_get_displayname(st->cfg->name); + + if (st->cfg->init) { + st->cfg->init(st); + } } /* register a new stats_tree */ extern void stats_tree_register_with_group(const char *tapname, const char *abbr, const char *name, - guint flags, - stat_tree_packet_cb packet, stat_tree_init_cb init, - stat_tree_cleanup_cb cleanup, register_stat_group_t stat_group) + guint flags, + stat_tree_packet_cb packet, stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup, register_stat_group_t stat_group) { - stats_tree_cfg *cfg = (stats_tree_cfg *)g_malloc( sizeof(stats_tree_cfg) ); + stats_tree_cfg *cfg = (stats_tree_cfg *)g_malloc( sizeof(stats_tree_cfg) ); - /* at the very least the abbrev and the packet function should be given */ - g_assert( tapname && abbr && packet ); + /* at the very least the abbrev and the packet function should be given */ + g_assert( tapname && abbr && packet ); - cfg->plugin = FALSE; - cfg->tapname = g_strdup(tapname); - cfg->abbr = g_strdup(abbr); - cfg->name = name ? g_strdup(name) : g_strdup(abbr); - cfg->stat_group = stat_group; + cfg->plugin = FALSE; + cfg->tapname = g_strdup(tapname); + cfg->abbr = g_strdup(abbr); + cfg->name = name ? g_strdup(name) : g_strdup(abbr); + cfg->stat_group = stat_group; - cfg->packet = packet; - cfg->init = init; - cfg->cleanup = cleanup; + cfg->packet = packet; + cfg->init = init; + cfg->cleanup = cleanup; - cfg->flags = flags&~ST_FLG_MASK; - cfg->st_flags = flags&ST_FLG_MASK; + cfg->flags = flags&~ST_FLG_MASK; + cfg->st_flags = flags&ST_FLG_MASK; - /* these have to be filled in by implementations */ - cfg->setup_node_pr = NULL; - cfg->new_tree_pr = NULL; - cfg->free_node_pr = NULL; - cfg->free_tree_pr = NULL; - cfg->draw_node = NULL; - cfg->draw_tree = NULL; - cfg->reset_node = NULL; - cfg->reset_tree = NULL; + /* these have to be filled in by implementations */ + cfg->setup_node_pr = NULL; + cfg->new_tree_pr = NULL; + cfg->free_node_pr = NULL; + cfg->free_tree_pr = NULL; + cfg->draw_node = NULL; + cfg->draw_tree = NULL; + cfg->reset_node = NULL; + cfg->reset_tree = NULL; - if (!registry) registry = g_hash_table_new(g_str_hash,g_str_equal); + if (!registry) registry = g_hash_table_new(g_str_hash,g_str_equal); - g_hash_table_insert(registry,cfg->abbr,cfg); + g_hash_table_insert(registry,cfg->abbr,cfg); } /* register a new stats_tree with default group REGISTER_STAT_GROUP_UNSORTED */ extern void stats_tree_register(const char *tapname, const char *abbr, const char *name, - guint flags, - stat_tree_packet_cb packet, stat_tree_init_cb init, - stat_tree_cleanup_cb cleanup) + guint flags, + stat_tree_packet_cb packet, stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup) { - stats_tree_register_with_group(tapname, abbr, name, - flags, - packet, init, - cleanup, REGISTER_STAT_GROUP_UNSORTED); + stats_tree_register_with_group(tapname, abbr, name, + flags, + packet, init, + cleanup, REGISTER_STAT_GROUP_UNSORTED); } /* register a new stat_tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin */ extern void stats_tree_register_plugin(const char *tapname, const char *abbr, const char *name, - guint flags, - stat_tree_packet_cb packet, stat_tree_init_cb init, - stat_tree_cleanup_cb cleanup) + guint flags, + stat_tree_packet_cb packet, stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup) { - stats_tree_cfg *cfg; - - stats_tree_register(tapname, abbr, name, - flags, - packet, init, - cleanup); - cfg = stats_tree_get_cfg_by_abbr(abbr); - cfg->plugin = TRUE; + stats_tree_cfg *cfg; + + stats_tree_register(tapname, abbr, name, + flags, + packet, init, + cleanup); + cfg = stats_tree_get_cfg_by_abbr(abbr); + cfg->plugin = TRUE; } extern stats_tree* stats_tree_new(stats_tree_cfg *cfg, tree_pres *pr, const char *filter) { - stats_tree *st = (stats_tree *)g_malloc(sizeof(stats_tree)); - - st->cfg = cfg; - st->pr = pr; - - st->names = g_hash_table_new(g_str_hash,g_str_equal); - st->parents = g_ptr_array_new(); - st->filter = g_strdup(filter); - - st->start = -1.0; - st->elapsed = 0.0; - - st->root.counter = 0; - st->root.total = 0; - st->root.minvalue = G_MAXINT; - st->root.maxvalue = G_MININT; - st->root.st_flags = 0; - - st->root.bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); - st->root.bt = st->root.bh; - st->root.bcount = 0; - st->root.max_burst = 0; - st->root.burst_time = -1.0; - - st->root.name = stats_tree_get_displayname(cfg->name); - st->root.st = st; - st->root.parent = NULL; - st->root.children = NULL; - st->root.next = NULL; - st->root.hash = NULL; - st->root.pr = NULL; - - st->st_flags = st->cfg->st_flags; - - if (!(st->st_flags&ST_FLG_SRTCOL_MASK)) { - /* No default sort specified - use preferences */ - st->st_flags |= prefs.st_sort_defcolflag<st_flags |= ST_FLG_SORT_DESC; - } - } - st->num_columns = N_COLUMNS; - st->display_name= stats_tree_get_displayname(st->cfg->name); - - g_ptr_array_add(st->parents,&st->root); - - return st; + stats_tree *st = (stats_tree *)g_malloc(sizeof(stats_tree)); + + st->cfg = cfg; + st->pr = pr; + + st->names = g_hash_table_new(g_str_hash,g_str_equal); + st->parents = g_ptr_array_new(); + st->filter = g_strdup(filter); + + st->start = -1.0; + st->elapsed = 0.0; + + st->root.counter = 0; + st->root.total = 0; + st->root.minvalue = G_MAXINT; + st->root.maxvalue = G_MININT; + st->root.st_flags = 0; + + st->root.bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); + st->root.bt = st->root.bh; + st->root.bcount = 0; + st->root.max_burst = 0; + st->root.burst_time = -1.0; + + st->root.name = stats_tree_get_displayname(cfg->name); + st->root.st = st; + st->root.parent = NULL; + st->root.children = NULL; + st->root.next = NULL; + st->root.hash = NULL; + st->root.pr = NULL; + + st->st_flags = st->cfg->st_flags; + + if (!(st->st_flags&ST_FLG_SRTCOL_MASK)) { + /* No default sort specified - use preferences */ + st->st_flags |= prefs.st_sort_defcolflag<st_flags |= ST_FLG_SORT_DESC; + } + } + st->num_columns = N_COLUMNS; + st->display_name= stats_tree_get_displayname(st->cfg->name); + + g_ptr_array_add(st->parents,&st->root); + + return st; } /* will be the tap packet cb */ extern int stats_tree_packet(void *p, packet_info *pinfo, epan_dissect_t *edt, const void *pri) { - stats_tree *st = (stats_tree *)p; + stats_tree *st = (stats_tree *)p; - st->now = nstime_to_msec(&pinfo->rel_ts); - if (st->start < 0.0) st->start = st->now; + st->now = nstime_to_msec(&pinfo->rel_ts); + if (st->start < 0.0) st->start = st->now; - st->elapsed = st->now - st->start; + st->elapsed = st->now - st->start; - if (st->cfg->packet) - return st->cfg->packet(st,pinfo,edt,pri); - else - return 0; + if (st->cfg->packet) + return st->cfg->packet(st,pinfo,edt,pri); + else + return 0; } extern stats_tree_cfg* stats_tree_get_cfg_by_abbr(const char *abbr) { - return (stats_tree_cfg *)g_hash_table_lookup(registry,abbr); + return (stats_tree_cfg *)g_hash_table_lookup(registry,abbr); } extern GList* stats_tree_get_cfg_list(void) { - return g_hash_table_get_values(registry); + return g_hash_table_get_values(registry); } struct _stats_tree_pres_cbs { - void (*setup_node_pr)(stat_node*); - void (*free_node_pr)(stat_node*); - void (*draw_node)(stat_node*); - void (*reset_node)(stat_node*); - tree_pres *(*new_tree_pr)(stats_tree*); - void (*free_tree_pr)(stats_tree*); - void (*draw_tree)(stats_tree*); - void (*reset_tree)(stats_tree*); + void (*setup_node_pr)(stat_node*); + void (*free_node_pr)(stat_node*); + void (*draw_node)(stat_node*); + void (*reset_node)(stat_node*); + tree_pres *(*new_tree_pr)(stats_tree*); + void (*free_tree_pr)(stats_tree*); + void (*draw_tree)(stats_tree*); + void (*reset_tree)(stats_tree*); }; static void setup_tree_presentation(gpointer k _U_, gpointer v, gpointer p) { - stats_tree_cfg *cfg = (stats_tree_cfg *)v; - struct _stats_tree_pres_cbs *d = (struct _stats_tree_pres_cbs *)p; - - cfg->in_use = FALSE; - cfg->setup_node_pr = d->setup_node_pr; - cfg->new_tree_pr = d->new_tree_pr; - cfg->free_node_pr = d->free_node_pr; - cfg->free_tree_pr = d->free_tree_pr; - cfg->draw_node = d->draw_node; - cfg->draw_tree = d->draw_tree; - cfg->reset_node = d->reset_node; - cfg->reset_tree = d->reset_tree; + stats_tree_cfg *cfg = (stats_tree_cfg *)v; + struct _stats_tree_pres_cbs *d = (struct _stats_tree_pres_cbs *)p; + + cfg->in_use = FALSE; + cfg->setup_node_pr = d->setup_node_pr; + cfg->new_tree_pr = d->new_tree_pr; + cfg->free_node_pr = d->free_node_pr; + cfg->free_tree_pr = d->free_tree_pr; + cfg->draw_node = d->draw_node; + cfg->draw_tree = d->draw_tree; + cfg->reset_node = d->reset_node; + cfg->reset_tree = d->reset_tree; } extern void stats_tree_presentation(void (*registry_iterator)(gpointer,gpointer,gpointer), - void (*setup_node_pr)(stat_node*), - void (*free_node_pr)(stat_node*), - void (*draw_node)(stat_node*), - void (*reset_node)(stat_node*), - tree_pres *(*new_tree_pr)(stats_tree*), - void (*free_tree_pr)(stats_tree*), - void (*draw_tree)(stats_tree*), - void (*reset_tree)(stats_tree*), - void *data) + void (*setup_node_pr)(stat_node*), + void (*free_node_pr)(stat_node*), + void (*draw_node)(stat_node*), + void (*reset_node)(stat_node*), + tree_pres *(*new_tree_pr)(stats_tree*), + void (*free_tree_pr)(stats_tree*), + void (*draw_tree)(stats_tree*), + void (*reset_tree)(stats_tree*), + void *data) { - static struct _stats_tree_pres_cbs d; + static struct _stats_tree_pres_cbs d; - d.setup_node_pr = setup_node_pr; - d.new_tree_pr = new_tree_pr; - d.free_node_pr = free_node_pr; - d.free_tree_pr = free_tree_pr; - d.draw_node = draw_node; - d.draw_tree = draw_tree; - d.reset_node = reset_node; - d.reset_tree = reset_tree; + d.setup_node_pr = setup_node_pr; + d.new_tree_pr = new_tree_pr; + d.free_node_pr = free_node_pr; + d.free_tree_pr = free_tree_pr; + d.draw_node = draw_node; + d.draw_tree = draw_tree; + d.reset_node = reset_node; + d.reset_tree = reset_tree; - if (registry) g_hash_table_foreach(registry,setup_tree_presentation,&d); + if (registry) g_hash_table_foreach(registry,setup_tree_presentation,&d); - if (registry_iterator && registry) - g_hash_table_foreach(registry,registry_iterator,data); + if (registry_iterator && registry) + g_hash_table_foreach(registry,registry_iterator,data); } @@ -474,183 +474,183 @@ stats_tree_presentation(void (*registry_iterator)(gpointer,gpointer,gpointer), */ static stat_node* new_stat_node(stats_tree *st, const gchar *name, int parent_id, - gboolean with_hash, gboolean as_parent_node) + gboolean with_hash, gboolean as_parent_node) { - stat_node *node = (stat_node *)g_malloc (sizeof(stat_node)); - stat_node *last_chld = NULL; - - node->counter = 0; - node->total = 0; - node->minvalue = G_MAXINT; - node->maxvalue = G_MININT; - node->st_flags = parent_id?0:ST_FLG_ROOTCHILD; - - node->bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); - node->bt = node->bh; - node->bcount = 0; - node->max_burst = 0; - node->burst_time = -1.0; - - node->name = g_strdup(name); - node->children = NULL; - node->next = NULL; - node->st = (stats_tree*) st; - node->hash = with_hash ? g_hash_table_new(g_str_hash,g_str_equal) : NULL; - node->parent = NULL; - node->rng = NULL; - - if (as_parent_node) { - g_hash_table_insert(st->names, - node->name, - node); - - g_ptr_array_add(st->parents,node); - - node->id = st->parents->len - 1; - } else { - node->id = -1; - } - - if (parent_id >= 0 && parent_id < (int) st->parents->len ) { - node->parent = (stat_node *)g_ptr_array_index(st->parents,parent_id); - } else { - /* ??? should we set the parent to be root ??? */ - g_assert_not_reached(); - } - - if (node->parent->children) { - /* insert as last child */ - - for (last_chld = node->parent->children; - last_chld->next; - last_chld = last_chld->next ) ; - - last_chld->next = node; - - } else { - /* insert as first child */ - node->parent->children = node; - } - - if(node->parent->hash) { - g_hash_table_insert(node->parent->hash,node->name,node); - } - - if (st->cfg->setup_node_pr) { - st->cfg->setup_node_pr(node); - } else { - node->pr = NULL; - } - - return node; + stat_node *node = (stat_node *)g_malloc (sizeof(stat_node)); + stat_node *last_chld = NULL; + + node->counter = 0; + node->total = 0; + node->minvalue = G_MAXINT; + node->maxvalue = G_MININT; + node->st_flags = parent_id?0:ST_FLG_ROOTCHILD; + + node->bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); + node->bt = node->bh; + node->bcount = 0; + node->max_burst = 0; + node->burst_time = -1.0; + + node->name = g_strdup(name); + node->children = NULL; + node->next = NULL; + node->st = (stats_tree*) st; + node->hash = with_hash ? g_hash_table_new(g_str_hash,g_str_equal) : NULL; + node->parent = NULL; + node->rng = NULL; + + if (as_parent_node) { + g_hash_table_insert(st->names, + node->name, + node); + + g_ptr_array_add(st->parents,node); + + node->id = st->parents->len - 1; + } else { + node->id = -1; + } + + if (parent_id >= 0 && parent_id < (int) st->parents->len ) { + node->parent = (stat_node *)g_ptr_array_index(st->parents,parent_id); + } else { + /* ??? should we set the parent to be root ??? */ + g_assert_not_reached(); + } + + if (node->parent->children) { + /* insert as last child */ + + for (last_chld = node->parent->children; + last_chld->next; + last_chld = last_chld->next ) ; + + last_chld->next = node; + + } else { + /* insert as first child */ + node->parent->children = node; + } + + if(node->parent->hash) { + g_hash_table_insert(node->parent->hash,node->name,node); + } + + if (st->cfg->setup_node_pr) { + st->cfg->setup_node_pr(node); + } else { + node->pr = NULL; + } + + return node; } /***/ extern int stats_tree_create_node(stats_tree *st, const gchar *name, int parent_id, gboolean with_hash) { - stat_node *node = new_stat_node(st,name,parent_id,with_hash,TRUE); + stat_node *node = new_stat_node(st,name,parent_id,with_hash,TRUE); - if (node) - return node->id; - else - return 0; + if (node) + return node->id; + else + return 0; } /* XXX: should this be a macro? */ extern int stats_tree_create_node_by_pname(stats_tree *st, const gchar *name, - const gchar *parent_name, gboolean with_children) + const gchar *parent_name, gboolean with_children) { - return stats_tree_create_node(st,name,stats_tree_parent_id_by_name(st,parent_name),with_children); + return stats_tree_create_node(st,name,stats_tree_parent_id_by_name(st,parent_name),with_children); } /* Internal function to update the burst calculation data - add entry to bucket */ static void update_burst_calc(stat_node *node, gint value) { - double current_bucket; - double burstwin; - - burst_bucket *bn; - - if (!prefs.st_enable_burstinfo) { - return; - } - - /* NB thebucket list should always contain at least one node - even if it is */ - /* the dummy created at init time. Head and tail should never be NULL! */ - current_bucket= floor(node->st->now/prefs.st_burst_resolution); - burstwin= prefs.st_burst_windowlen/prefs.st_burst_resolution; - if (current_bucket>node->bt->bucket_no) { - /* Must add a new bucket at the burst list tail */ - bn = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); - bn->count = value; - bn->bucket_no = current_bucket; - bn->start_time = node->st->now; - bn->prev = node->bt; - node->bt->next = bn; - node->bt = bn; - /* And add value to the current burst count for node */ - node->bcount += value; - /* Check if bucket list head is now too old and must be removed */ - while (current_bucket>=(node->bh->bucket_no+burstwin)) { - /* off with its head! */ - bn = node->bh; - node->bh = bn->next; - node->bh->prev = NULL; - node->bcount -= bn->count; - g_free(bn); - } - } - else if (current_bucketbh->bucket_no) { - /* Packet must be added at head of burst list - check if not too old */ - if ((current_bucket+burstwin)>node->bt->bucket_no) { - /* packet still within the window */ - bn = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); - bn->count = value; - bn->bucket_no = current_bucket; - bn->start_time = node->st->now; - bn->next = node->bh; - node->bh->prev = bn; - node->bh = bn; - /* And add value to the current burst count for node */ - node->bcount += value; - } - } - else - { - /* Somewhere in the middle... */ - burst_bucket *search = node->bt; - while (current_bucketbucket_no) { - search = search->prev; - } - if (current_bucket==search->bucket_no) { - /* found existing bucket, increase value */ - search->count += value; - if (search->start_time>node->st->now) { - search->start_time = node->st->now; - } - } - else { - /* must add a new bucket after bn. */ - bn = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); - bn->count = value; - bn->bucket_no = current_bucket; - bn->start_time = node->st->now; - bn->prev = search; - bn->next = search->next; - search->next = bn; - bn->next->prev = bn; - } - node->bcount += value; - } - if (node->bcount>node->max_burst) { - /* new record burst */ - node->max_burst = node->bcount; - node->burst_time = node->bh->start_time; - } + double current_bucket; + double burstwin; + + burst_bucket *bn; + + if (!prefs.st_enable_burstinfo) { + return; + } + + /* NB thebucket list should always contain at least one node - even if it is */ + /* the dummy created at init time. Head and tail should never be NULL! */ + current_bucket= floor(node->st->now/prefs.st_burst_resolution); + burstwin= prefs.st_burst_windowlen/prefs.st_burst_resolution; + if (current_bucket>node->bt->bucket_no) { + /* Must add a new bucket at the burst list tail */ + bn = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); + bn->count = value; + bn->bucket_no = current_bucket; + bn->start_time = node->st->now; + bn->prev = node->bt; + node->bt->next = bn; + node->bt = bn; + /* And add value to the current burst count for node */ + node->bcount += value; + /* Check if bucket list head is now too old and must be removed */ + while (current_bucket>=(node->bh->bucket_no+burstwin)) { + /* off with its head! */ + bn = node->bh; + node->bh = bn->next; + node->bh->prev = NULL; + node->bcount -= bn->count; + g_free(bn); + } + } + else if (current_bucketbh->bucket_no) { + /* Packet must be added at head of burst list - check if not too old */ + if ((current_bucket+burstwin)>node->bt->bucket_no) { + /* packet still within the window */ + bn = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); + bn->count = value; + bn->bucket_no = current_bucket; + bn->start_time = node->st->now; + bn->next = node->bh; + node->bh->prev = bn; + node->bh = bn; + /* And add value to the current burst count for node */ + node->bcount += value; + } + } + else + { + /* Somewhere in the middle... */ + burst_bucket *search = node->bt; + while (current_bucketbucket_no) { + search = search->prev; + } + if (current_bucket==search->bucket_no) { + /* found existing bucket, increase value */ + search->count += value; + if (search->start_time>node->st->now) { + search->start_time = node->st->now; + } + } + else { + /* must add a new bucket after bn. */ + bn = (burst_bucket*)g_malloc0(sizeof(burst_bucket)); + bn->count = value; + bn->bucket_no = current_bucket; + bn->start_time = node->st->now; + bn->prev = search; + bn->next = search->next; + search->next = bn; + bn->next->prev = bn; + } + node->bcount += value; + } + if (node->bcount>node->max_burst) { + /* new record burst */ + node->max_burst = node->bcount; + node->burst_time = node->bh->start_time; + } } /* @@ -661,75 +661,75 @@ update_burst_calc(stat_node *node, gint value) */ extern int stats_tree_manip_node(manip_node_mode mode, stats_tree *st, const char *name, - int parent_id, gboolean with_hash, gint value) + int parent_id, gboolean with_hash, gint value) { - stat_node *node = NULL; - stat_node *parent = NULL; - - g_assert( parent_id >= 0 && parent_id < (int) st->parents->len ); - - parent = (stat_node *)g_ptr_array_index(st->parents,parent_id); - - if( parent->hash ) { - node = (stat_node *)g_hash_table_lookup(parent->hash,name); - } else { - node = (stat_node *)g_hash_table_lookup(st->names,name); - } - - if ( node == NULL ) - node = new_stat_node(st,name,parent_id,with_hash,with_hash); - - switch (mode) { - case MN_INCREASE: - node->counter += value; - update_burst_calc(node, value); - break; - case MN_SET: node->counter = value; break; - case MN_AVERAGE: - node->counter++; - update_burst_calc(node, 1); - /* fall through to average code */ - case MN_AVERAGE_NOTICK: - node->total += value; - if (node->minvalue > value) { - node->minvalue = value; - } - if (node->maxvalue < value) { - node->maxvalue = value; - } - node->st_flags |= ST_FLG_AVERAGE; - break; - case MN_SET_FLAGS: - node->st_flags |= value; - break; - case MN_CLEAR_FLAGS: - node->st_flags &= ~value; - break; - } - - if (node) - return node->id; - else - return -1; + stat_node *node = NULL; + stat_node *parent = NULL; + + g_assert( parent_id >= 0 && parent_id < (int) st->parents->len ); + + parent = (stat_node *)g_ptr_array_index(st->parents,parent_id); + + if( parent->hash ) { + node = (stat_node *)g_hash_table_lookup(parent->hash,name); + } else { + node = (stat_node *)g_hash_table_lookup(st->names,name); + } + + if ( node == NULL ) + node = new_stat_node(st,name,parent_id,with_hash,with_hash); + + switch (mode) { + case MN_INCREASE: + node->counter += value; + update_burst_calc(node, value); + break; + case MN_SET: node->counter = value; break; + case MN_AVERAGE: + node->counter++; + update_burst_calc(node, 1); + /* fall through to average code */ + case MN_AVERAGE_NOTICK: + node->total += value; + if (node->minvalue > value) { + node->minvalue = value; + } + if (node->maxvalue < value) { + node->maxvalue = value; + } + node->st_flags |= ST_FLG_AVERAGE; + break; + case MN_SET_FLAGS: + node->st_flags |= value; + break; + case MN_CLEAR_FLAGS: + node->st_flags &= ~value; + break; + } + + if (node) + return node->id; + else + return -1; } extern char* stats_tree_get_abbr(const char *opt_arg) { - guint i; + guint i; - /* XXX: this fails when tshark is given any options - after the -z */ - g_assert(opt_arg != NULL); + /* XXX: this fails when tshark is given any options + after the -z */ + g_assert(opt_arg != NULL); - for (i=0; opt_arg[i] && opt_arg[i] != ','; i++); + for (i=0; opt_arg[i] && opt_arg[i] != ','; i++); - if (opt_arg[i] == ',') { - return g_strndup(opt_arg,i); - } else { - return NULL; - } + if (opt_arg[i] == ',') { + return g_strndup(opt_arg,i); + } else { + return NULL; + } } @@ -752,614 +752,614 @@ stats_tree_get_abbr(const char *opt_arg) static range_pair_t* get_range(char *rngstr) { - gchar **split; - range_pair_t *rng; - - split = g_strsplit((gchar*)rngstr,"-",2); - - /* empty string */ - if (split[0] == NULL) { - g_strfreev(split); - return NULL; - } - - rng = (range_pair_t *)g_malloc(sizeof(range_pair_t)); - - if (split[1] == NULL) { - /* means we have a non empty string with no delimiter - * so it must be a single number */ - rng->floor = (gint)strtol(split[0],NULL,10); - rng->ceil = rng->floor; - } else { - /* string == "X-?" */ - if (*(split[0]) != '\0') { - rng->floor = (gint)strtol(split[0],NULL,10); - } else - /* string == "-?" */ - rng->floor = G_MININT; - - /* string != "?-" */ - if (*(split[1]) != '\0') { - rng->ceil = (gint)strtol(split[1],NULL,10); - } else - /* string == "?-" */ - rng->ceil = G_MAXINT; - } - g_strfreev(split); - - return rng; + gchar **split; + range_pair_t *rng; + + split = g_strsplit((gchar*)rngstr,"-",2); + + /* empty string */ + if (split[0] == NULL) { + g_strfreev(split); + return NULL; + } + + rng = (range_pair_t *)g_malloc(sizeof(range_pair_t)); + + if (split[1] == NULL) { + /* means we have a non empty string with no delimiter + * so it must be a single number */ + rng->floor = (gint)strtol(split[0],NULL,10); + rng->ceil = rng->floor; + } else { + /* string == "X-?" */ + if (*(split[0]) != '\0') { + rng->floor = (gint)strtol(split[0],NULL,10); + } else + /* string == "-?" */ + rng->floor = G_MININT; + + /* string != "?-" */ + if (*(split[1]) != '\0') { + rng->ceil = (gint)strtol(split[1],NULL,10); + } else + /* string == "?-" */ + rng->ceil = G_MAXINT; + } + g_strfreev(split); + + return rng; } extern int stats_tree_create_range_node(stats_tree *st, const gchar *name, int parent_id, ...) { - va_list list; - gchar *curr_range; - stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE); - stat_node *range_node = NULL; - - va_start( list, parent_id ); - while (( curr_range = va_arg(list, gchar*) )) { - range_node = new_stat_node(st, curr_range, rng_root->id, FALSE, FALSE); - range_node->rng = get_range(curr_range); - } - va_end( list ); - - return rng_root->id; + va_list list; + gchar *curr_range; + stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE); + stat_node *range_node = NULL; + + va_start( list, parent_id ); + while (( curr_range = va_arg(list, gchar*) )) { + range_node = new_stat_node(st, curr_range, rng_root->id, FALSE, FALSE); + range_node->rng = get_range(curr_range); + } + va_end( list ); + + return rng_root->id; } extern int stats_tree_create_range_node_string(stats_tree *st, const gchar *name, - int parent_id, int num_str_ranges, - gchar** str_ranges) + int parent_id, int num_str_ranges, + gchar** str_ranges) { - int i; - stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE); - stat_node *range_node = NULL; + int i; + stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE); + stat_node *range_node = NULL; - for (i = 0; i < num_str_ranges; i++) { - range_node = new_stat_node(st, str_ranges[i], rng_root->id, FALSE, FALSE); - range_node->rng = get_range(str_ranges[i]); - } + for (i = 0; i < num_str_ranges; i++) { + range_node = new_stat_node(st, str_ranges[i], rng_root->id, FALSE, FALSE); + range_node->rng = get_range(str_ranges[i]); + } - return rng_root->id; + return rng_root->id; } /****/ extern int stats_tree_parent_id_by_name(stats_tree *st, const gchar *parent_name) { - stat_node *node = (stat_node *)g_hash_table_lookup(st->names,parent_name); + stat_node *node = (stat_node *)g_hash_table_lookup(st->names,parent_name); - if (node) - return node->id; - else - return 0; /* XXX: this is the root shoud we return -1 instead?*/ + if (node) + return node->id; + else + return 0; /* XXX: this is the root shoud we return -1 instead?*/ } extern int stats_tree_range_node_with_pname(stats_tree *st, const gchar *name, - const gchar *parent_name, ...) + const gchar *parent_name, ...) { - va_list list; - gchar *curr_range; - stat_node *range_node = NULL; - int parent_id = stats_tree_parent_id_by_name(st,parent_name); - stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE); - - va_start( list, parent_name ); - while (( curr_range = va_arg(list, gchar*) )) { - range_node = new_stat_node(st, curr_range, rng_root->id, FALSE, FALSE); - range_node->rng = get_range(curr_range); - } - va_end( list ); - - return rng_root->id; + va_list list; + gchar *curr_range; + stat_node *range_node = NULL; + int parent_id = stats_tree_parent_id_by_name(st,parent_name); + stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE); + + va_start( list, parent_name ); + while (( curr_range = va_arg(list, gchar*) )) { + range_node = new_stat_node(st, curr_range, rng_root->id, FALSE, FALSE); + range_node->rng = get_range(curr_range); + } + va_end( list ); + + return rng_root->id; } extern int stats_tree_tick_range(stats_tree *st, const gchar *name, int parent_id, - int value_in_range) + int value_in_range) { - stat_node *node = NULL; - stat_node *parent = NULL; - stat_node *child = NULL; - gint stat_floor, stat_ceil; - - if (parent_id >= 0 && parent_id < (int) st->parents->len) { - parent = (stat_node *)g_ptr_array_index(st->parents,parent_id); - } else { - g_assert_not_reached(); - } - - if( parent->hash ) { - node = (stat_node *)g_hash_table_lookup(parent->hash,name); - } else { - node = (stat_node *)g_hash_table_lookup(st->names,name); - } - - if ( node == NULL ) - g_assert_not_reached(); - - /* update stats for container node. counter should already be ticked so we only update total and min/max */ - node->total += value_in_range; - if (node->minvalue > value_in_range) { - node->minvalue = value_in_range; - } - if (node->maxvalue < value_in_range) { - node->maxvalue = value_in_range; - } - node->st_flags |= ST_FLG_AVERAGE; - - for ( child = node->children; child; child = child->next) { - stat_floor = child->rng->floor; - stat_ceil = child->rng->ceil; - - if ( value_in_range >= stat_floor && value_in_range <= stat_ceil ) { - child->counter++; - child->total += value_in_range; - if (child->minvalue > value_in_range) { - child->minvalue = value_in_range; - } - if (child->maxvalue < value_in_range) { - child->maxvalue = value_in_range; - } - child->st_flags |= ST_FLG_AVERAGE; - update_burst_calc(child, 1); - return node->id; - } - } - - return node->id; + stat_node *node = NULL; + stat_node *parent = NULL; + stat_node *child = NULL; + gint stat_floor, stat_ceil; + + if (parent_id >= 0 && parent_id < (int) st->parents->len) { + parent = (stat_node *)g_ptr_array_index(st->parents,parent_id); + } else { + g_assert_not_reached(); + } + + if( parent->hash ) { + node = (stat_node *)g_hash_table_lookup(parent->hash,name); + } else { + node = (stat_node *)g_hash_table_lookup(st->names,name); + } + + if ( node == NULL ) + g_assert_not_reached(); + + /* update stats for container node. counter should already be ticked so we only update total and min/max */ + node->total += value_in_range; + if (node->minvalue > value_in_range) { + node->minvalue = value_in_range; + } + if (node->maxvalue < value_in_range) { + node->maxvalue = value_in_range; + } + node->st_flags |= ST_FLG_AVERAGE; + + for ( child = node->children; child; child = child->next) { + stat_floor = child->rng->floor; + stat_ceil = child->rng->ceil; + + if ( value_in_range >= stat_floor && value_in_range <= stat_ceil ) { + child->counter++; + child->total += value_in_range; + if (child->minvalue > value_in_range) { + child->minvalue = value_in_range; + } + if (child->maxvalue < value_in_range) { + child->maxvalue = value_in_range; + } + child->st_flags |= ST_FLG_AVERAGE; + update_burst_calc(child, 1); + return node->id; + } + } + + return node->id; } extern int stats_tree_create_pivot(stats_tree *st, const gchar *name, int parent_id) { - stat_node *node = new_stat_node(st,name,parent_id,TRUE,TRUE); + stat_node *node = new_stat_node(st,name,parent_id,TRUE,TRUE); - if (node) - return node->id; - else - return 0; + if (node) + return node->id; + else + return 0; } extern int stats_tree_create_pivot_by_pname(stats_tree *st, const gchar *name, - const gchar *parent_name) + const gchar *parent_name) { - int parent_id = stats_tree_parent_id_by_name(st,parent_name); - stat_node *node; + int parent_id = stats_tree_parent_id_by_name(st,parent_name); + stat_node *node; - node = new_stat_node(st,name,parent_id,TRUE,TRUE); + node = new_stat_node(st,name,parent_id,TRUE,TRUE); - if (node) - return node->id; - else - return 0; + if (node) + return node->id; + else + return 0; } extern int stats_tree_tick_pivot(stats_tree *st, int pivot_id, const gchar *pivot_value) { - stat_node *parent = (stat_node *)g_ptr_array_index(st->parents,pivot_id); + stat_node *parent = (stat_node *)g_ptr_array_index(st->parents,pivot_id); - parent->counter++; - update_burst_calc(parent, 1); - stats_tree_manip_node( MN_INCREASE, st, pivot_value, pivot_id, FALSE, 1); + parent->counter++; + update_burst_calc(parent, 1); + stats_tree_manip_node( MN_INCREASE, st, pivot_value, pivot_id, FALSE, 1); - return pivot_id; + return pivot_id; } extern gchar* stats_tree_get_displayname (gchar* fullname) { - gchar *buf = g_strdup(fullname); - gchar *sep; - - if (prefs.st_sort_showfullname) { - return buf; /* unmodifed */ - } - - sep = buf; - while ((sep = strchr(sep,'/')) != NULL) { - if (*(++sep)=='/') { /* escapeded slash - two slash characters after each other */ - memmove(sep,sep+1,strlen(sep)); - } - else { - /* we got a new path separator */ - memmove(buf,sep,strlen(sep)+1); - sep = buf; - } - } - - return buf; + gchar *buf = g_strdup(fullname); + gchar *sep; + + if (prefs.st_sort_showfullname) { + return buf; /* unmodifed */ + } + + sep = buf; + while ((sep = strchr(sep,'/')) != NULL) { + if (*(++sep)=='/') { /* escapeded slash - two slash characters after each other */ + memmove(sep,sep+1,strlen(sep)); + } + else { + /* we got a new path separator */ + memmove(buf,sep,strlen(sep)+1); + sep = buf; + } + } + + return buf; } extern gint stats_tree_get_default_sort_col (stats_tree *st) { - switch ((st->st_flags&ST_FLG_SRTCOL_MASK)>>ST_FLG_SRTCOL_SHIFT) { - case ST_SORT_COL_NAME: return COL_NAME; - case ST_SORT_COL_COUNT: return COL_COUNT; - case ST_SORT_COL_AVG: return COL_AVERAGE; - case ST_SORT_COL_MIN: return COL_MIN; - case ST_SORT_COL_MAX: return COL_MAX; - case ST_SORT_COL_BURSTRATE: return COL_BURSTRATE; - } - return COL_COUNT; /* nothing specific set */ + switch ((st->st_flags&ST_FLG_SRTCOL_MASK)>>ST_FLG_SRTCOL_SHIFT) { + case ST_SORT_COL_NAME: return COL_NAME; + case ST_SORT_COL_COUNT: return COL_COUNT; + case ST_SORT_COL_AVG: return COL_AVERAGE; + case ST_SORT_COL_MIN: return COL_MIN; + case ST_SORT_COL_MAX: return COL_MAX; + case ST_SORT_COL_BURSTRATE: return COL_BURSTRATE; + } + return COL_COUNT; /* nothing specific set */ } extern gboolean stats_tree_is_default_sort_DESC (stats_tree *st) { - return st->st_flags&ST_FLG_SORT_DESC; + return st->st_flags&ST_FLG_SORT_DESC; } extern const gchar* stats_tree_get_column_name (gint col_index) { - switch (col_index) { - case COL_NAME: return "Topic / Item"; - case COL_COUNT: return "Count"; - case COL_AVERAGE: return "Average"; - case COL_MIN: return "Min val"; - case COL_MAX: return "Max val"; - case COL_RATE: return "Rate (ms)"; - case COL_PERCENT: return "Percent"; - case COL_BURSTRATE: return prefs.st_burst_showcount?"Burst count":"Burst rate"; - case COL_BURSTTIME: return "Burst start"; - default: return "(Unknown)"; - } + switch (col_index) { + case COL_NAME: return "Topic / Item"; + case COL_COUNT: return "Count"; + case COL_AVERAGE: return "Average"; + case COL_MIN: return "Min val"; + case COL_MAX: return "Max val"; + case COL_RATE: return "Rate (ms)"; + case COL_PERCENT: return "Percent"; + case COL_BURSTRATE: return prefs.st_burst_showcount?"Burst count":"Burst rate"; + case COL_BURSTTIME: return "Burst start"; + default: return "(Unknown)"; + } } extern gint stats_tree_get_column_size (gint col_index) { - if (col_index==COL_NAME) { - return 36; /* but caller should really call stats_tree_branch_max_namelen() */ - } - if (col_indexst->num_columns)); - - values[COL_NAME]= (node->st_flags&ST_FLG_ROOTCHILD)?stats_tree_get_displayname(node->name):g_strdup(node->name); - values[COL_COUNT]= g_strdup_printf("%u",node->counter); - values[COL_AVERAGE]= ((node->st_flags&ST_FLG_AVERAGE)||node->rng)? - (node->counter?g_strdup_printf("%.2f",((float)node->total)/node->counter):g_strdup("-")): - g_strdup(""); - values[COL_MIN]= ((node->st_flags&ST_FLG_AVERAGE)||node->rng)? - (node->counter?g_strdup_printf("%u",node->minvalue):g_strdup("-")): - g_strdup(""); - values[COL_MAX]= ((node->st_flags&ST_FLG_AVERAGE)||node->rng)? - (node->counter?g_strdup_printf("%u",node->maxvalue):g_strdup("-")): - g_strdup(""); - values[COL_RATE]= (node->st->elapsed)?g_strdup_printf("%.4f",((float)node->counter)/node->st->elapsed):g_strdup(""); - values[COL_PERCENT]= ((node->parent)&&(node->parent->counter))? - g_strdup_printf("%.2f%%",(node->counter*100.0)/node->parent->counter): - (node->parent==&(node->st->root)?g_strdup("100%"):g_strdup("")); - if (node->st->num_columns>COL_BURSTTIME) { - values[COL_BURSTRATE]= (!prefs.st_enable_burstinfo)?g_strdup(""): - (node->max_burst?(prefs.st_burst_showcount? - g_strdup_printf("%d",node->max_burst): - g_strdup_printf("%.4f",((double)node->max_burst)/prefs.st_burst_windowlen)): - g_strdup("-")); - values[COL_BURSTTIME]= (!prefs.st_enable_burstinfo)?g_strdup(""): - (node->max_burst?g_strdup_printf("%.3f",((double)node->burst_time/1000.0)):g_strdup("-")); - } - return values; + gchar **values = (gchar**) g_malloc0(sizeof(gchar*)*(node->st->num_columns)); + + values[COL_NAME]= (node->st_flags&ST_FLG_ROOTCHILD)?stats_tree_get_displayname(node->name):g_strdup(node->name); + values[COL_COUNT]= g_strdup_printf("%u",node->counter); + values[COL_AVERAGE]= ((node->st_flags&ST_FLG_AVERAGE)||node->rng)? + (node->counter?g_strdup_printf("%.2f",((float)node->total)/node->counter):g_strdup("-")): + g_strdup(""); + values[COL_MIN]= ((node->st_flags&ST_FLG_AVERAGE)||node->rng)? + (node->counter?g_strdup_printf("%u",node->minvalue):g_strdup("-")): + g_strdup(""); + values[COL_MAX]= ((node->st_flags&ST_FLG_AVERAGE)||node->rng)? + (node->counter?g_strdup_printf("%u",node->maxvalue):g_strdup("-")): + g_strdup(""); + values[COL_RATE]= (node->st->elapsed)?g_strdup_printf("%.4f",((float)node->counter)/node->st->elapsed):g_strdup(""); + values[COL_PERCENT]= ((node->parent)&&(node->parent->counter))? + g_strdup_printf("%.2f%%",(node->counter*100.0)/node->parent->counter): + (node->parent==&(node->st->root)?g_strdup("100%"):g_strdup("")); + if (node->st->num_columns>COL_BURSTTIME) { + values[COL_BURSTRATE]= (!prefs.st_enable_burstinfo)?g_strdup(""): + (node->max_burst?(prefs.st_burst_showcount? + g_strdup_printf("%d",node->max_burst): + g_strdup_printf("%.4f",((double)node->max_burst)/prefs.st_burst_windowlen)): + g_strdup("-")); + values[COL_BURSTTIME]= (!prefs.st_enable_burstinfo)?g_strdup(""): + (node->max_burst?g_strdup_printf("%.3f",((double)node->burst_time/1000.0)):g_strdup("-")); + } + return values; } extern gint stats_tree_sort_compare (const stat_node *a, const stat_node *b, gint sort_column, - gboolean sort_descending) + gboolean sort_descending) { - int result = 0; - float avg_a, avg_b; - - if (prefs.st_sort_rng_nameonly&&(a->rng&&b->rng)) { - /* always sort ranges by range name */ - result = a->rng->floor - b->rng->floor; - if (sort_descending&&(!prefs.st_sort_rng_fixorder)) { - result= -result; - } - return result; - } - - switch (sort_column) - { - case COL_NAME: if (a->rng&&b->rng) { - result = a->rng->floor - b->rng->floor; - } - else if (prefs.st_sort_casesensitve) { - result = strcmp(a->name,b->name); - } - else { - result = g_ascii_strcasecmp(a->name,b->name); - } - break; - - case COL_RATE: - case COL_PERCENT: - case COL_COUNT: result = a->counter - b->counter; - break; - - case COL_AVERAGE: if (a->counter) { - result= 1; /* assume a>b */ - if (b->counter) { - avg_a= ((float)a->total)/a->counter; - avg_b= ((float)b->total)/b->counter; - result= (avg_a>avg_b)?1:((avg_aa */ - } - break; - - case COL_MIN: result = a->minvalue - b->minvalue; - break; - - case COL_MAX: result = a->maxvalue - b->maxvalue; - break; - - case COL_BURSTRATE: result = a->max_burst - b->max_burst; - break; - - case COL_BURSTTIME: result = (a->burst_time>b->burst_time)?1:((a->burst_timeburst_time)?-1:0); - break; - - default: - /* no sort comparison found for column - must update this switch statement */ - g_assert_not_reached(); - } - - /* break tie between items with same primary search result */ - if (!result) { - if (sort_column==COL_NAME) { - result = a->counter - b->counter; - } - else { - if (a->rng&&b->rng) { - result = a->rng->floor - b->rng->floor; - } - else if (prefs.st_sort_casesensitve) { - result = strcmp(a->name,b->name); - } - else { - result = g_ascii_strcasecmp(a->name,b->name); - } - } - } - - /* take into account sort order */ - if (sort_descending) { - result= -result; - } - - if ((a->st_flags&ST_FLG_SORT_TOP)!=(b->st_flags&ST_FLG_SORT_TOP)) { - /* different sort groups top vs non-top */ - result= (a->st_flags&ST_FLG_SORT_TOP)?-1:1; - } - return result; + int result = 0; + float avg_a, avg_b; + + if (prefs.st_sort_rng_nameonly&&(a->rng&&b->rng)) { + /* always sort ranges by range name */ + result = a->rng->floor - b->rng->floor; + if (sort_descending&&(!prefs.st_sort_rng_fixorder)) { + result= -result; + } + return result; + } + + switch (sort_column) + { + case COL_NAME: if (a->rng&&b->rng) { + result = a->rng->floor - b->rng->floor; + } + else if (prefs.st_sort_casesensitve) { + result = strcmp(a->name,b->name); + } + else { + result = g_ascii_strcasecmp(a->name,b->name); + } + break; + + case COL_RATE: + case COL_PERCENT: + case COL_COUNT: result = a->counter - b->counter; + break; + + case COL_AVERAGE: if (a->counter) { + result= 1; /* assume a>b */ + if (b->counter) { + avg_a= ((float)a->total)/a->counter; + avg_b= ((float)b->total)/b->counter; + result= (avg_a>avg_b)?1:((avg_aa */ + } + break; + + case COL_MIN: result = a->minvalue - b->minvalue; + break; + + case COL_MAX: result = a->maxvalue - b->maxvalue; + break; + + case COL_BURSTRATE: result = a->max_burst - b->max_burst; + break; + + case COL_BURSTTIME: result = (a->burst_time>b->burst_time)?1:((a->burst_timeburst_time)?-1:0); + break; + + default: + /* no sort comparison found for column - must update this switch statement */ + g_assert_not_reached(); + } + + /* break tie between items with same primary search result */ + if (!result) { + if (sort_column==COL_NAME) { + result = a->counter - b->counter; + } + else { + if (a->rng&&b->rng) { + result = a->rng->floor - b->rng->floor; + } + else if (prefs.st_sort_casesensitve) { + result = strcmp(a->name,b->name); + } + else { + result = g_ascii_strcasecmp(a->name,b->name); + } + } + } + + /* take into account sort order */ + if (sort_descending) { + result= -result; + } + + if ((a->st_flags&ST_FLG_SORT_TOP)!=(b->st_flags&ST_FLG_SORT_TOP)) { + /* different sort groups top vs non-top */ + result= (a->st_flags&ST_FLG_SORT_TOP)?-1:1; + } + return result; } extern GString* stats_tree_format_as_str(const stats_tree* st, st_format_type format_type, - gint sort_column, gboolean sort_descending) + gint sort_column, gboolean sort_descending) { - int maxnamelen= stats_tree_branch_max_namelen(&st->root,0); - stat_node *child; - GString *s; - int count; - gchar *separator = NULL; - - switch(format_type) - { - case ST_FORMAT_YAML: - s = g_string_new("---\n"); - break; - case ST_FORMAT_XML: - s = g_string_new("\n"); - break; - case ST_FORMAT_CSV: - s = g_string_new("\"level\",\"parent\","); - for (count = 0; countnum_columns; count++) { - g_string_append_printf(s,"\"%s\",",stats_tree_get_column_name(count)); - } - g_string_append (s,"\n"); - break; - case ST_FORMAT_PLAIN: - { - char fmt[16]; - int sep_length; - - sep_length= maxnamelen; - for (count = 1; countnum_columns; count++) { - sep_length += stats_tree_get_column_size(count)+2; - } - separator = (gchar *)g_malloc(sep_length+1); - memset (separator, '=', sep_length); - separator[sep_length] = 0; - - s = g_string_new("\n"); - g_string_append(s,separator); - g_string_append_printf(s,"\n%s:\n",st->cfg->name); - g_sprintf (fmt,"%%-%us",maxnamelen); - g_string_append_printf(s,fmt,stats_tree_get_column_name(0)); - for (count = 1; countnum_columns; count++) { - g_sprintf (fmt," %%-%us",stats_tree_get_column_size(count)+1); - g_string_append_printf(s,fmt,stats_tree_get_column_name(count)); - } - memset (separator, '-', sep_length); - g_string_append_printf(s,"\n%s\n",separator); - } - break; - default: - return g_string_new("unknown format for stats_tree\n"); - } - - for (child = st->root.children; child; child = child->next ) { - stats_tree_format_node_as_str(child,s,format_type,0,"",maxnamelen,sort_column,sort_descending); - - } - - if (format_type==ST_FORMAT_PLAIN) { - g_string_append_printf(s,"\n%s\n",separator); - g_free(separator); - } - - return s; + int maxnamelen= stats_tree_branch_max_namelen(&st->root,0); + stat_node *child; + GString *s; + int count; + gchar *separator = NULL; + + switch(format_type) + { + case ST_FORMAT_YAML: + s = g_string_new("---\n"); + break; + case ST_FORMAT_XML: + s = g_string_new("\n"); + break; + case ST_FORMAT_CSV: + s = g_string_new("\"level\",\"parent\","); + for (count = 0; countnum_columns; count++) { + g_string_append_printf(s,"\"%s\",",stats_tree_get_column_name(count)); + } + g_string_append (s,"\n"); + break; + case ST_FORMAT_PLAIN: + { + char fmt[16]; + int sep_length; + + sep_length= maxnamelen; + for (count = 1; countnum_columns; count++) { + sep_length += stats_tree_get_column_size(count)+2; + } + separator = (gchar *)g_malloc(sep_length+1); + memset (separator, '=', sep_length); + separator[sep_length] = 0; + + s = g_string_new("\n"); + g_string_append(s,separator); + g_string_append_printf(s,"\n%s:\n",st->cfg->name); + g_sprintf (fmt,"%%-%us",maxnamelen); + g_string_append_printf(s,fmt,stats_tree_get_column_name(0)); + for (count = 1; countnum_columns; count++) { + g_sprintf (fmt," %%-%us",stats_tree_get_column_size(count)+1); + g_string_append_printf(s,fmt,stats_tree_get_column_name(count)); + } + memset (separator, '-', sep_length); + g_string_append_printf(s,"\n%s\n",separator); + } + break; + default: + return g_string_new("unknown format for stats_tree\n"); + } + + for (child = st->root.children; child; child = child->next ) { + stats_tree_format_node_as_str(child,s,format_type,0,"",maxnamelen,sort_column,sort_descending); + + } + + if (format_type==ST_FORMAT_PLAIN) { + g_string_append_printf(s,"\n%s\n",separator); + g_free(separator); + } + + return s; } typedef struct { - gint sort_column; - gboolean sort_descending; -} sortinfo; + gint sort_column; + gboolean sort_descending; +} sortinfo; /* Function to compare elements for child array sort. a and b are children, user_data points to a st_flags value */ extern gint stat_node_array_sortcmp (gconstpointer a, gconstpointer b, gpointer user_data) { - /* user_data is *guint value to st_flags */ - return stats_tree_sort_compare (*(const stat_node**)a,*(const stat_node**)b, - ((sortinfo*)user_data)->sort_column,((sortinfo*)user_data)->sort_descending); + /* user_data is *guint value to st_flags */ + return stats_tree_sort_compare (*(const stat_node**)a,*(const stat_node**)b, + ((sortinfo*)user_data)->sort_column,((sortinfo*)user_data)->sort_descending); } static gchar* clean_for_xml_tag (gchar *str) { - gchar *s = str; - while ((s=strpbrk(s,"!\"#$%%&'()*+,/;<=>?@[\\]^`{|}~ ")) != NULL) { - *(s++) = '-'; - } - return str; + gchar *s = str; + while ((s=strpbrk(s,"!\"#$%%&'()*+,/;<=>?@[\\]^`{|}~ ")) != NULL) { + *(s++) = '-'; + } + return str; } /** helper funcation to add note to formatted stats_tree */ WS_DLL_PUBLIC void stats_tree_format_node_as_str(const stat_node *node, - GString *s, - st_format_type format_type, - guint indent, - const gchar *path, - gint maxnamelen, - gint sort_column, - gboolean sort_descending) + GString *s, + st_format_type format_type, + guint indent, + const gchar *path, + gint maxnamelen, + gint sort_column, + gboolean sort_descending) { - int count; - int num_columns= node->st->num_columns; - gchar **values= stats_tree_get_values_from_node(node); - stat_node *child; - sortinfo si; - gchar *full_path; - char fmt[16]; - - switch(format_type) - { - case ST_FORMAT_YAML: - if (indent) { - g_sprintf(fmt, "%%%ds%%s%%s", indent*4-2); - } - else { - strcpy(fmt, "%s%s%s"); - } - g_string_append_printf(s, fmt, "", indent?"- ":"", "Description"); - g_string_append_printf(s, ": \"%s\"\n", values[0]); - - for (count = 1; countchildren) { - g_string_append_printf(s, fmt, "", indent?" ":"", "Items:\n"); - } - break; - case ST_FORMAT_XML: - { - char *itemname = xml_escape(values[0]); - g_string_append_printf(s,"\n",itemname, - node->rng?" isrange=\"true\"":""); - g_free(itemname); - for (count = 1; count",clean_for_xml_tag(colname)); - g_string_append_printf(s,"%s\n",values[count],colname); - g_free(colname); - } - } - break; - case ST_FORMAT_CSV: - g_string_append_printf(s,"%d,\"%s\",\"%s\"",indent,path,values[0]); - for (count = 1; count INDENT_MAX ? INDENT_MAX : indent; - full_path= g_strdup_printf ("%s/%s",path,values[0]); - - for (count = 0; countchildren) { - GArray *Children= g_array_new(FALSE,FALSE,sizeof(child)); - for (child = node->children; child; child = child->next ) { - g_array_append_val(Children,child); - } - si.sort_column = sort_column; - si.sort_descending = sort_descending; - g_array_sort_with_data(Children,stat_node_array_sortcmp,&si); - for (count = 0; count<((int)Children->len); count++) { - stats_tree_format_node_as_str(g_array_index(Children,stat_node*,count), s, format_type, - indent, full_path, maxnamelen, sort_column, sort_descending); - } - g_array_free(Children,FALSE); - } - g_free(full_path); - - if (format_type==ST_FORMAT_XML) { - g_string_append(s,"\n"); - } + int count; + int num_columns= node->st->num_columns; + gchar **values= stats_tree_get_values_from_node(node); + stat_node *child; + sortinfo si; + gchar *full_path; + char fmt[16]; + + switch(format_type) + { + case ST_FORMAT_YAML: + if (indent) { + g_sprintf(fmt, "%%%ds%%s%%s", indent*4-2); + } + else { + strcpy(fmt, "%s%s%s"); + } + g_string_append_printf(s, fmt, "", indent?"- ":"", "Description"); + g_string_append_printf(s, ": \"%s\"\n", values[0]); + + for (count = 1; countchildren) { + g_string_append_printf(s, fmt, "", indent?" ":"", "Items:\n"); + } + break; + case ST_FORMAT_XML: + { + char *itemname = xml_escape(values[0]); + g_string_append_printf(s,"\n",itemname, + node->rng?" isrange=\"true\"":""); + g_free(itemname); + for (count = 1; count",clean_for_xml_tag(colname)); + g_string_append_printf(s,"%s\n",values[count],colname); + g_free(colname); + } + } + break; + case ST_FORMAT_CSV: + g_string_append_printf(s,"%d,\"%s\",\"%s\"",indent,path,values[0]); + for (count = 1; count INDENT_MAX ? INDENT_MAX : indent; + full_path= g_strdup_printf ("%s/%s",path,values[0]); + + for (count = 0; countchildren) { + GArray *Children= g_array_new(FALSE,FALSE,sizeof(child)); + for (child = node->children; child; child = child->next ) { + g_array_append_val(Children,child); + } + si.sort_column = sort_column; + si.sort_descending = sort_descending; + g_array_sort_with_data(Children,stat_node_array_sortcmp,&si); + for (count = 0; count<((int)Children->len); count++) { + stats_tree_format_node_as_str(g_array_index(Children,stat_node*,count), s, format_type, + indent, full_path, maxnamelen, sort_column, sort_descending); + } + g_array_free(Children,FALSE); + } + g_free(full_path); + + if (format_type==ST_FORMAT_XML) { + g_string_append(s,"\n"); + } } /* - * Editor modelines + * Editor modelines - http://www.wireshark.org/tools/modelines.html * - * Local Variables: + * Local variables: * c-basic-offset: 4 * tab-width: 8 - * indent-tabs-mode: t + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=8 noexpandtab: - * :indentSize=4:tabSize=8:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/epan/stats_tree.h b/epan/stats_tree.h index 0efa1c7349..0e06cccc50 100644 --- a/epan/stats_tree.h +++ b/epan/stats_tree.h @@ -33,38 +33,38 @@ #define STAT_TREE_ROOT "root" -#define ST_FLG_AVERAGE 0x10000000 /* Calculate overages for nodes, rather than totals */ -#define ST_FLG_ROOTCHILD 0x20000000 /* This node is a direct child of the root node */ -#define ST_FLG_DEF_NOEXPAND 0x01000000 /* This node should not be expanded by default */ -#define ST_FLG_SORT_DESC 0x00800000 /* When sorting, sort ascending instead of decending */ -#define ST_FLG_SORT_TOP 0x00400000 /* When sorting always keep these lines on of list */ -#define ST_FLG_SRTCOL_MASK 0x000F0000 /* Mask for sort column ID */ -#define ST_FLG_SRTCOL_SHIFT 16 /* Number of bits to shift masked result */ - -#define ST_FLG_MASK (ST_FLG_AVERAGE|ST_FLG_ROOTCHILD|ST_FLG_DEF_NOEXPAND|\ - ST_FLG_SORT_TOP|ST_FLG_SORT_DESC|ST_FLG_SRTCOL_MASK) - -#define ST_SORT_COL_NAME 1 /* Sort nodes by node names */ -#define ST_SORT_COL_COUNT 2 /* Sort nodes by node count */ -#define ST_SORT_COL_AVG 3 /* Sort nodes by node average */ -#define ST_SORT_COL_MIN 4 /* Sort nodes by minimum node value */ -#define ST_SORT_COL_MAX 5 /* Sort nodes by maximum node value */ -#define ST_SORT_COL_BURSTRATE 6 /* Sort nodes by burst rate */ +#define ST_FLG_AVERAGE 0x10000000 /* Calculate overages for nodes, rather than totals */ +#define ST_FLG_ROOTCHILD 0x20000000 /* This node is a direct child of the root node */ +#define ST_FLG_DEF_NOEXPAND 0x01000000 /* This node should not be expanded by default */ +#define ST_FLG_SORT_DESC 0x00800000 /* When sorting, sort ascending instead of decending */ +#define ST_FLG_SORT_TOP 0x00400000 /* When sorting always keep these lines on of list */ +#define ST_FLG_SRTCOL_MASK 0x000F0000 /* Mask for sort column ID */ +#define ST_FLG_SRTCOL_SHIFT 16 /* Number of bits to shift masked result */ + +#define ST_FLG_MASK (ST_FLG_AVERAGE|ST_FLG_ROOTCHILD|ST_FLG_DEF_NOEXPAND| \ + ST_FLG_SORT_TOP|ST_FLG_SORT_DESC|ST_FLG_SRTCOL_MASK) + +#define ST_SORT_COL_NAME 1 /* Sort nodes by node names */ +#define ST_SORT_COL_COUNT 2 /* Sort nodes by node count */ +#define ST_SORT_COL_AVG 3 /* Sort nodes by node average */ +#define ST_SORT_COL_MIN 4 /* Sort nodes by minimum node value */ +#define ST_SORT_COL_MAX 5 /* Sort nodes by maximum node value */ +#define ST_SORT_COL_BURSTRATE 6 /* Sort nodes by burst rate */ /* obscure information regarding the stats_tree */ typedef struct _stats_tree stats_tree; /* tap packet callback for stats_tree */ typedef int (*stat_tree_packet_cb)(stats_tree*, - packet_info*, - epan_dissect_t*, - const void *); + packet_info *, + epan_dissect_t *, + const void *); /* stats_tree initialization callback */ -typedef void (*stat_tree_init_cb)(stats_tree*); +typedef void (*stat_tree_init_cb)(stats_tree *); /* stats_tree cleanup callback */ -typedef void (*stat_tree_cleanup_cb)(stats_tree*); +typedef void (*stat_tree_cleanup_cb)(stats_tree *); /* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED * abbr: protocol abbr @@ -75,12 +75,12 @@ typedef void (*stat_tree_cleanup_cb)(stats_tree*); * cleanup: cleanup callback */ WS_DLL_PUBLIC void stats_tree_register(const gchar *tapname, - const gchar *abbr, - const gchar *name, - guint flags, - stat_tree_packet_cb packet, - stat_tree_init_cb init, - stat_tree_cleanup_cb cleanup); + const gchar *abbr, + const gchar *name, + guint flags, + stat_tree_packet_cb packet, + stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup); /* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin * abbr: protocol abbr @@ -91,12 +91,12 @@ WS_DLL_PUBLIC void stats_tree_register(const gchar *tapname, * cleanup: cleanup callback */ WS_DLL_PUBLIC void stats_tree_register_plugin(const gchar *tapname, - const gchar *abbr, - const gchar *name, - guint flags, - stat_tree_packet_cb packet, - stat_tree_init_cb init, - stat_tree_cleanup_cb cleanup); + const gchar *abbr, + const gchar *name, + guint flags, + stat_tree_packet_cb packet, + stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup); /* registers a new stats tree * abbr: protocol abbr @@ -108,75 +108,75 @@ WS_DLL_PUBLIC void stats_tree_register_plugin(const gchar *tapname, * stat_group: the group this stat belongs to */ WS_DLL_PUBLIC void stats_tree_register_with_group(const gchar *tapname, - const gchar *abbr, - const gchar *name, - guint flags, - stat_tree_packet_cb packet, - stat_tree_init_cb init, - stat_tree_cleanup_cb cleanup, - register_stat_group_t stat_group); + const gchar *abbr, + const gchar *name, + guint flags, + stat_tree_packet_cb packet, + stat_tree_init_cb init, + stat_tree_cleanup_cb cleanup, + register_stat_group_t stat_group); WS_DLL_PUBLIC int stats_tree_parent_id_by_name(stats_tree *st, const gchar *parent_name); /* Creates a node in the tree (to be used in the in init_cb) -* st: the stats_tree in which to create it -* name: the name of the new node -* parent_name: the name of the parent_node (NULL for root) -* with_children: TRUE if this node will have "dynamically created" children -*/ + * st: the stats_tree in which to create it + * name: the name of the new node + * parent_name: the name of the parent_node (NULL for root) + * with_children: TRUE if this node will have "dynamically created" children + */ WS_DLL_PUBLIC int stats_tree_create_node(stats_tree *st, - const gchar *name, - int parent_id, - gboolean with_children); + const gchar *name, + int parent_id, + gboolean with_children); /* creates a node using its parent's tree name */ WS_DLL_PUBLIC int stats_tree_create_node_by_pname(stats_tree *st, - const gchar *name, - const gchar *parent_name, - gboolean with_children); + const gchar *name, + const gchar *parent_name, + gboolean with_children); /* creates a node in the tree, that will contain a ranges list. - example: - stats_tree_create_range_node(st,name,parent, - "-99","100-199","200-299","300-399","400-", NULL); + example: + stats_tree_create_range_node(st,name,parent, + "-99","100-199","200-299","300-399","400-", NULL); */ WS_DLL_PUBLIC int stats_tree_create_range_node(stats_tree *st, - const gchar *name, - int parent_id, - ...); + const gchar *name, + int parent_id, + ...); WS_DLL_PUBLIC int stats_tree_create_range_node_string(stats_tree *st, - const gchar *name, - int parent_id, - int num_str_ranges, - gchar** str_ranges); + const gchar *name, + int parent_id, + int num_str_ranges, + gchar** str_ranges); WS_DLL_PUBLIC int stats_tree_range_node_with_pname(stats_tree *st, - const gchar *name, - const gchar *parent_name, - ...); + const gchar *name, + const gchar *parent_name, + ...); /* increases by one the ranged node and the sub node to whose range the value belongs */ WS_DLL_PUBLIC int stats_tree_tick_range(stats_tree *st, - const gchar *name, - int parent_id, - int value_in_range); + const gchar *name, + int parent_id, + int value_in_range); #define stats_tree_tick_range_by_pname(st,name,parent_name,value_in_range) \ - stats_tree_tick_range((st),(name),stats_tree_parent_id_by_name((st),(parent_name),(value_in_range)) + stats_tree_tick_range((st),(name),stats_tree_parent_id_by_name((st),(parent_name),(value_in_range)) /* */ WS_DLL_PUBLIC int stats_tree_create_pivot(stats_tree *st, - const gchar *name, - int parent_id); + const gchar *name, + int parent_id); WS_DLL_PUBLIC int stats_tree_create_pivot_by_pname(stats_tree *st, - const gchar *name, - const gchar *parent_name); + const gchar *name, + const gchar *parent_name); WS_DLL_PUBLIC int stats_tree_tick_pivot(stats_tree *st, - int pivot_id, - const gchar *pivot_value); + int pivot_id, + const gchar *pivot_value); /* * manipulates the value of the node whose name is given @@ -185,31 +185,31 @@ WS_DLL_PUBLIC int stats_tree_tick_pivot(stats_tree *st, * with_children=TRUE to indicate that the created node will be a parent */ typedef enum _manip_node_mode { - MN_INCREASE, - MN_SET, - MN_AVERAGE, - MN_AVERAGE_NOTICK, - MN_SET_FLAGS, - MN_CLEAR_FLAGS + MN_INCREASE, + MN_SET, + MN_AVERAGE, + MN_AVERAGE_NOTICK, + MN_SET_FLAGS, + MN_CLEAR_FLAGS } manip_node_mode; WS_DLL_PUBLIC int stats_tree_manip_node(manip_node_mode mode, - stats_tree *st, - const gchar *name, - int parent_id, - gboolean with_children, - gint value); + stats_tree *st, + const gchar *name, + int parent_id, + gboolean with_children, + gint value); -#define increase_stat_node(st,name,parent_id,with_children,value) \ -(stats_tree_manip_node(MN_INCREASE,(st),(name),(parent_id),(with_children),(value))) +#define increase_stat_node(st,name,parent_id,with_children,value) \ + (stats_tree_manip_node(MN_INCREASE,(st),(name),(parent_id),(with_children),(value))) -#define tick_stat_node(st,name,parent_id,with_children) \ -(stats_tree_manip_node(MN_INCREASE,(st),(name),(parent_id),(with_children),1)) +#define tick_stat_node(st,name,parent_id,with_children) \ + (stats_tree_manip_node(MN_INCREASE,(st),(name),(parent_id),(with_children),1)) -#define set_stat_node(st,name,parent_id,with_children,value) \ -(stats_tree_manip_node(MN_SET,(st),(name),(parent_id),(with_children),value)) +#define set_stat_node(st,name,parent_id,with_children,value) \ + (stats_tree_manip_node(MN_SET,(st),(name),(parent_id),(with_children),value)) -#define zero_stat_node(st,name,parent_id,with_children) \ -(stats_tree_manip_node(MN_SET,(st),(name),(parent_id),(with_children),0)) +#define zero_stat_node(st,name,parent_id,with_children) \ + (stats_tree_manip_node(MN_SET,(st),(name),(parent_id),(with_children),0)) /* * Add value to average calculation WITHOUT ticking node. Node MUST be ticked separately! @@ -219,31 +219,31 @@ WS_DLL_PUBLIC int stats_tree_manip_node(manip_node_mode mode, * least show a count instead of 0. */ #define avg_stat_node_add_value_notick(st,name,parent_id,with_children,value) \ -(stats_tree_manip_node(MN_AVERAGE_NOTICK,(st),(name),(parent_id),(with_children),value)) + (stats_tree_manip_node(MN_AVERAGE_NOTICK,(st),(name),(parent_id),(with_children),value)) /* Tick node and add a new value to the average calculation for this stats node. */ -#define avg_stat_node_add_value(st,name,parent_id,with_children,value) \ -(stats_tree_manip_node(MN_AVERAGE,(st),(name),(parent_id),(with_children),value)) +#define avg_stat_node_add_value(st,name,parent_id,with_children,value) \ + (stats_tree_manip_node(MN_AVERAGE,(st),(name),(parent_id),(with_children),value)) /* Set flags for this node. Node created if it does not yet exist. */ -#define stat_node_set_flags(st,name,parent_id,with_children,flags) \ -(stats_tree_manip_node(MN_SET_FLAGS,(st),(name),(parent_id),(with_children),flags)) +#define stat_node_set_flags(st,name,parent_id,with_children,flags) \ + (stats_tree_manip_node(MN_SET_FLAGS,(st),(name),(parent_id),(with_children),flags)) /* Clear flags for this node. Node created if it does not yet exist. */ -#define stat_node_clear_flags(st,name,parent_id,with_children,flags) \ -(stats_tree_manip_node(MN_CLEAR_FLAGS,(st),(name),(parent_id),(with_children),flags)) - -#endif /* __STATS_TREE_H */ +#define stat_node_clear_flags(st,name,parent_id,with_children,flags) \ + (stats_tree_manip_node(MN_CLEAR_FLAGS,(st),(name),(parent_id),(with_children),flags)) /* - * Editor modelines + * Editor modelines - http://www.wireshark.org/tools/modelines.html * - * Local Variables: + * Local variables: * c-basic-offset: 4 * tab-width: 8 - * indent-tabs-mode: t + * indent-tabs-mode: nil * End: * - * vi: ex: set shiftwidth=4 tabstop=8 noexpandtab: - * :indentSize=4:tabSize=8:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ + +#endif /* __STATS_TREE_H */ diff --git a/extcap.c b/extcap.c index 1ec64fe055..4b718af06a 100644 --- a/extcap.c +++ b/extcap.c @@ -67,7 +67,7 @@ static GHashTable *ifaces = NULL; /* Callback definition for extcap_foreach */ typedef gboolean (*extcap_cb_t)(const gchar *extcap, gchar *output, void *data, - gchar **err_str); + gchar **err_str); /* #define ARG_DEBUG */ #if ARG_DEBUG @@ -77,413 +77,413 @@ static void extcap_debug_arguments ( extcap_arg *arg_iter ); static gboolean extcap_if_exists(const char *ifname) { - if ( ifname != NULL ) - { - if ( ifaces != NULL ) - { - if ( g_hash_table_size(ifaces) > 0 ) - { - if ( g_hash_table_lookup(ifaces, (const gchar *)ifname) != NULL ) - { - return TRUE; - } - } - } - } - return FALSE; + if ( ifname != NULL ) + { + if ( ifaces != NULL ) + { + if ( g_hash_table_size(ifaces) > 0 ) + { + if ( g_hash_table_lookup(ifaces, (const gchar *)ifname) != NULL ) + { + return TRUE; + } + } + } + } + return FALSE; } static gboolean extcap_if_exists_for_extcap(const char *ifname, const char *extcap) { - gchar * entry = NULL; - - if ( extcap_if_exists(ifname) ) - { - if ( ( entry = (gchar *)g_hash_table_lookup(ifaces, (const gchar *)ifname) ) != NULL ) - { - if ( strcmp(entry, extcap) == 0 ) - return TRUE; - } - } - - return FALSE; + gchar * entry = NULL; + + if ( extcap_if_exists(ifname) ) + { + if ( ( entry = (gchar *)g_hash_table_lookup(ifaces, (const gchar *)ifname) ) != NULL ) + { + if ( strcmp(entry, extcap) == 0 ) + return TRUE; + } + } + + return FALSE; } static gchar * extcap_if_executable(const char *ifname) { - if ( extcap_if_exists(ifname) ) - return (gchar *)g_hash_table_lookup(ifaces, (const gchar *)ifname); + if ( extcap_if_exists(ifname) ) + return (gchar *)g_hash_table_lookup(ifaces, (const gchar *)ifname); - return (gchar *)NULL; + return (gchar *)NULL; } static void extcap_if_cleanup(void) { - if ( ifaces == NULL ) - ifaces = g_hash_table_new(g_str_hash, g_str_equal); + if ( ifaces == NULL ) + ifaces = g_hash_table_new(g_str_hash, g_str_equal); - g_hash_table_remove_all(ifaces); + g_hash_table_remove_all(ifaces); } static void extcap_if_add(gchar *ifname, gchar *extcap) { - if ( g_hash_table_lookup(ifaces, ifname) == NULL ) - g_hash_table_insert(ifaces, ifname, extcap); + if ( g_hash_table_lookup(ifaces, ifname) == NULL ) + g_hash_table_insert(ifaces, ifname, extcap); } static void extcap_foreach(gint argc, gchar **args, extcap_cb_t cb, - void *cb_data, char **err_str, const char * ifname _U_) { - const char *dirname = get_extcap_dir(); - GDir *dir; - const gchar *file; - gboolean keep_going; - gchar **argv; + void *cb_data, char **err_str, const char * ifname _U_) { + const char *dirname = get_extcap_dir(); + GDir *dir; + const gchar *file; + gboolean keep_going; + gchar **argv; - keep_going = TRUE; + keep_going = TRUE; - argv = (gchar **) g_malloc0(sizeof(gchar *) * (argc + 2)); + argv = (gchar **) g_malloc0(sizeof(gchar *) * (argc + 2)); - if ((dir = g_dir_open(dirname, 0, NULL)) != NULL) { + if ((dir = g_dir_open(dirname, 0, NULL)) != NULL) { #ifdef WIN32 - dirname = g_strescape(dirname,NULL); + dirname = g_strescape(dirname,NULL); #endif - while (keep_going && (file = g_dir_read_name(dir)) != NULL ) { - GString *extcap_string = NULL; - gchar *extcap = NULL; - gchar *command_output = NULL; - gboolean status = FALSE; - gint i; - gint exit_status = 0; - GError *error = NULL; - - /* full path to extcap binary */ - extcap_string = g_string_new(""); + while (keep_going && (file = g_dir_read_name(dir)) != NULL ) { + GString *extcap_string = NULL; + gchar *extcap = NULL; + gchar *command_output = NULL; + gboolean status = FALSE; + gint i; + gint exit_status = 0; + GError *error = NULL; + + /* full path to extcap binary */ + extcap_string = g_string_new(""); #ifdef WIN32 - g_string_printf(extcap_string, "%s\\\\%s",dirname,file); - extcap = g_string_free(extcap_string, FALSE); + g_string_printf(extcap_string, "%s\\\\%s",dirname,file); + extcap = g_string_free(extcap_string, FALSE); #else - g_string_printf(extcap_string, "%s/%s", dirname, file); - extcap = g_string_free(extcap_string, FALSE); + g_string_printf(extcap_string, "%s/%s", dirname, file); + extcap = g_string_free(extcap_string, FALSE); #endif - if ( extcap_if_exists(ifname) && !extcap_if_exists_for_extcap(ifname, extcap ) ) - continue; + if ( extcap_if_exists(ifname) && !extcap_if_exists_for_extcap(ifname, extcap ) ) + continue; - argv[0] = extcap; - for (i = 0; i < argc; ++i) - argv[i+1] = args[i]; - argv[argc+1] = NULL; + argv[0] = extcap; + for (i = 0; i < argc; ++i) + argv[i+1] = args[i]; + argv[argc+1] = NULL; - status = g_spawn_sync(dirname, argv, NULL, - (GSpawnFlags) 0, NULL, NULL, - &command_output, NULL, &exit_status, &error); + status = g_spawn_sync(dirname, argv, NULL, + (GSpawnFlags) 0, NULL, NULL, + &command_output, NULL, &exit_status, &error); - if (status && exit_status == 0) - keep_going = cb(extcap, command_output, cb_data, err_str); + if (status && exit_status == 0) + keep_going = cb(extcap, command_output, cb_data, err_str); - g_free(extcap); - g_free(command_output); - } + g_free(extcap); + g_free(command_output); + } - g_dir_close(dir); - } + g_dir_close(dir); + } - g_free(argv); + g_free(argv); } static gboolean dlt_cb(const gchar *extcap _U_, gchar *output, void *data, - char **err_str) { - extcap_token_sentence *tokens; - extcap_dlt *dlts, *dlt_iter, *next; - if_capabilities_t *caps; - GList *linktype_list = NULL; - data_link_info_t *data_link_info; - - tokens = extcap_tokenize_sentences(output); - extcap_parse_dlts(tokens, &dlts); - - extcap_free_tokenized_sentence_list(tokens); - - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap pipe %s ", extcap); - - /* - * Allocate the interface capabilities structure. - */ - caps = (if_capabilities_t *) g_malloc(sizeof *caps); - caps->can_set_rfmon = FALSE; - - dlt_iter = dlts; - while (dlt_iter != NULL ) { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, - " DLT %d name=\"%s\" display=\"%s\" ", dlt_iter->number, - dlt_iter->name, dlt_iter->display); - - data_link_info = g_new(data_link_info_t, 1); - data_link_info->dlt = dlt_iter->number; - data_link_info->name = g_strdup(dlt_iter->name); - data_link_info->description = g_strdup(dlt_iter->display); - linktype_list = g_list_append(linktype_list, data_link_info); - dlt_iter = dlt_iter->next_dlt; - } - - /* Check to see if we built a list */ - if (linktype_list != NULL && data != NULL) { - caps->data_link_types = linktype_list; - *(if_capabilities_t **) data = caps; - } else { - if (err_str) { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, " returned no DLTs"); - *err_str = g_strdup("Extcap returned no DLTs"); - } - g_free(caps); - } - - dlt_iter = dlts; - while (dlt_iter != NULL ) { - next = dlt_iter->next_dlt; - extcap_free_dlt(dlt_iter); - dlt_iter = next; - } - - return FALSE; + char **err_str) { + extcap_token_sentence *tokens; + extcap_dlt *dlts, *dlt_iter, *next; + if_capabilities_t *caps; + GList *linktype_list = NULL; + data_link_info_t *data_link_info; + + tokens = extcap_tokenize_sentences(output); + extcap_parse_dlts(tokens, &dlts); + + extcap_free_tokenized_sentence_list(tokens); + + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap pipe %s ", extcap); + + /* + * Allocate the interface capabilities structure. + */ + caps = (if_capabilities_t *) g_malloc(sizeof *caps); + caps->can_set_rfmon = FALSE; + + dlt_iter = dlts; + while (dlt_iter != NULL ) { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, + " DLT %d name=\"%s\" display=\"%s\" ", dlt_iter->number, + dlt_iter->name, dlt_iter->display); + + data_link_info = g_new(data_link_info_t, 1); + data_link_info->dlt = dlt_iter->number; + data_link_info->name = g_strdup(dlt_iter->name); + data_link_info->description = g_strdup(dlt_iter->display); + linktype_list = g_list_append(linktype_list, data_link_info); + dlt_iter = dlt_iter->next_dlt; + } + + /* Check to see if we built a list */ + if (linktype_list != NULL && data != NULL) { + caps->data_link_types = linktype_list; + *(if_capabilities_t **) data = caps; + } else { + if (err_str) { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, " returned no DLTs"); + *err_str = g_strdup("Extcap returned no DLTs"); + } + g_free(caps); + } + + dlt_iter = dlts; + while (dlt_iter != NULL ) { + next = dlt_iter->next_dlt; + extcap_free_dlt(dlt_iter); + dlt_iter = next; + } + + return FALSE; } if_capabilities_t * extcap_get_if_dlts(const gchar *ifname, char **err_str) { - gchar *argv[3]; - gint i; - if_capabilities_t *caps = NULL; + gchar *argv[3]; + gint i; + if_capabilities_t *caps = NULL; - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, " returned no DLTs"); + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, " returned no DLTs"); - if (ifname != NULL && err_str != NULL) - *err_str = NULL; + if (ifname != NULL && err_str != NULL) + *err_str = NULL; - if ( extcap_if_exists(ifname) ) - { - argv[0] = g_strdup(EXTCAP_ARGUMENT_LIST_DLTS); - argv[1] = g_strdup(EXTCAP_ARGUMENT_INTERFACE); - argv[2] = g_strdup(ifname); + if ( extcap_if_exists(ifname) ) + { + argv[0] = g_strdup(EXTCAP_ARGUMENT_LIST_DLTS); + argv[1] = g_strdup(EXTCAP_ARGUMENT_INTERFACE); + argv[2] = g_strdup(ifname); - if (err_str) - *err_str = NULL; - extcap_foreach(3, argv, dlt_cb, &caps, err_str, ifname); + if (err_str) + *err_str = NULL; + extcap_foreach(3, argv, dlt_cb, &caps, err_str, ifname); - for (i = 0; i < 3; ++i) - g_free(argv[i]); - } + for (i = 0; i < 3; ++i) + g_free(argv[i]); + } - return caps; + return caps; } static gboolean interfaces_cb(const gchar *extcap, gchar *output, void *data, - char **err_str _U_) { - GList **il = (GList **) data; - extcap_token_sentence *tokens; - extcap_interface *interfaces, *int_iter; /*, *next; */ - if_info_t *if_info; + char **err_str _U_) { + GList **il = (GList **) data; + extcap_token_sentence *tokens; + extcap_interface *interfaces, *int_iter; /*, *next; */ + if_info_t *if_info; - tokens = extcap_tokenize_sentences(output); - extcap_parse_interfaces(tokens, &interfaces); + tokens = extcap_tokenize_sentences(output); + extcap_parse_interfaces(tokens, &interfaces); - extcap_free_tokenized_sentence_list(tokens); + extcap_free_tokenized_sentence_list(tokens); - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap pipe %s ", extcap); + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap pipe %s ", extcap); - int_iter = interfaces; - while (int_iter != NULL ) { - if ( extcap_if_exists(int_iter->call) ) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_WARNING, "Extcap interface \"%s\" is already provided by \"%s\" ", - int_iter->call, (gchar *)extcap_if_executable(int_iter->call) ); - int_iter = int_iter->next_interface; - continue; - } + int_iter = interfaces; + while (int_iter != NULL ) { + if ( extcap_if_exists(int_iter->call) ) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_WARNING, "Extcap interface \"%s\" is already provided by \"%s\" ", + int_iter->call, (gchar *)extcap_if_executable(int_iter->call) ); + int_iter = int_iter->next_interface; + continue; + } - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, " Interface [%s] \"%s\" ", - int_iter->call, int_iter->display); + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, " Interface [%s] \"%s\" ", + int_iter->call, int_iter->display); - if_info = g_new0(if_info_t, 1); - if_info->name = g_strdup(int_iter->call); - if_info->friendly_name = g_strdup(int_iter->display); + if_info = g_new0(if_info_t, 1); + if_info->name = g_strdup(int_iter->call); + if_info->friendly_name = g_strdup(int_iter->display); - if_info->type = IF_EXTCAP; + if_info->type = IF_EXTCAP; - if_info->extcap = g_strdup(extcap); - *il = g_list_append(*il, if_info); + if_info->extcap = g_strdup(extcap); + *il = g_list_append(*il, if_info); - extcap_if_add(g_strdup(int_iter->call), g_strdup(extcap) ); - int_iter = int_iter->next_interface; - } + extcap_if_add(g_strdup(int_iter->call), g_strdup(extcap) ); + int_iter = int_iter->next_interface; + } - return TRUE; + return TRUE; } GList * extcap_interface_list(char **err_str) { - gchar *argv; - /* gint i; */ - GList *ret = NULL; + gchar *argv; + /* gint i; */ + GList *ret = NULL; - if (err_str != NULL) - *err_str = NULL; + if (err_str != NULL) + *err_str = NULL; - extcap_if_cleanup(); + extcap_if_cleanup(); - argv = g_strdup(EXTCAP_ARGUMENT_LIST_INTERFACES); + argv = g_strdup(EXTCAP_ARGUMENT_LIST_INTERFACES); - if (err_str) - *err_str = NULL; - extcap_foreach(1, &argv, interfaces_cb, &ret, err_str, NULL); + if (err_str) + *err_str = NULL; + extcap_foreach(1, &argv, interfaces_cb, &ret, err_str, NULL); - g_free(argv); + g_free(argv); - return ret; + return ret; } static gboolean search_cb(const gchar *extcap _U_, gchar *output, void *data, - char **err_str _U_) { - extcap_token_sentence *tokens = NULL; - GList *arguments = NULL; - GList **il = (GList **) data; + char **err_str _U_) { + extcap_token_sentence *tokens = NULL; + GList *arguments = NULL; + GList **il = (GList **) data; - tokens = extcap_tokenize_sentences(output); - arguments = extcap_parse_args(tokens); + tokens = extcap_tokenize_sentences(output); + arguments = extcap_parse_args(tokens); - extcap_free_tokenized_sentence_list(tokens); + extcap_free_tokenized_sentence_list(tokens); #if ARG_DEBUG - extcap_debug_arguments ( arguments ); + extcap_debug_arguments ( arguments ); #endif - *il = g_list_append(*il, arguments); + *il = g_list_append(*il, arguments); - /* By returning false, extcap_foreach will break on first found */ - return TRUE; + /* By returning false, extcap_foreach will break on first found */ + return TRUE; } GList * extcap_get_if_configuration(const char * ifname) { - gchar *argv[4]; - GList *ret = NULL; - gchar **err_str = NULL; + gchar *argv[4]; + GList *ret = NULL; + gchar **err_str = NULL; - if ( extcap_if_exists(ifname) ) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap path %s", - get_extcap_dir()); + if ( extcap_if_exists(ifname) ) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "Extcap path %s", + get_extcap_dir()); - if (err_str != NULL) - *err_str = NULL; + if (err_str != NULL) + *err_str = NULL; - argv[0] = g_strdup(EXTCAP_ARGUMENT_CONFIG); - argv[1] = g_strdup(EXTCAP_ARGUMENT_INTERFACE); - argv[2] = g_strdup(ifname); - argv[3] = NULL; + argv[0] = g_strdup(EXTCAP_ARGUMENT_CONFIG); + argv[1] = g_strdup(EXTCAP_ARGUMENT_INTERFACE); + argv[2] = g_strdup(ifname); + argv[3] = NULL; - extcap_foreach(4, argv, search_cb, &ret, err_str, ifname); - } + extcap_foreach(4, argv, search_cb, &ret, err_str, ifname); + } - return ret; + return ret; } void extcap_cleanup(capture_options * capture_opts) { - interface_options interface_opts; - guint icnt = 0; + interface_options interface_opts; + guint icnt = 0; - for (icnt = 0; icnt < capture_opts->ifaces->len; icnt++) { - interface_opts = g_array_index(capture_opts->ifaces, interface_options, - icnt); + for (icnt = 0; icnt < capture_opts->ifaces->len; icnt++) { + interface_opts = g_array_index(capture_opts->ifaces, interface_options, + icnt); - /* skip native interfaces */ - if (interface_opts.if_type != IF_EXTCAP) - continue; + /* skip native interfaces */ + if (interface_opts.if_type != IF_EXTCAP) + continue; - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, - "Extcap [%s] - Cleaning up fifo: %s; PID: %d", interface_opts.name, - interface_opts.extcap_fifo, interface_opts.extcap_pid); + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, + "Extcap [%s] - Cleaning up fifo: %s; PID: %d", interface_opts.name, + interface_opts.extcap_fifo, interface_opts.extcap_pid); #ifdef WIN32 - if (pipe_h) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, - "Extcap [%s] - Closing pipe", interface_opts.name); - FlushFileBuffers(pipe_h); - DisconnectNamedPipe(pipe_h); - CloseHandle(pipe_h); - } + if (pipe_h) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, + "Extcap [%s] - Closing pipe", interface_opts.name); + FlushFileBuffers(pipe_h); + DisconnectNamedPipe(pipe_h); + CloseHandle(pipe_h); + } #else - if (interface_opts.extcap_fifo != NULL && file_exists(interface_opts.extcap_fifo)) - { - /* the fifo will not be freed here, but with the other capture_opts in capture_sync */ - ws_unlink(interface_opts.extcap_fifo); - interface_opts.extcap_fifo = NULL; - } + if (interface_opts.extcap_fifo != NULL && file_exists(interface_opts.extcap_fifo)) + { + /* the fifo will not be freed here, but with the other capture_opts in capture_sync */ + ws_unlink(interface_opts.extcap_fifo); + interface_opts.extcap_fifo = NULL; + } #endif - /* Maybe the client closed and removed fifo, but ws should check if - * pid should be closed */ - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, - "Extcap [%s] - Closing spawned PID: %d", interface_opts.name, - interface_opts.extcap_pid); - - if (interface_opts.extcap_child_watch > 0) - { - g_source_remove(interface_opts.extcap_child_watch); - interface_opts.extcap_child_watch = 0; - } - - if (interface_opts.extcap_pid != INVALID_EXTCAP_PID) - { + /* Maybe the client closed and removed fifo, but ws should check if + * pid should be closed */ + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, + "Extcap [%s] - Closing spawned PID: %d", interface_opts.name, + interface_opts.extcap_pid); + + if (interface_opts.extcap_child_watch > 0) + { + g_source_remove(interface_opts.extcap_child_watch); + interface_opts.extcap_child_watch = 0; + } + + if (interface_opts.extcap_pid != INVALID_EXTCAP_PID) + { #ifdef WIN32 - TerminateProcess(interface_opts.extcap_pid, 0); + TerminateProcess(interface_opts.extcap_pid, 0); #endif - g_spawn_close_pid(interface_opts.extcap_pid); - interface_opts.extcap_pid = INVALID_EXTCAP_PID; - } - - /* Make sure modified interface_opts is saved in capture_opts. */ - capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, icnt); - g_array_insert_val(capture_opts->ifaces, icnt, interface_opts); - } + g_spawn_close_pid(interface_opts.extcap_pid); + interface_opts.extcap_pid = INVALID_EXTCAP_PID; + } + + /* Make sure modified interface_opts is saved in capture_opts. */ + capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, icnt); + g_array_insert_val(capture_opts->ifaces, icnt, interface_opts); + } } static void extcap_arg_cb(gpointer key, gpointer value, gpointer data) { - GPtrArray *args = (GPtrArray *)data; + GPtrArray *args = (GPtrArray *)data; - if ( key != NULL ) - { - g_ptr_array_add(args, key); + if ( key != NULL ) + { + g_ptr_array_add(args, key); - if ( value != NULL ) - g_ptr_array_add(args, value); - } + if ( value != NULL ) + g_ptr_array_add(args, value); + } } static void extcap_child_watch_cb(GPid pid, gint status _U_, gpointer user_data) { - guint i; - interface_options interface_opts; - capture_options *capture_opts = (capture_options *)user_data; - - /* Close handle to child process. */ - g_spawn_close_pid(pid); - - /* Update extcap_pid in interface options structure. */ - for (i = 0; i < capture_opts->ifaces->len; i++) - { - interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); - if (interface_opts.extcap_pid == pid) - { - interface_opts.extcap_pid = INVALID_EXTCAP_PID; - interface_opts.extcap_child_watch = 0; - capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, i); - g_array_insert_val(capture_opts->ifaces, i, interface_opts); - break; - } - } + guint i; + interface_options interface_opts; + capture_options *capture_opts = (capture_options *)user_data; + + /* Close handle to child process. */ + g_spawn_close_pid(pid); + + /* Update extcap_pid in interface options structure. */ + for (i = 0; i < capture_opts->ifaces->len; i++) + { + interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); + if (interface_opts.extcap_pid == pid) + { + interface_opts.extcap_pid = INVALID_EXTCAP_PID; + interface_opts.extcap_child_watch = 0; + capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, i); + g_array_insert_val(capture_opts->ifaces, i, interface_opts); + break; + } + } } /* call mkfifo for each extcap, @@ -491,132 +491,132 @@ static void extcap_child_watch_cb(GPid pid, gint status _U_, gpointer user_data) gboolean extcaps_init_initerfaces(capture_options *capture_opts) { - guint i; - interface_options interface_opts; + guint i; + interface_options interface_opts; - for (i = 0; i < capture_opts->ifaces->len; i++) - { - GPtrArray *args = NULL; - GPid pid = INVALID_EXTCAP_PID; - gchar **tmp; - int tmp_i; + for (i = 0; i < capture_opts->ifaces->len; i++) + { + GPtrArray *args = NULL; + GPid pid = INVALID_EXTCAP_PID; + gchar **tmp; + int tmp_i; - interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); + interface_opts = g_array_index(capture_opts->ifaces, interface_options, i); - /* skip native interfaces */ - if (interface_opts.if_type != IF_EXTCAP ) - continue; + /* skip native interfaces */ + if (interface_opts.if_type != IF_EXTCAP ) + continue; - /* create pipe for fifo */ - if ( ! extcap_create_pipe ( &interface_opts.extcap_fifo ) ) - return FALSE; + /* create pipe for fifo */ + if ( ! extcap_create_pipe ( &interface_opts.extcap_fifo ) ) + return FALSE; - /* Create extcap call */ - args = g_ptr_array_new(); + /* Create extcap call */ + args = g_ptr_array_new(); #define add_arg(X) g_ptr_array_add(args, g_strdup(X)) - add_arg(interface_opts.extcap); - add_arg(EXTCAP_ARGUMENT_RUN_CAPTURE); - add_arg(EXTCAP_ARGUMENT_INTERFACE); - add_arg(interface_opts.name); - add_arg(EXTCAP_ARGUMENT_RUN_PIPE); - add_arg(interface_opts.extcap_fifo); - if (interface_opts.extcap_args != NULL) - g_hash_table_foreach(interface_opts.extcap_args, extcap_arg_cb, args); - add_arg(NULL); + add_arg(interface_opts.extcap); + add_arg(EXTCAP_ARGUMENT_RUN_CAPTURE); + add_arg(EXTCAP_ARGUMENT_INTERFACE); + add_arg(interface_opts.name); + add_arg(EXTCAP_ARGUMENT_RUN_PIPE); + add_arg(interface_opts.extcap_fifo); + if (interface_opts.extcap_args != NULL) + g_hash_table_foreach(interface_opts.extcap_args, extcap_arg_cb, args); + add_arg(NULL); #undef add_arg - /* Dump commandline parameters sent to extcap. */ - for (tmp = (gchar **)args->pdata, tmp_i = 0; *tmp && **tmp; ++tmp_i, ++tmp) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "argv[%d]: %s", tmp_i, *tmp); - } - - /* Wireshark for windows crashes here sometimes * - * Access violation reading location 0x... */ - g_spawn_async(NULL, (gchar **)args->pdata, NULL, - (GSpawnFlags) G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, - &pid,NULL); - - g_ptr_array_foreach(args, (GFunc)g_free, NULL); - g_ptr_array_free(args, TRUE); - interface_opts.extcap_pid = pid; - interface_opts.extcap_child_watch = - g_child_watch_add(pid, extcap_child_watch_cb, (gpointer)capture_opts); - capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, i); - g_array_insert_val(capture_opts->ifaces, i, interface_opts); + /* Dump commandline parameters sent to extcap. */ + for (tmp = (gchar **)args->pdata, tmp_i = 0; *tmp && **tmp; ++tmp_i, ++tmp) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "argv[%d]: %s", tmp_i, *tmp); + } + + /* Wireshark for windows crashes here sometimes * + * Access violation reading location 0x... */ + g_spawn_async(NULL, (gchar **)args->pdata, NULL, + (GSpawnFlags) G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, + &pid,NULL); + + g_ptr_array_foreach(args, (GFunc)g_free, NULL); + g_ptr_array_free(args, TRUE); + interface_opts.extcap_pid = pid; + interface_opts.extcap_child_watch = + g_child_watch_add(pid, extcap_child_watch_cb, (gpointer)capture_opts); + capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, i); + g_array_insert_val(capture_opts->ifaces, i, interface_opts); #ifdef WIN32 - /* On Windows, wait for extcap to connect to named pipe. - * Some extcaps will present UAC screen to user. - * 30 second timeout should be reasonable timeout for extcap to - * connect to named pipe (including user interaction). - * Wait on multiple object in case of extcap termination - * without opening pipe. - * - * Minimum supported version of Windows: XP / Server 2003. - */ - if (pid != INVALID_EXTCAP_PID) - { - DWORD dw; - HANDLE handles[2]; - OVERLAPPED ov; - ov.Pointer = 0; - ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - - ConnectNamedPipe(pipe_h, &ov); - handles[0] = ov.hEvent; - handles[1] = pid; - - if (GetLastError() == ERROR_PIPE_CONNECTED) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "extcap connected to pipe"); - } - else - { - dw = WaitForMultipleObjects(2, handles, FALSE, 30000); - if (dw == WAIT_OBJECT_0) - { - /* ConnectNamedPipe finished. */ - DWORD code; - - code = GetLastError(); - if (code == ERROR_IO_PENDING) - { - DWORD dummy; - if (!GetOverlappedResult(ov.hEvent, &ov, &dummy, TRUE)) - { - code = GetLastError(); - } - else - { - code = ERROR_SUCCESS; - } - } - - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "ConnectNamedPipe code: %d", code); - } - else if (dw == (WAIT_OBJECT_0 + 1)) - { - /* extcap process terminated. */ - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "extcap terminated without connecting to pipe!"); - } - else if (dw == WAIT_TIMEOUT) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "extcap didn't connect to pipe within 30 seconds!"); - } - else - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "WaitForMultipleObjects returned 0x%08X. Error %d", dw, GetLastError()); - } - } - - CloseHandle(ov.hEvent); - } + /* On Windows, wait for extcap to connect to named pipe. + * Some extcaps will present UAC screen to user. + * 30 second timeout should be reasonable timeout for extcap to + * connect to named pipe (including user interaction). + * Wait on multiple object in case of extcap termination + * without opening pipe. + * + * Minimum supported version of Windows: XP / Server 2003. + */ + if (pid != INVALID_EXTCAP_PID) + { + DWORD dw; + HANDLE handles[2]; + OVERLAPPED ov; + ov.Pointer = 0; + ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + ConnectNamedPipe(pipe_h, &ov); + handles[0] = ov.hEvent; + handles[1] = pid; + + if (GetLastError() == ERROR_PIPE_CONNECTED) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "extcap connected to pipe"); + } + else + { + dw = WaitForMultipleObjects(2, handles, FALSE, 30000); + if (dw == WAIT_OBJECT_0) + { + /* ConnectNamedPipe finished. */ + DWORD code; + + code = GetLastError(); + if (code == ERROR_IO_PENDING) + { + DWORD dummy; + if (!GetOverlappedResult(ov.hEvent, &ov, &dummy, TRUE)) + { + code = GetLastError(); + } + else + { + code = ERROR_SUCCESS; + } + } + + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "ConnectNamedPipe code: %d", code); + } + else if (dw == (WAIT_OBJECT_0 + 1)) + { + /* extcap process terminated. */ + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "extcap terminated without connecting to pipe!"); + } + else if (dw == WAIT_TIMEOUT) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "extcap didn't connect to pipe within 30 seconds!"); + } + else + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, "WaitForMultipleObjects returned 0x%08X. Error %d", dw, GetLastError()); + } + } + + CloseHandle(ov.hEvent); + } #endif - } + } - return TRUE; + return TRUE; } #ifdef WIN32 @@ -624,136 +624,136 @@ extcaps_init_initerfaces(capture_options *capture_opts) HANDLE extcap_get_win32_handle() { - return pipe_h; + return pipe_h; } #endif gboolean extcap_create_pipe(char ** fifo) { #ifdef WIN32 - gchar timestr[ 14+1 ]; - time_t current_time; - - gchar *pipename = NULL; - - SECURITY_ATTRIBUTES security; - /* create pipename */ - current_time = time(NULL); - strftime(timestr, sizeof(timestr), "%Y%m%d%H%M%S", localtime(¤t_time)); - pipename = g_strconcat ( "\\\\.\\pipe\\", EXTCAP_PIPE_PREFIX, "_", timestr, NULL ); - - /* Security struct to enable Inheritable HANDLE */ - memset(&security, 0, sizeof(SECURITY_ATTRIBUTES)); - security.nLength = sizeof(SECURITY_ATTRIBUTES); - security.bInheritHandle = TRUE; - security.lpSecurityDescriptor = NULL; - - /* create a namedPipe*/ - pipe_h = CreateNamedPipe( - utf_8to16(pipename), - PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, - PIPE_TYPE_MESSAGE| PIPE_READMODE_MESSAGE | PIPE_WAIT, - 5, 65536, 65536, - 300, - &security); - - if (pipe_h == INVALID_HANDLE_VALUE) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG,"\nError creating pipe => (%d)", GetLastError()); - return FALSE; - } - else - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG,"\nWireshark Created pipe =>(%s)",pipename); - *fifo = g_strdup(pipename); - } + gchar timestr[ 14+1 ]; + time_t current_time; + + gchar *pipename = NULL; + + SECURITY_ATTRIBUTES security; + /* create pipename */ + current_time = time(NULL); + strftime(timestr, sizeof(timestr), "%Y%m%d%H%M%S", localtime(¤t_time)); + pipename = g_strconcat ( "\\\\.\\pipe\\", EXTCAP_PIPE_PREFIX, "_", timestr, NULL ); + + /* Security struct to enable Inheritable HANDLE */ + memset(&security, 0, sizeof(SECURITY_ATTRIBUTES)); + security.nLength = sizeof(SECURITY_ATTRIBUTES); + security.bInheritHandle = TRUE; + security.lpSecurityDescriptor = NULL; + + /* create a namedPipe*/ + pipe_h = CreateNamedPipe( + utf_8to16(pipename), + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_MESSAGE| PIPE_READMODE_MESSAGE | PIPE_WAIT, + 5, 65536, 65536, + 300, + &security); + + if (pipe_h == INVALID_HANDLE_VALUE) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG,"\nError creating pipe => (%d)", GetLastError()); + return FALSE; + } + else + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG,"\nWireshark Created pipe =>(%s)",pipename); + *fifo = g_strdup(pipename); + } #else - gchar *temp_name = NULL; - int fd = 0; + gchar *temp_name = NULL; + int fd = 0; - if ( ( fd = create_tempfile ( &temp_name, EXTCAP_PIPE_PREFIX ) ) == 0 ) - return FALSE; + if ( ( fd = create_tempfile ( &temp_name, EXTCAP_PIPE_PREFIX ) ) == 0 ) + return FALSE; - ws_close(fd); + ws_close(fd); - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, - "Extcap - Creating fifo: %s", temp_name); + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, + "Extcap - Creating fifo: %s", temp_name); - if ( file_exists(temp_name) ) - ws_unlink(temp_name); + if ( file_exists(temp_name) ) + ws_unlink(temp_name); - if (mkfifo(temp_name, 0600) == 0) - *fifo = g_strdup(temp_name); + if (mkfifo(temp_name, 0600) == 0) + *fifo = g_strdup(temp_name); #endif - return TRUE; + return TRUE; } #if ARG_DEBUG void extcap_debug_arguments ( extcap_arg *arg_iter ) { - extcap_value *v = NULL; - GList *walker = NULL; - - printf("debug - parser dump\n"); - while (arg_iter != NULL) { - printf("ARG %d call=%s display=\"%s\" type=", arg_iter->arg_num, arg_iter->call, arg_iter->display); - - switch (arg_iter->arg_type) { - case EXTCAP_ARG_INTEGER: - printf("int\n"); - break; - case EXTCAP_ARG_UNSIGNED: - printf("unsigned\n"); - break; - case EXTCAP_ARG_LONG: - printf("long\n"); - break; - case EXTCAP_ARG_DOUBLE: - printf("double\n"); - break; - case EXTCAP_ARG_BOOLEAN: - printf("boolean\n"); - break; - case EXTCAP_ARG_MENU: - printf("menu\n"); - break; - case EXTCAP_ARG_RADIO: - printf("radio\n"); - break; - case EXTCAP_ARG_SELECTOR: - printf("selctor\n"); - break; - case EXTCAP_ARG_STRING: - printf ( "string\n" ); - break; - case EXTCAP_ARG_MULTICHECK: - printf ( "unknown\n" ); - break; - case EXTCAP_ARG_UNKNOWN: - printf ( "unknown\n" ); - break; - } - - if (arg_iter->range_start != NULL && arg_iter->range_end != NULL) { - printf("\tRange: "); - extcap_printf_complex(arg_iter->range_start); - printf(" - "); - extcap_printf_complex(arg_iter->range_end); - printf("\n"); - } - - for ( walker = g_list_first ( arg_iter->value_list ); walker; walker = walker->next ) - { - v = (extcap_value *)walker->data; - if (v->is_default == TRUE) - printf("*"); - printf("\tcall=\"%p\" display=\"%p\"\n", v->call, v->display); - printf("\tcall=\"%s\" display=\"%s\"\n", v->call, v->display); - } - - arg_iter = arg_iter->next_arg; - } + extcap_value *v = NULL; + GList *walker = NULL; + + printf("debug - parser dump\n"); + while (arg_iter != NULL) { + printf("ARG %d call=%s display=\"%s\" type=", arg_iter->arg_num, arg_iter->call, arg_iter->display); + + switch (arg_iter->arg_type) { + case EXTCAP_ARG_INTEGER: + printf("int\n"); + break; + case EXTCAP_ARG_UNSIGNED: + printf("unsigned\n"); + break; + case EXTCAP_ARG_LONG: + printf("long\n"); + break; + case EXTCAP_ARG_DOUBLE: + printf("double\n"); + break; + case EXTCAP_ARG_BOOLEAN: + printf("boolean\n"); + break; + case EXTCAP_ARG_MENU: + printf("menu\n"); + break; + case EXTCAP_ARG_RADIO: + printf("radio\n"); + break; + case EXTCAP_ARG_SELECTOR: + printf("selctor\n"); + break; + case EXTCAP_ARG_STRING: + printf ( "string\n" ); + break; + case EXTCAP_ARG_MULTICHECK: + printf ( "unknown\n" ); + break; + case EXTCAP_ARG_UNKNOWN: + printf ( "unknown\n" ); + break; + } + + if (arg_iter->range_start != NULL && arg_iter->range_end != NULL) { + printf("\tRange: "); + extcap_printf_complex(arg_iter->range_start); + printf(" - "); + extcap_printf_complex(arg_iter->range_end); + printf("\n"); + } + + for ( walker = g_list_first ( arg_iter->value_list ); walker; walker = walker->next ) + { + v = (extcap_value *)walker->data; + if (v->is_default == TRUE) + printf("*"); + printf("\tcall=\"%p\" display=\"%p\"\n", v->call, v->display); + printf("\tcall=\"%s\" display=\"%s\"\n", v->call, v->display); + } + + arg_iter = arg_iter->next_arg; + } } #endif #endif @@ -763,10 +763,10 @@ void extcap_debug_arguments ( extcap_arg *arg_iter ) * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/extcap.h b/extcap.h index 675a817dbb..66c88664dd 100644 --- a/extcap.h +++ b/extcap.h @@ -37,13 +37,13 @@ #ifdef HAVE_EXTCAP -#define EXTCAP_ARGUMENT_CONFIG "--extcap-config" -#define EXTCAP_ARGUMENT_LIST_INTERFACES "--extcap-interfaces" -#define EXTCAP_ARGUMENT_INTERFACE "--extcap-interface" -#define EXTCAP_ARGUMENT_LIST_DLTS "--extcap-dlts" +#define EXTCAP_ARGUMENT_CONFIG "--extcap-config" +#define EXTCAP_ARGUMENT_LIST_INTERFACES "--extcap-interfaces" +#define EXTCAP_ARGUMENT_INTERFACE "--extcap-interface" +#define EXTCAP_ARGUMENT_LIST_DLTS "--extcap-dlts" -#define EXTCAP_ARGUMENT_RUN_CAPTURE "--capture" -#define EXTCAP_ARGUMENT_RUN_PIPE "--fifo" +#define EXTCAP_ARGUMENT_RUN_CAPTURE "--capture" +#define EXTCAP_ARGUMENT_RUN_PIPE "--fifo" /* try to get if capabilities from extcap */ if_capabilities_t * @@ -81,10 +81,10 @@ extcap_cleanup(capture_options * capture_opts _U_); * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/extcap_parser.c b/extcap_parser.c index 3e239702e3..0dd85ac937 100644 --- a/extcap_parser.c +++ b/extcap_parser.c @@ -31,849 +31,849 @@ #include "extcap_parser.h" void extcap_printf_complex(extcap_complex *comp) { - gchar *ret = extcap_get_complex_as_string(comp); - printf("%s", ret); - g_free(ret); + gchar *ret = extcap_get_complex_as_string(comp); + printf("%s", ret); + g_free(ret); } gchar *extcap_get_complex_as_string(extcap_complex *comp) { - /* Pick an arbitrary size that should be big enough */ - gchar *ret = g_new(gchar, 32); - - if (comp == NULL) { - g_snprintf(ret, 32, "(null)"); - return ret; - } - - switch (comp->complex_type) { - case EXTCAP_ARG_INTEGER: - g_snprintf(ret, 32, "%d", comp->complex_value.int_value); - break; - case EXTCAP_ARG_UNSIGNED: - g_snprintf(ret, 32, "%u", comp->complex_value.uint_value); - break; - case EXTCAP_ARG_LONG: - g_snprintf(ret, 32, "%ld", comp->complex_value.long_value); - break; - case EXTCAP_ARG_DOUBLE: - g_snprintf(ret, 32, "%f", comp->complex_value.double_value); - break; - case EXTCAP_ARG_BOOLEAN: - g_snprintf(ret, 32, "%s", - comp->complex_value.bool_value ? "TRUE" : "FALSE"); - break; - case EXTCAP_ARG_STRING: - case EXTCAP_ARG_FILESELECT: - g_free(ret); - ret = g_strdup(comp->complex_value.string_value); - break; - default: - /* Nulling out the return string */ - g_snprintf(ret, 32, " "); - break; - } - - return ret; + /* Pick an arbitrary size that should be big enough */ + gchar *ret = g_new(gchar, 32); + + if (comp == NULL) { + g_snprintf(ret, 32, "(null)"); + return ret; + } + + switch (comp->complex_type) { + case EXTCAP_ARG_INTEGER: + g_snprintf(ret, 32, "%d", comp->complex_value.int_value); + break; + case EXTCAP_ARG_UNSIGNED: + g_snprintf(ret, 32, "%u", comp->complex_value.uint_value); + break; + case EXTCAP_ARG_LONG: + g_snprintf(ret, 32, "%ld", comp->complex_value.long_value); + break; + case EXTCAP_ARG_DOUBLE: + g_snprintf(ret, 32, "%f", comp->complex_value.double_value); + break; + case EXTCAP_ARG_BOOLEAN: + g_snprintf(ret, 32, "%s", + comp->complex_value.bool_value ? "TRUE" : "FALSE"); + break; + case EXTCAP_ARG_STRING: + case EXTCAP_ARG_FILESELECT: + g_free(ret); + ret = g_strdup(comp->complex_value.string_value); + break; + default: + /* Nulling out the return string */ + g_snprintf(ret, 32, " "); + break; + } + + return ret; } extcap_complex *extcap_parse_complex(extcap_arg_type complex_type, - const gchar *data) { - extcap_complex *rc = g_new(extcap_complex, 1); - gboolean success = FALSE; - long double exp_f; - - switch (complex_type) { - case EXTCAP_ARG_INTEGER: - if (sscanf(data, "%Lf", &exp_f) == 1) { - rc->complex_value.int_value = (int) exp_f; - success = TRUE; - break; - } - break; - case EXTCAP_ARG_UNSIGNED: - if (sscanf(data, "%Lf", &exp_f) == 1) { - rc->complex_value.uint_value = (unsigned int) exp_f; - success = TRUE; - break; - } - break; - case EXTCAP_ARG_LONG: - if (sscanf(data, "%Lf", &exp_f) == 1) { - rc->complex_value.long_value = (long) exp_f; - success = TRUE; - break; - } - break; - case EXTCAP_ARG_DOUBLE: - if (sscanf(data, "%Lf", &exp_f) == 1) { - rc->complex_value.double_value = (double) exp_f; - success = TRUE; - break; - } - break; - case EXTCAP_ARG_BOOLEAN: - case EXTCAP_ARG_BOOLFLAG: - if (data[0] == 't' || data[0] == 'T' || data[0] == '1') { - rc->complex_value.bool_value = 1; - } else { - rc->complex_value.bool_value = 0; - } - success = TRUE; - break; - case EXTCAP_ARG_STRING: - case EXTCAP_ARG_FILESELECT: - rc->complex_value.string_value = g_strdup(data); - success = TRUE; - break; - default: - break; - } - - if (!success) { - g_free(rc); - return NULL ; - } - - rc->complex_type = complex_type; - rc->value_filled = TRUE; - - return rc; + const gchar *data) { + extcap_complex *rc = g_new(extcap_complex, 1); + gboolean success = FALSE; + long double exp_f; + + switch (complex_type) { + case EXTCAP_ARG_INTEGER: + if (sscanf(data, "%Lf", &exp_f) == 1) { + rc->complex_value.int_value = (int) exp_f; + success = TRUE; + break; + } + break; + case EXTCAP_ARG_UNSIGNED: + if (sscanf(data, "%Lf", &exp_f) == 1) { + rc->complex_value.uint_value = (unsigned int) exp_f; + success = TRUE; + break; + } + break; + case EXTCAP_ARG_LONG: + if (sscanf(data, "%Lf", &exp_f) == 1) { + rc->complex_value.long_value = (long) exp_f; + success = TRUE; + break; + } + break; + case EXTCAP_ARG_DOUBLE: + if (sscanf(data, "%Lf", &exp_f) == 1) { + rc->complex_value.double_value = (double) exp_f; + success = TRUE; + break; + } + break; + case EXTCAP_ARG_BOOLEAN: + case EXTCAP_ARG_BOOLFLAG: + if (data[0] == 't' || data[0] == 'T' || data[0] == '1') { + rc->complex_value.bool_value = 1; + } else { + rc->complex_value.bool_value = 0; + } + success = TRUE; + break; + case EXTCAP_ARG_STRING: + case EXTCAP_ARG_FILESELECT: + rc->complex_value.string_value = g_strdup(data); + success = TRUE; + break; + default: + break; + } + + if (!success) { + g_free(rc); + return NULL ; + } + + rc->complex_type = complex_type; + rc->value_filled = TRUE; + + return rc; } gboolean extcap_compare_is_default(extcap_arg *element, extcap_complex *test) { - gboolean result = FALSE; - - if (element->default_complex == NULL) - return result; - - switch (element->arg_type) { - case EXTCAP_ARG_INTEGER: - if (extcap_complex_get_int(test) - == extcap_complex_get_int(element->default_complex)) - result = TRUE; - break; - case EXTCAP_ARG_UNSIGNED: - if (extcap_complex_get_uint(test) - == extcap_complex_get_uint(element->default_complex)) - result = TRUE; - break; - case EXTCAP_ARG_LONG: - if (extcap_complex_get_long(test) - == extcap_complex_get_long(element->default_complex)) - result = TRUE; - break; - case EXTCAP_ARG_DOUBLE: - if (extcap_complex_get_double(test) - == extcap_complex_get_double(element->default_complex)) - result = TRUE; - break; - case EXTCAP_ARG_BOOLEAN: - case EXTCAP_ARG_BOOLFLAG: - if (extcap_complex_get_bool(test) - == extcap_complex_get_bool(element->default_complex)) - result = TRUE; - break; - case EXTCAP_ARG_STRING: - if (strcmp(extcap_complex_get_string(test), - extcap_complex_get_string(element->default_complex)) == 0) - result = TRUE; - break; - - default: - break; - } - - return result; + gboolean result = FALSE; + + if (element->default_complex == NULL) + return result; + + switch (element->arg_type) { + case EXTCAP_ARG_INTEGER: + if (extcap_complex_get_int(test) + == extcap_complex_get_int(element->default_complex)) + result = TRUE; + break; + case EXTCAP_ARG_UNSIGNED: + if (extcap_complex_get_uint(test) + == extcap_complex_get_uint(element->default_complex)) + result = TRUE; + break; + case EXTCAP_ARG_LONG: + if (extcap_complex_get_long(test) + == extcap_complex_get_long(element->default_complex)) + result = TRUE; + break; + case EXTCAP_ARG_DOUBLE: + if (extcap_complex_get_double(test) + == extcap_complex_get_double(element->default_complex)) + result = TRUE; + break; + case EXTCAP_ARG_BOOLEAN: + case EXTCAP_ARG_BOOLFLAG: + if (extcap_complex_get_bool(test) + == extcap_complex_get_bool(element->default_complex)) + result = TRUE; + break; + case EXTCAP_ARG_STRING: + if (strcmp(extcap_complex_get_string(test), + extcap_complex_get_string(element->default_complex)) == 0) + result = TRUE; + break; + + default: + break; + } + + return result; } void extcap_free_complex(extcap_complex *comp) { - if (comp->complex_type == EXTCAP_ARG_STRING - || comp->complex_type == EXTCAP_ARG_FILESELECT) - g_free(comp->complex_value.string_value); + if (comp->complex_type == EXTCAP_ARG_STRING + || comp->complex_type == EXTCAP_ARG_FILESELECT) + g_free(comp->complex_value.string_value); - g_free(comp); + g_free(comp); } int extcap_complex_get_int(extcap_complex *comp) { - if ( comp == NULL ) - return (int)0; - return comp->complex_value.int_value; + if ( comp == NULL ) + return (int)0; + return comp->complex_value.int_value; } unsigned int extcap_complex_get_uint(extcap_complex *comp) { - if ( comp == NULL ) - return (unsigned int)0; - return comp->complex_value.uint_value; + if ( comp == NULL ) + return (unsigned int)0; + return comp->complex_value.uint_value; } long extcap_complex_get_long(extcap_complex *comp) { - if ( comp == NULL ) - return (long)0; - return comp->complex_value.long_value; + if ( comp == NULL ) + return (long)0; + return comp->complex_value.long_value; } double extcap_complex_get_double(extcap_complex *comp) { - if ( comp == NULL ) - return (double)0; - return comp->complex_value.double_value; + if ( comp == NULL ) + return (double)0; + return comp->complex_value.double_value; } gboolean extcap_complex_get_bool(extcap_complex *comp) { - if ( comp == NULL ) - return FALSE; - return comp->complex_value.bool_value; + if ( comp == NULL ) + return FALSE; + return comp->complex_value.bool_value; } gchar *extcap_complex_get_string(extcap_complex *comp) { - return comp->complex_value.string_value; + return comp->complex_value.string_value; } void extcap_free_tokenized_param(extcap_token_param *v) { - if (v == NULL) - return; + if (v == NULL) + return; - if (v->arg != NULL) - g_free(v->arg); + if (v->arg != NULL) + g_free(v->arg); - if (v->value != NULL) - g_free(v->value); + if (v->value != NULL) + g_free(v->value); - g_free(v); + g_free(v); } void extcap_free_tokenized_sentence(extcap_token_sentence *s) { - extcap_token_param *tv; + extcap_token_param *tv; - if (s == NULL) - return; + if (s == NULL) + return; - if (s->sentence != NULL) - g_free(s->sentence); + if (s->sentence != NULL) + g_free(s->sentence); - while (s->param_list != NULL ) { - tv = s->param_list; - s->param_list = tv->next_token; + while (s->param_list != NULL ) { + tv = s->param_list; + s->param_list = tv->next_token; - extcap_free_tokenized_param(tv); - } + extcap_free_tokenized_param(tv); + } } void extcap_free_tokenized_sentence_list(extcap_token_sentence *f) { - extcap_token_sentence *t; + extcap_token_sentence *t; - while (f != NULL ) { - t = f->next_sentence; - extcap_free_tokenized_sentence(f); - f = t; - } + while (f != NULL ) { + t = f->next_sentence; + extcap_free_tokenized_sentence(f); + f = t; + } } extcap_token_sentence *extcap_tokenize_sentence(const gchar *s) { - gchar *b, *e, *eq; - - extcap_token_param *tv = NULL; - - extcap_token_sentence *rs = g_new(extcap_token_sentence, 1); - - rs->sentence = NULL; - rs->next_sentence = NULL; - rs->param_list = NULL; - - if ((b = g_strstr_len(s, -1, " ")) == NULL) { - extcap_free_tokenized_sentence(rs); - return NULL ; - } - - rs->sentence = g_strndup(s, b - s); - - if ((b = g_strstr_len(s, -1, "{")) == NULL) { - /* printf("debug - tokenizer - sentence with no values\n"); */ - extcap_free_tokenized_sentence(rs); - return NULL ; - } - - while (b != NULL ) { - if ((e = g_strstr_len(b, -1, "}")) == NULL) { - /* printf("debug - tokenizer - invalid, missing }\n"); */ - extcap_free_tokenized_sentence(rs); - return NULL ; - } - - if ((eq = g_strstr_len(b, -1, "=")) == NULL) { - /* printf("debug - tokenizer - invalid, missing =\n"); */ - extcap_free_tokenized_sentence(rs); - return NULL ; - } - - b++; - e--; - - if (b >= eq || e <= eq) { - /* printf("debug - tokenizer - invalid, missing arg or value in {}\n"); */ - extcap_free_tokenized_sentence(rs); - return NULL ; - } - - tv = g_new(extcap_token_param, 1); - tv->arg = g_strndup(b, eq - b); - tv->value = g_strndup(eq + 1, e - eq); - - if (g_ascii_strcasecmp(tv->arg, "number") == 0) { - tv->param_type = EXTCAP_PARAM_ARGNUM; - } else if (g_ascii_strcasecmp(tv->arg, "call") == 0) { - tv->param_type = EXTCAP_PARAM_CALL; - } else if (g_ascii_strcasecmp(tv->arg, "display") == 0) { - tv->param_type = EXTCAP_PARAM_DISPLAY; - } else if (g_ascii_strcasecmp(tv->arg, "type") == 0) { - tv->param_type = EXTCAP_PARAM_TYPE; - } else if (g_ascii_strcasecmp(tv->arg, "arg") == 0) { - tv->param_type = EXTCAP_PARAM_ARG; - } else if (g_ascii_strcasecmp(tv->arg, "default") == 0) { - tv->param_type = EXTCAP_PARAM_DEFAULT; - } else if (g_ascii_strcasecmp(tv->arg, "value") == 0) { - tv->param_type = EXTCAP_PARAM_VALUE; - } else if (g_ascii_strcasecmp(tv->arg, "range") == 0) { - tv->param_type = EXTCAP_PARAM_RANGE; - } else if (g_ascii_strcasecmp(tv->arg, "tooltip") == 0) { - tv->param_type = EXTCAP_PARAM_TOOLTIP; - } else if (g_ascii_strcasecmp(tv->arg, "mustexist") == 0) { - tv->param_type = EXTCAP_PARAM_FILE_MUSTEXIST; - } else if (g_ascii_strcasecmp(tv->arg, "name") == 0) { - tv->param_type = EXTCAP_PARAM_NAME; - } else if (g_ascii_strcasecmp(tv->arg, "enabled") == 0) { - tv->param_type = EXTCAP_PARAM_ENABLED; - } else if (g_ascii_strcasecmp(tv->arg, "parent") == 0) { - tv->param_type = EXTCAP_PARAM_PARENT; - } else { - tv->param_type = EXTCAP_PARAM_UNKNOWN; - } - - tv->next_token = rs->param_list; - rs->param_list = tv; - - /* printf("debug - tokenizer - got '%s' = '%s'\n", tv->arg, tv->value); */ - - b = e + 1; - if ((size_t) (b - s) > strlen(s)) - break; - - b = g_strstr_len(b, -1, "{"); - } - - return rs; + gchar *b, *e, *eq; + + extcap_token_param *tv = NULL; + + extcap_token_sentence *rs = g_new(extcap_token_sentence, 1); + + rs->sentence = NULL; + rs->next_sentence = NULL; + rs->param_list = NULL; + + if ((b = g_strstr_len(s, -1, " ")) == NULL) { + extcap_free_tokenized_sentence(rs); + return NULL ; + } + + rs->sentence = g_strndup(s, b - s); + + if ((b = g_strstr_len(s, -1, "{")) == NULL) { + /* printf("debug - tokenizer - sentence with no values\n"); */ + extcap_free_tokenized_sentence(rs); + return NULL ; + } + + while (b != NULL ) { + if ((e = g_strstr_len(b, -1, "}")) == NULL) { + /* printf("debug - tokenizer - invalid, missing }\n"); */ + extcap_free_tokenized_sentence(rs); + return NULL ; + } + + if ((eq = g_strstr_len(b, -1, "=")) == NULL) { + /* printf("debug - tokenizer - invalid, missing =\n"); */ + extcap_free_tokenized_sentence(rs); + return NULL ; + } + + b++; + e--; + + if (b >= eq || e <= eq) { + /* printf("debug - tokenizer - invalid, missing arg or value in {}\n"); */ + extcap_free_tokenized_sentence(rs); + return NULL ; + } + + tv = g_new(extcap_token_param, 1); + tv->arg = g_strndup(b, eq - b); + tv->value = g_strndup(eq + 1, e - eq); + + if (g_ascii_strcasecmp(tv->arg, "number") == 0) { + tv->param_type = EXTCAP_PARAM_ARGNUM; + } else if (g_ascii_strcasecmp(tv->arg, "call") == 0) { + tv->param_type = EXTCAP_PARAM_CALL; + } else if (g_ascii_strcasecmp(tv->arg, "display") == 0) { + tv->param_type = EXTCAP_PARAM_DISPLAY; + } else if (g_ascii_strcasecmp(tv->arg, "type") == 0) { + tv->param_type = EXTCAP_PARAM_TYPE; + } else if (g_ascii_strcasecmp(tv->arg, "arg") == 0) { + tv->param_type = EXTCAP_PARAM_ARG; + } else if (g_ascii_strcasecmp(tv->arg, "default") == 0) { + tv->param_type = EXTCAP_PARAM_DEFAULT; + } else if (g_ascii_strcasecmp(tv->arg, "value") == 0) { + tv->param_type = EXTCAP_PARAM_VALUE; + } else if (g_ascii_strcasecmp(tv->arg, "range") == 0) { + tv->param_type = EXTCAP_PARAM_RANGE; + } else if (g_ascii_strcasecmp(tv->arg, "tooltip") == 0) { + tv->param_type = EXTCAP_PARAM_TOOLTIP; + } else if (g_ascii_strcasecmp(tv->arg, "mustexist") == 0) { + tv->param_type = EXTCAP_PARAM_FILE_MUSTEXIST; + } else if (g_ascii_strcasecmp(tv->arg, "name") == 0) { + tv->param_type = EXTCAP_PARAM_NAME; + } else if (g_ascii_strcasecmp(tv->arg, "enabled") == 0) { + tv->param_type = EXTCAP_PARAM_ENABLED; + } else if (g_ascii_strcasecmp(tv->arg, "parent") == 0) { + tv->param_type = EXTCAP_PARAM_PARENT; + } else { + tv->param_type = EXTCAP_PARAM_UNKNOWN; + } + + tv->next_token = rs->param_list; + rs->param_list = tv; + + /* printf("debug - tokenizer - got '%s' = '%s'\n", tv->arg, tv->value); */ + + b = e + 1; + if ((size_t) (b - s) > strlen(s)) + break; + + b = g_strstr_len(b, -1, "{"); + } + + return rs; } extcap_token_sentence *extcap_tokenize_sentences(const gchar *s) { - extcap_token_sentence *first = NULL, *cur = NULL, *last = NULL; + extcap_token_sentence *first = NULL, *cur = NULL, *last = NULL; - gchar **list, **list_iter; + gchar **list, **list_iter; - list_iter = list = g_strsplit(s, "\n", 0); + list_iter = list = g_strsplit(s, "\n", 0); - while (*list_iter != NULL ) { - cur = extcap_tokenize_sentence(*list_iter); + while (*list_iter != NULL ) { + cur = extcap_tokenize_sentence(*list_iter); - if (cur != NULL) { - if (first == NULL) { - first = cur; - last = cur; - } else { - last->next_sentence = cur; - last = cur; - } - } + if (cur != NULL) { + if (first == NULL) { + first = cur; + last = cur; + } else { + last->next_sentence = cur; + last = cur; + } + } - list_iter++; - } + list_iter++; + } - g_strfreev(list); + g_strfreev(list); - return first; + return first; } extcap_token_param *extcap_find_param_by_type(extcap_token_param *first, - extcap_param_type t) { - while (first != NULL ) { - if (first->param_type == t) { - return first; - } + extcap_param_type t) { + while (first != NULL ) { + if (first->param_type == t) { + return first; + } - first = first->next_token; - } + first = first->next_token; + } - return NULL ; + return NULL ; } void extcap_free_value(extcap_value *v) { - if (v == NULL) - return; + if (v == NULL) + return; - if (v->call != NULL) - g_free(v->call); + if (v->call != NULL) + g_free(v->call); - if (v->display != NULL) - g_free(v->display); + if (v->display != NULL) + g_free(v->display); - g_free(v); + g_free(v); } extcap_interface *extcap_new_interface(void) { - extcap_interface *r = g_new(extcap_interface, 1); + extcap_interface *r = g_new(extcap_interface, 1); - r->call = r->display = NULL; - r->next_interface = NULL; + r->call = r->display = NULL; + r->next_interface = NULL; - return r; + return r; } void extcap_free_interface(extcap_interface *i) { - if (i == NULL) - return; + if (i == NULL) + return; - if (i->call != NULL) - g_free(i->call); + if (i->call != NULL) + g_free(i->call); - if (i->display != NULL) - g_free(i->display); + if (i->display != NULL) + g_free(i->display); } extcap_dlt *extcap_new_dlt(void) { - extcap_dlt *r = g_new(extcap_dlt, 1); + extcap_dlt *r = g_new(extcap_dlt, 1); - r->number = -1; - r->name = r->display = NULL; - r->next_dlt = NULL; + r->number = -1; + r->name = r->display = NULL; + r->next_dlt = NULL; - return r; + return r; } void extcap_free_dlt(extcap_dlt *d) { - if (d == NULL) - return; + if (d == NULL) + return; - if (d->name != NULL) - g_free(d->name); + if (d->name != NULL) + g_free(d->name); - if (d->display != NULL) - g_free(d->display); + if (d->display != NULL) + g_free(d->display); } extcap_arg *extcap_new_arg(void) { - extcap_arg *r = g_new(extcap_arg, 1); + extcap_arg *r = g_new(extcap_arg, 1); - r->call = NULL; - r->display = NULL; - r->tooltip = NULL; - r->arg_type = EXTCAP_ARG_UNKNOWN; - r->range_start = NULL; - r->range_end = NULL; - r->default_complex = NULL; - r->fileexists = FALSE; + r->call = NULL; + r->display = NULL; + r->tooltip = NULL; + r->arg_type = EXTCAP_ARG_UNKNOWN; + r->range_start = NULL; + r->range_end = NULL; + r->default_complex = NULL; + r->fileexists = FALSE; - r->values = NULL; - /*r->next_arg = NULL; */ + r->values = NULL; + /*r->next_arg = NULL; */ - return r; + return r; } static void extcap_free_valuelist(gpointer data, gpointer user_data _U_) { - extcap_free_value((extcap_value *) data); + extcap_free_value((extcap_value *) data); } void extcap_free_arg(extcap_arg *a) { - if (a == NULL) - return; + if (a == NULL) + return; - if (a->call != NULL) - g_free(a->call); + if (a->call != NULL) + g_free(a->call); - if (a->display != NULL) - g_free(a->display); + if (a->display != NULL) + g_free(a->display); - if (a->tooltip != NULL) - g_free(a->tooltip); + if (a->tooltip != NULL) + g_free(a->tooltip); - if (a->range_start != NULL) - extcap_free_complex(a->range_start); + if (a->range_start != NULL) + extcap_free_complex(a->range_start); - if (a->range_end != NULL) - extcap_free_complex(a->range_end); + if (a->range_end != NULL) + extcap_free_complex(a->range_end); - if (a->default_complex != NULL) - extcap_free_complex(a->default_complex); + if (a->default_complex != NULL) + extcap_free_complex(a->default_complex); - g_list_foreach(a->values, (GFunc) extcap_free_valuelist, NULL); + g_list_foreach(a->values, (GFunc) extcap_free_valuelist, NULL); } static void extcap_free_arg_list_cb(gpointer listentry, gpointer data _U_) { - if (listentry != NULL) - extcap_free_arg((extcap_arg *) listentry); + if (listentry != NULL) + extcap_free_arg((extcap_arg *) listentry); } void extcap_free_arg_list(GList *a) { - g_list_foreach(a, extcap_free_arg_list_cb, NULL); - g_list_free(a); + g_list_foreach(a, extcap_free_arg_list_cb, NULL); + g_list_free(a); } static gint glist_find_numbered_arg(gconstpointer listelem, gconstpointer needle) { - if (((const extcap_arg *) listelem)->arg_num == *((const int*) needle)) - return 0; - return 1; + if (((const extcap_arg *) listelem)->arg_num == *((const int*) needle)) + return 0; + return 1; } extcap_arg *extcap_parse_arg_sentence(GList * args, extcap_token_sentence *s) { - extcap_token_param *v = NULL; - extcap_arg *target_arg = NULL; - extcap_value *value = NULL; - GList * entry = NULL; - int tint; - extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; - - if (s == NULL) - return target_arg; - - if (g_ascii_strcasecmp(s->sentence, "arg") == 0) { - sent = EXTCAP_SENTENCE_ARG; - /* printf("ARG sentence\n"); */ - } else if (g_ascii_strcasecmp(s->sentence, "value") == 0) { - sent = EXTCAP_SENTENCE_VALUE; - /* printf("VALUE sentence\n"); */ - } - - if (sent == EXTCAP_SENTENCE_ARG) { - target_arg = extcap_new_arg(); - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARGNUM)) - == NULL) { - extcap_free_arg(target_arg); - return NULL ; - } - - if (sscanf(v->value, "%d", &(target_arg->arg_num)) != 1) { - extcap_free_arg(target_arg); - return NULL ; - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_CALL)) - == NULL) { - extcap_free_arg(target_arg); - return NULL ; - } - target_arg->call = g_strdup(v->value); - - /* No value only parameters allowed */ - if (strlen(target_arg->call) == 0) { - extcap_free_arg(target_arg); - return NULL ; - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) - == NULL) { - extcap_free_arg(target_arg); - return NULL ; - } - target_arg->display = g_strdup(v->value); - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_TOOLTIP)) - != NULL) { - target_arg->tooltip = g_strdup(v->value); - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_FILE_MUSTEXIST)) - != NULL) { - target_arg->fileexists = (v->value[0] == 't' || v->value[0] == 'T'); - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_TYPE)) - == NULL) { - /* printf("no type in ARG sentence\n"); */ - extcap_free_arg(target_arg); - return NULL ; - } - - if (g_ascii_strcasecmp(v->value, "integer") == 0) { - target_arg->arg_type = EXTCAP_ARG_INTEGER; - } else if (g_ascii_strcasecmp(v->value, "unsigned") == 0) { - target_arg->arg_type = EXTCAP_ARG_UNSIGNED; - } else if (g_ascii_strcasecmp(v->value, "long") == 0) { - target_arg->arg_type = EXTCAP_ARG_LONG; - } else if (g_ascii_strcasecmp(v->value, "double") == 0) { - target_arg->arg_type = EXTCAP_ARG_DOUBLE; - } else if (g_ascii_strcasecmp(v->value, "boolean") == 0) { - target_arg->arg_type = EXTCAP_ARG_BOOLEAN; - } else if (g_ascii_strcasecmp(v->value, "boolflag") == 0) { - target_arg->arg_type = EXTCAP_ARG_BOOLFLAG; - } else if (g_ascii_strcasecmp(v->value, "menu") == 0) { - target_arg->arg_type = EXTCAP_ARG_MENU; - } else if (g_ascii_strcasecmp(v->value, "selector") == 0) { - target_arg->arg_type = EXTCAP_ARG_SELECTOR; - } else if (g_ascii_strcasecmp(v->value, "radio") == 0) { - target_arg->arg_type = EXTCAP_ARG_RADIO; - } else if (g_ascii_strcasecmp(v->value, "string") == 0) { - target_arg->arg_type = EXTCAP_ARG_STRING; - } else if (g_ascii_strcasecmp(v->value, "fileselect") == 0) { - target_arg->arg_type = EXTCAP_ARG_FILESELECT; - } else if (g_ascii_strcasecmp(v->value, "multicheck") == 0) { - target_arg->arg_type = EXTCAP_ARG_MULTICHECK; - } else { - printf("invalid type %s in ARG sentence\n", v->value); - extcap_free_arg(target_arg); - return NULL ; - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_RANGE)) - != NULL) { - gchar *cp = g_strstr_len(v->value, -1, ","); - - if (cp == NULL) { - printf("invalid range, expected value,value got %s\n", - v->value); - extcap_free_arg(target_arg); - return NULL ; - } - - if ((target_arg->range_start = extcap_parse_complex( - target_arg->arg_type, v->value)) == NULL) { - printf("invalid range, expected value,value got %s\n", - v->value); - extcap_free_arg(target_arg); - return NULL ; - } - - if ((target_arg->range_end = extcap_parse_complex( - target_arg->arg_type, cp + 1)) == NULL) { - printf("invalid range, expected value,value got %s\n", - v->value); - extcap_free_arg(target_arg); - return NULL ; - } - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DEFAULT)) - != NULL) { - if ((target_arg->default_complex = extcap_parse_complex( - target_arg->arg_type, v->value)) == NULL) { - printf("invalid default, couldn't parse %s\n", v->value); - } - } - - } else if (sent == EXTCAP_SENTENCE_VALUE) { - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARG)) - == NULL) { - printf("no arg in VALUE sentence\n"); - return NULL ; - } - - if (sscanf(v->value, "%d", &tint) != 1) { - printf("invalid arg in VALUE sentence\n"); - return NULL ; - } - - ; - if ((entry = g_list_find_custom(args, &tint, glist_find_numbered_arg)) - == NULL) { - printf("couldn't find arg %d in list for VALUE sentence\n", tint); - return NULL ; - } - - value = g_new(extcap_value, 1); - value->display = NULL; - value->call = NULL; - value->enabled = FALSE; - value->is_default = FALSE; - value->arg_num = tint; - value->parent = NULL; - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VALUE)) - == NULL) { - /* printf("no value in VALUE sentence\n"); */ - extcap_free_value(value); - return NULL ; - } - value->call = g_strdup(v->value); - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) - == NULL) { - /* printf("no display in VALUE sentence\n"); */ - extcap_free_value(value); - return NULL ; - } - value->display = g_strdup(v->value); - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_PARENT)) - != NULL) { - value->parent = g_strdup(v->value); - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DEFAULT)) - != NULL) { - /* printf("found default value\n"); */ - value->is_default = (v->value[0] == 't' || v->value[0] == 'T'); - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ENABLED)) - != NULL) { - value->enabled = (v->value[0] == 't' || v->value[0] == 'T'); - } - - ((extcap_arg*) entry->data)->values = g_list_append( - ((extcap_arg*) entry->data)->values, value); - - return NULL ; - } - - return target_arg; + extcap_token_param *v = NULL; + extcap_arg *target_arg = NULL; + extcap_value *value = NULL; + GList * entry = NULL; + int tint; + extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; + + if (s == NULL) + return target_arg; + + if (g_ascii_strcasecmp(s->sentence, "arg") == 0) { + sent = EXTCAP_SENTENCE_ARG; + /* printf("ARG sentence\n"); */ + } else if (g_ascii_strcasecmp(s->sentence, "value") == 0) { + sent = EXTCAP_SENTENCE_VALUE; + /* printf("VALUE sentence\n"); */ + } + + if (sent == EXTCAP_SENTENCE_ARG) { + target_arg = extcap_new_arg(); + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARGNUM)) + == NULL) { + extcap_free_arg(target_arg); + return NULL ; + } + + if (sscanf(v->value, "%d", &(target_arg->arg_num)) != 1) { + extcap_free_arg(target_arg); + return NULL ; + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_CALL)) + == NULL) { + extcap_free_arg(target_arg); + return NULL ; + } + target_arg->call = g_strdup(v->value); + + /* No value only parameters allowed */ + if (strlen(target_arg->call) == 0) { + extcap_free_arg(target_arg); + return NULL ; + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) + == NULL) { + extcap_free_arg(target_arg); + return NULL ; + } + target_arg->display = g_strdup(v->value); + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_TOOLTIP)) + != NULL) { + target_arg->tooltip = g_strdup(v->value); + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_FILE_MUSTEXIST)) + != NULL) { + target_arg->fileexists = (v->value[0] == 't' || v->value[0] == 'T'); + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_TYPE)) + == NULL) { + /* printf("no type in ARG sentence\n"); */ + extcap_free_arg(target_arg); + return NULL ; + } + + if (g_ascii_strcasecmp(v->value, "integer") == 0) { + target_arg->arg_type = EXTCAP_ARG_INTEGER; + } else if (g_ascii_strcasecmp(v->value, "unsigned") == 0) { + target_arg->arg_type = EXTCAP_ARG_UNSIGNED; + } else if (g_ascii_strcasecmp(v->value, "long") == 0) { + target_arg->arg_type = EXTCAP_ARG_LONG; + } else if (g_ascii_strcasecmp(v->value, "double") == 0) { + target_arg->arg_type = EXTCAP_ARG_DOUBLE; + } else if (g_ascii_strcasecmp(v->value, "boolean") == 0) { + target_arg->arg_type = EXTCAP_ARG_BOOLEAN; + } else if (g_ascii_strcasecmp(v->value, "boolflag") == 0) { + target_arg->arg_type = EXTCAP_ARG_BOOLFLAG; + } else if (g_ascii_strcasecmp(v->value, "menu") == 0) { + target_arg->arg_type = EXTCAP_ARG_MENU; + } else if (g_ascii_strcasecmp(v->value, "selector") == 0) { + target_arg->arg_type = EXTCAP_ARG_SELECTOR; + } else if (g_ascii_strcasecmp(v->value, "radio") == 0) { + target_arg->arg_type = EXTCAP_ARG_RADIO; + } else if (g_ascii_strcasecmp(v->value, "string") == 0) { + target_arg->arg_type = EXTCAP_ARG_STRING; + } else if (g_ascii_strcasecmp(v->value, "fileselect") == 0) { + target_arg->arg_type = EXTCAP_ARG_FILESELECT; + } else if (g_ascii_strcasecmp(v->value, "multicheck") == 0) { + target_arg->arg_type = EXTCAP_ARG_MULTICHECK; + } else { + printf("invalid type %s in ARG sentence\n", v->value); + extcap_free_arg(target_arg); + return NULL ; + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_RANGE)) + != NULL) { + gchar *cp = g_strstr_len(v->value, -1, ","); + + if (cp == NULL) { + printf("invalid range, expected value,value got %s\n", + v->value); + extcap_free_arg(target_arg); + return NULL ; + } + + if ((target_arg->range_start = extcap_parse_complex( + target_arg->arg_type, v->value)) == NULL) { + printf("invalid range, expected value,value got %s\n", + v->value); + extcap_free_arg(target_arg); + return NULL ; + } + + if ((target_arg->range_end = extcap_parse_complex( + target_arg->arg_type, cp + 1)) == NULL) { + printf("invalid range, expected value,value got %s\n", + v->value); + extcap_free_arg(target_arg); + return NULL ; + } + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DEFAULT)) + != NULL) { + if ((target_arg->default_complex = extcap_parse_complex( + target_arg->arg_type, v->value)) == NULL) { + printf("invalid default, couldn't parse %s\n", v->value); + } + } + + } else if (sent == EXTCAP_SENTENCE_VALUE) { + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARG)) + == NULL) { + printf("no arg in VALUE sentence\n"); + return NULL ; + } + + if (sscanf(v->value, "%d", &tint) != 1) { + printf("invalid arg in VALUE sentence\n"); + return NULL ; + } + + ; + if ((entry = g_list_find_custom(args, &tint, glist_find_numbered_arg)) + == NULL) { + printf("couldn't find arg %d in list for VALUE sentence\n", tint); + return NULL ; + } + + value = g_new(extcap_value, 1); + value->display = NULL; + value->call = NULL; + value->enabled = FALSE; + value->is_default = FALSE; + value->arg_num = tint; + value->parent = NULL; + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VALUE)) + == NULL) { + /* printf("no value in VALUE sentence\n"); */ + extcap_free_value(value); + return NULL ; + } + value->call = g_strdup(v->value); + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) + == NULL) { + /* printf("no display in VALUE sentence\n"); */ + extcap_free_value(value); + return NULL ; + } + value->display = g_strdup(v->value); + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_PARENT)) + != NULL) { + value->parent = g_strdup(v->value); + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DEFAULT)) + != NULL) { + /* printf("found default value\n"); */ + value->is_default = (v->value[0] == 't' || v->value[0] == 'T'); + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ENABLED)) + != NULL) { + value->enabled = (v->value[0] == 't' || v->value[0] == 'T'); + } + + ((extcap_arg*) entry->data)->values = g_list_append( + ((extcap_arg*) entry->data)->values, value); + + return NULL ; + } + + return target_arg; } GList * extcap_parse_args(extcap_token_sentence *first_s) { - GList * args = NULL; + GList * args = NULL; - while (first_s) { - extcap_arg *ra = NULL; + while (first_s) { + extcap_arg *ra = NULL; - if ((ra = extcap_parse_arg_sentence(args, first_s)) != NULL) - args = g_list_append(args, (gpointer) ra); + if ((ra = extcap_parse_arg_sentence(args, first_s)) != NULL) + args = g_list_append(args, (gpointer) ra); - first_s = first_s->next_sentence; - } + first_s = first_s->next_sentence; + } - return args; + return args; } int extcap_parse_interface_sentence(extcap_token_sentence *s, - extcap_interface **ri) { - extcap_token_param *v = NULL; - extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; + extcap_interface **ri) { + extcap_token_param *v = NULL; + extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; - *ri = NULL; + *ri = NULL; - if (s == NULL) - return -1; + if (s == NULL) + return -1; - if (g_ascii_strcasecmp(s->sentence, "interface") == 0) { - sent = EXTCAP_SENTENCE_INTERFACE; - /* printf("INTERFACE sentence\n"); */ - } + if (g_ascii_strcasecmp(s->sentence, "interface") == 0) { + sent = EXTCAP_SENTENCE_INTERFACE; + /* printf("INTERFACE sentence\n"); */ + } - if (sent == EXTCAP_SENTENCE_UNKNOWN) - return -1; + if (sent == EXTCAP_SENTENCE_UNKNOWN) + return -1; - *ri = extcap_new_interface(); + *ri = extcap_new_interface(); - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VALUE)) - == NULL) { - printf("No value in INTERFACE sentence\n"); - extcap_free_interface(*ri); - return -1; - } - (*ri)->call = g_strdup(v->value); + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_VALUE)) + == NULL) { + printf("No value in INTERFACE sentence\n"); + extcap_free_interface(*ri); + return -1; + } + (*ri)->call = g_strdup(v->value); - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) - == NULL) { - printf("No display in INTERFACE sentence\n"); - extcap_free_interface(*ri); - return -1; - } - (*ri)->display = g_strdup(v->value); + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) + == NULL) { + printf("No display in INTERFACE sentence\n"); + extcap_free_interface(*ri); + return -1; + } + (*ri)->display = g_strdup(v->value); - return 1; + return 1; } int extcap_parse_interfaces(extcap_token_sentence *first_s, - extcap_interface **first_int) { - extcap_interface *first_i = NULL, *last_i = NULL; + extcap_interface **first_int) { + extcap_interface *first_i = NULL, *last_i = NULL; - while (first_s) { - extcap_interface *ri; + while (first_s) { + extcap_interface *ri; - if (extcap_parse_interface_sentence(first_s, &ri) >= 0 && ri != NULL) { - if (first_i == NULL) { - first_i = last_i = ri; - } else { - last_i->next_interface = ri; - last_i = ri; - } - } + if (extcap_parse_interface_sentence(first_s, &ri) >= 0 && ri != NULL) { + if (first_i == NULL) { + first_i = last_i = ri; + } else { + last_i->next_interface = ri; + last_i = ri; + } + } - first_s = first_s->next_sentence; - } + first_s = first_s->next_sentence; + } - *first_int = first_i; + *first_int = first_i; - return 1; + return 1; } int extcap_parse_dlt_sentence(extcap_token_sentence *s, extcap_dlt **rd) { - extcap_token_param *v = NULL; - extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; - - *rd = NULL; - - if (s == NULL) - return -1; - - if (g_ascii_strcasecmp(s->sentence, "dlt") == 0) { - sent = EXTCAP_SENTENCE_DLT; - } - - if (sent == EXTCAP_SENTENCE_UNKNOWN) - return -1; - - *rd = extcap_new_dlt(); - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARGNUM)) - == NULL) { - printf("No number in DLT sentence\n"); - extcap_free_dlt(*rd); - return -1; - } - if (sscanf(v->value, "%d", &((*rd)->number)) != 1) { - printf("Invalid number in DLT sentence\n"); - extcap_free_dlt(*rd); - return -1; - } - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_NAME)) - == NULL) { - printf("No name in DLT sentence\n"); - extcap_free_dlt(*rd); - return -1; - } - (*rd)->name = g_strdup(v->value); - - if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) - == NULL) { - printf("No display in DLT sentence\n"); - extcap_free_dlt(*rd); - return -1; - } - (*rd)->display = g_strdup(v->value); - - return 1; + extcap_token_param *v = NULL; + extcap_sentence_type sent = EXTCAP_SENTENCE_UNKNOWN; + + *rd = NULL; + + if (s == NULL) + return -1; + + if (g_ascii_strcasecmp(s->sentence, "dlt") == 0) { + sent = EXTCAP_SENTENCE_DLT; + } + + if (sent == EXTCAP_SENTENCE_UNKNOWN) + return -1; + + *rd = extcap_new_dlt(); + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_ARGNUM)) + == NULL) { + printf("No number in DLT sentence\n"); + extcap_free_dlt(*rd); + return -1; + } + if (sscanf(v->value, "%d", &((*rd)->number)) != 1) { + printf("Invalid number in DLT sentence\n"); + extcap_free_dlt(*rd); + return -1; + } + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_NAME)) + == NULL) { + printf("No name in DLT sentence\n"); + extcap_free_dlt(*rd); + return -1; + } + (*rd)->name = g_strdup(v->value); + + if ((v = extcap_find_param_by_type(s->param_list, EXTCAP_PARAM_DISPLAY)) + == NULL) { + printf("No display in DLT sentence\n"); + extcap_free_dlt(*rd); + return -1; + } + (*rd)->display = g_strdup(v->value); + + return 1; } int extcap_parse_dlts(extcap_token_sentence *first_s, extcap_dlt **first_dlt) { - extcap_dlt *first_d = NULL, *last_d = NULL; + extcap_dlt *first_d = NULL, *last_d = NULL; - while (first_s) { - extcap_dlt *rd; + while (first_s) { + extcap_dlt *rd; - if (extcap_parse_dlt_sentence(first_s, &rd) >= 0 && rd != NULL) { - if (first_d == NULL) { - first_d = last_d = rd; - } else { - last_d->next_dlt = rd; - last_d = rd; - } - } + if (extcap_parse_dlt_sentence(first_s, &rd) >= 0 && rd != NULL) { + if (first_d == NULL) { + first_d = last_d = rd; + } else { + last_d->next_dlt = rd; + last_d = rd; + } + } - first_s = first_s->next_sentence; - } + first_s = first_s->next_sentence; + } - *first_dlt = first_d; + *first_dlt = first_d; - return 1; + return 1; } /* @@ -881,10 +881,10 @@ int extcap_parse_dlts(extcap_token_sentence *first_s, extcap_dlt **first_dlt) { * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/extcap_parser.h b/extcap_parser.h index 4076dec670..feb7f11c2b 100644 --- a/extcap_parser.h +++ b/extcap_parser.h @@ -27,116 +27,116 @@ #include typedef enum { - EXTCAP_SENTENCE_UNKNOWN, - EXTCAP_SENTENCE_ARG, - EXTCAP_SENTENCE_VALUE, - EXTCAP_SENTENCE_FLAG, - EXTCAP_SENTENCE_INTERFACE, - EXTCAP_SENTENCE_DLT + EXTCAP_SENTENCE_UNKNOWN, + EXTCAP_SENTENCE_ARG, + EXTCAP_SENTENCE_VALUE, + EXTCAP_SENTENCE_FLAG, + EXTCAP_SENTENCE_INTERFACE, + EXTCAP_SENTENCE_DLT } extcap_sentence_type; typedef enum { - /* Simple types */ - EXTCAP_ARG_UNKNOWN, - EXTCAP_ARG_INTEGER, - EXTCAP_ARG_UNSIGNED, - EXTCAP_ARG_LONG, - EXTCAP_ARG_DOUBLE, - EXTCAP_ARG_BOOLEAN, - EXTCAP_ARG_BOOLFLAG, - EXTCAP_ARG_STRING, - /* Complex GUI types which are populated with value sentences */ - EXTCAP_ARG_MENU, - EXTCAP_ARG_SELECTOR, - EXTCAP_ARG_RADIO, - EXTCAP_ARG_MULTICHECK, - EXTCAP_ARG_FILESELECT + /* Simple types */ + EXTCAP_ARG_UNKNOWN, + EXTCAP_ARG_INTEGER, + EXTCAP_ARG_UNSIGNED, + EXTCAP_ARG_LONG, + EXTCAP_ARG_DOUBLE, + EXTCAP_ARG_BOOLEAN, + EXTCAP_ARG_BOOLFLAG, + EXTCAP_ARG_STRING, + /* Complex GUI types which are populated with value sentences */ + EXTCAP_ARG_MENU, + EXTCAP_ARG_SELECTOR, + EXTCAP_ARG_RADIO, + EXTCAP_ARG_MULTICHECK, + EXTCAP_ARG_FILESELECT } extcap_arg_type; typedef enum { - /* value types */ - EXTCAP_PARAM_UNKNOWN, - EXTCAP_PARAM_ARGNUM, - EXTCAP_PARAM_CALL, - EXTCAP_PARAM_DISPLAY, - EXTCAP_PARAM_TYPE, - EXTCAP_PARAM_ARG, - EXTCAP_PARAM_DEFAULT, - EXTCAP_PARAM_VALUE, - EXTCAP_PARAM_RANGE, - EXTCAP_PARAM_TOOLTIP, - EXTCAP_PARAM_NAME, - EXTCAP_PARAM_ENABLED, - EXTCAP_PARAM_FILE_MUSTEXIST, - EXTCAP_PARAM_PARENT + /* value types */ + EXTCAP_PARAM_UNKNOWN, + EXTCAP_PARAM_ARGNUM, + EXTCAP_PARAM_CALL, + EXTCAP_PARAM_DISPLAY, + EXTCAP_PARAM_TYPE, + EXTCAP_PARAM_ARG, + EXTCAP_PARAM_DEFAULT, + EXTCAP_PARAM_VALUE, + EXTCAP_PARAM_RANGE, + EXTCAP_PARAM_TOOLTIP, + EXTCAP_PARAM_NAME, + EXTCAP_PARAM_ENABLED, + EXTCAP_PARAM_FILE_MUSTEXIST, + EXTCAP_PARAM_PARENT } extcap_param_type; /* Values for a given sentence; values are all stored as a call * and a value string, or a valid range, so we only need to store * those and repeat them */ typedef struct _extcap_value { - int arg_num; + int arg_num; - gchar *call; - gchar *display; - gboolean enabled; - gboolean is_default; - gchar *parent; + gchar *call; + gchar *display; + gboolean enabled; + gboolean is_default; + gchar *parent; } extcap_value; /* Complex-ish struct for storing complex values */ typedef struct _extcap_complex { - extcap_arg_type complex_type; - union { - int int_value; - unsigned int uint_value; - long long_value; - double double_value; - gboolean bool_value; - gchar *string_value; - } complex_value; - gboolean value_filled; + extcap_arg_type complex_type; + union { + int int_value; + unsigned int uint_value; + long long_value; + double double_value; + gboolean bool_value; + gchar *string_value; + } complex_value; + gboolean value_filled; } extcap_complex; /* An argument sentence and accompanying options */ typedef struct _extcap_arg { - int arg_num; + int arg_num; - gchar *call; - gchar *display; - gchar *tooltip; - gboolean fileexists; + gchar *call; + gchar *display; + gchar *tooltip; + gboolean fileexists; - extcap_arg_type arg_type; + extcap_arg_type arg_type; - extcap_complex *range_start; - extcap_complex *range_end; - extcap_complex *default_complex; + extcap_complex *range_start; + extcap_complex *range_end; + extcap_complex *default_complex; - GList * values; + GList * values; } extcap_arg; typedef struct _extcap_if { - gchar * extcap_path; - GList * interfaces; + gchar * extcap_path; + GList * interfaces; } extcap_if; typedef struct _extcap_interface { - gchar *call; - gchar *display; + gchar *call; + gchar *display; - struct _extcap_interface *next_interface; + struct _extcap_interface *next_interface; } extcap_interface; extcap_interface *extcap_new_interface(void); void extcap_free_interface(extcap_interface *interface); typedef struct _extcap_dlt { - gint number; - gchar *name; - gchar *display; + gint number; + gchar *name; + gchar *display; - struct _extcap_dlt *next_dlt; + struct _extcap_dlt *next_dlt; } extcap_dlt; extcap_dlt *extcap_new_dlt(void); @@ -144,25 +144,25 @@ void extcap_free_dlt(extcap_dlt *dlt); /* Parser internals */ typedef struct _extcap_token_param { - gchar *arg; - gchar *value; + gchar *arg; + gchar *value; - extcap_param_type param_type; + extcap_param_type param_type; - struct _extcap_token_param *next_token; + struct _extcap_token_param *next_token; } extcap_token_param; typedef struct _extcap_token_sentence { - gchar *sentence; + gchar *sentence; - extcap_token_param *param_list; + extcap_token_param *param_list; - struct _extcap_token_sentence *next_sentence; + struct _extcap_token_sentence *next_sentence; } extcap_token_sentence; /* Parse a string into a complex type */ extcap_complex *extcap_parse_complex(extcap_arg_type complex_type, - const gchar *data); + const gchar *data); /* Free a complex */ void extcap_free_complex(extcap_complex *comp); @@ -201,7 +201,7 @@ extcap_arg *extcap_find_numbered_arg(extcap_arg *first, int number); /* Find the first occurrence in a parameter list of a parameter of the given type */ extcap_token_param *extcap_find_param_by_type(extcap_token_param *first, - extcap_param_type t); + extcap_param_type t); void extcap_free_value(extcap_value *v); @@ -227,11 +227,11 @@ GList * extcap_parse_args(extcap_token_sentence *first_s); * Parse a tokenized set of sentences and validate, looking for interface definitions. */ int extcap_parse_interface_sentence(extcap_token_sentence *s, - extcap_interface **ri); + extcap_interface **ri); /* Parse all sentences for interfaces */ int extcap_parse_interfaces(extcap_token_sentence *first_s, - extcap_interface **first_int); + extcap_interface **first_int); /* Parse a tokenized set of sentences and validate, looking for DLT definitions */ int extcap_parse_dlt_sentence(extcap_token_sentence *s, extcap_dlt **ri); @@ -246,10 +246,10 @@ int extcap_parse_dlts(extcap_token_sentence *first_s, extcap_dlt **first_dlt); * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/ui/gtk/extcap_gtk.c b/ui/gtk/extcap_gtk.c index e3d63c9862..fcde999d56 100644 --- a/ui/gtk/extcap_gtk.c +++ b/ui/gtk/extcap_gtk.c @@ -37,863 +37,863 @@ static gboolean extcap_gtk_count_tree_elements(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { - int *ptr_count = (int*)data; - gboolean multi_enabled; - (void)path; + int *ptr_count = (int*)data; + gboolean multi_enabled; + (void)path; - g_assert(ptr_count != NULL); + g_assert(ptr_count != NULL); - gtk_tree_model_get(model, iter, - EXTCAP_GTK_MULTI_COL_CHECK, &multi_enabled, -1); + gtk_tree_model_get(model, iter, + EXTCAP_GTK_MULTI_COL_CHECK, &multi_enabled, -1); - if (multi_enabled) - { - ++(*ptr_count); - } + if (multi_enabled) + { + ++(*ptr_count); + } - return FALSE; /* Continue iteration. */ + return FALSE; /* Continue iteration. */ } typedef struct _extcap_gtk_multi_fill_cb_data { - gchar **list; - int num; - int max; + gchar **list; + int num; + int max; } extcap_gtk_multi_fill_cb_data; static gboolean extcap_gtk_fill_multi_list(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { - extcap_gtk_multi_fill_cb_data *ptr_data = (extcap_gtk_multi_fill_cb_data*)data; - gboolean multi_enabled; - extcap_value *value; - (void)path; + extcap_gtk_multi_fill_cb_data *ptr_data = (extcap_gtk_multi_fill_cb_data*)data; + gboolean multi_enabled; + extcap_value *value; + (void)path; - g_assert(ptr_data != NULL); + g_assert(ptr_data != NULL); - gtk_tree_model_get(model, iter, - EXTCAP_GTK_MULTI_COL_CHECK, &multi_enabled, - EXTCAP_GTK_MULTI_COL_VALUE, &value, -1); + gtk_tree_model_get(model, iter, + EXTCAP_GTK_MULTI_COL_CHECK, &multi_enabled, + EXTCAP_GTK_MULTI_COL_VALUE, &value, -1); - if (multi_enabled) - { - g_assert(ptr_data->num < ptr_data->max); + if (multi_enabled) + { + g_assert(ptr_data->num < ptr_data->max); - if (ptr_data->num < ptr_data->max) - { - ptr_data->list[ptr_data->num] = g_strdup(value->call); - ptr_data->num++; - } - } + if (ptr_data->num < ptr_data->max) + { + ptr_data->list[ptr_data->num] = g_strdup(value->call); + ptr_data->num++; + } + } - return FALSE; /* Continue iteration. */ + return FALSE; /* Continue iteration. */ } typedef struct _extcap_gtk_multi_find_cb_data { - gchar *parent; - GtkTreeIter *parent_iter; + gchar *parent; + GtkTreeIter *parent_iter; } extcap_gtk_multi_find_cb_data; static gboolean extcap_gtk_find_parent_in_multi_list(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { - extcap_gtk_multi_find_cb_data *ptr_data = (extcap_gtk_multi_find_cb_data*)data; - extcap_value *value; - (void)path; + extcap_gtk_multi_find_cb_data *ptr_data = (extcap_gtk_multi_find_cb_data*)data; + extcap_value *value; + (void)path; - g_assert(ptr_data != NULL); + g_assert(ptr_data != NULL); - gtk_tree_model_get(model, iter, - EXTCAP_GTK_MULTI_COL_VALUE, &value, -1); + gtk_tree_model_get(model, iter, + EXTCAP_GTK_MULTI_COL_VALUE, &value, -1); - if (0 == g_strcmp0(ptr_data->parent, value->call)) - { - ptr_data->parent_iter = gtk_tree_iter_copy(iter); - return TRUE; /* Stop iteration. */ - } + if (0 == g_strcmp0(ptr_data->parent, value->call)) + { + ptr_data->parent_iter = gtk_tree_iter_copy(iter); + return TRUE; /* Stop iteration. */ + } - return FALSE; /* Continue iteration. */ + return FALSE; /* Continue iteration. */ } GHashTable *extcap_gtk_get_state(GtkWidget *widget) { - GSList *widget_list, *widget_iter; - GSList *radio_list = NULL, *radio_iter = NULL; - - GtkWidget *list_widget, *radio_widget, *tree_widget, *entry_widget; - - extcap_arg *arg = NULL; - extcap_value *value = NULL; - extcap_complex *parsed_complex = NULL; - - GtkTreeSelection *treeselection; - GtkTreeModel *treemodel; - GtkTreeIter treeiter; - - GHashTable *ret_hash; - - gchar *call_string = NULL; - - extcap_gtk_multi_fill_cb_data multi_data = { NULL, 0, 0 }; - - int multi_num = 0; - - widget_list = (GSList *) g_object_get_data(G_OBJECT(widget), - EXTCAP_GTK_DATA_KEY_WIDGETLIST); - - if (widget_list == NULL) - return NULL ; - - /* String hash */ - ret_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - - for (widget_iter = widget_list; widget_iter; widget_iter = - widget_iter->next) { - list_widget = (GtkWidget *) widget_iter->data; - - if ((arg = (extcap_arg *) g_object_get_data(G_OBJECT(list_widget), - EXTCAP_GTK_DATA_KEY_ARGPTR)) == NULL) { - continue; - } - - switch (arg->arg_type) { - case EXTCAP_ARG_INTEGER: - case EXTCAP_ARG_UNSIGNED: - case EXTCAP_ARG_LONG: - case EXTCAP_ARG_DOUBLE: - case EXTCAP_ARG_STRING: - parsed_complex = extcap_parse_complex(arg->arg_type, - gtk_entry_get_text(GTK_ENTRY(list_widget))); - if (parsed_complex == NULL) { - continue; - } - break; - case EXTCAP_ARG_BOOLEAN: - case EXTCAP_ARG_BOOLFLAG: - parsed_complex = extcap_parse_complex(arg->arg_type, - gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(list_widget)) ? "true" : "false"); - break; - case EXTCAP_ARG_FILESELECT: - if ((entry_widget = - (GtkWidget *) g_object_get_data(G_OBJECT(list_widget), - EXTCAP_GTK_DATA_KEY_FILENAME)) == NULL) { - continue; - } - parsed_complex = extcap_parse_complex(arg->arg_type, - gtk_entry_get_text(GTK_ENTRY(entry_widget))); - if (parsed_complex == NULL) { - continue; - } - break; - case EXTCAP_ARG_MENU: - break; - case EXTCAP_ARG_RADIO: - if ((radio_widget = (GtkWidget *) g_object_get_data( - G_OBJECT(list_widget), - EXTCAP_GTK_DATA_KEY_FIRSTRADIO)) == NULL) { - continue; - } - - if ((radio_list = gtk_radio_button_get_group( - GTK_RADIO_BUTTON(radio_widget))) == NULL) { - continue; - } - - for (radio_iter = radio_list; radio_iter; - radio_iter = radio_iter->next) { - GtkWidget *cur_radio = (GtkWidget *) radio_iter->data; - - if (gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON(cur_radio))) { - if ((value = (extcap_value *) g_object_get_data( - G_OBJECT(cur_radio), - EXTCAP_GTK_DATA_KEY_VALPTR)) == NULL) { - continue; - } - - if (value->is_default) - continue; - - call_string = g_strdup(value->call); - break; - } - } - - break; - case EXTCAP_ARG_SELECTOR: - if ((tree_widget = (GtkWidget *) g_object_get_data( - G_OBJECT(list_widget), - EXTCAP_GTK_DATA_KEY_TREEVIEW)) == NULL) { - continue; - } - - treeselection = gtk_tree_view_get_selection( - GTK_TREE_VIEW(tree_widget)); - treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_widget)); - if (gtk_tree_selection_get_selected(treeselection, &treemodel, - &treeiter)) { - gtk_tree_model_get(treemodel, &treeiter, EXTCAP_GTK_COL_VALUE, - &value, -1); - - if (value->is_default) - continue; - - call_string = g_strdup(value->call); - } - - break; - case EXTCAP_ARG_MULTICHECK: - if ((tree_widget = (GtkWidget *) g_object_get_data( - G_OBJECT(list_widget), - EXTCAP_GTK_DATA_KEY_TREEVIEW)) == NULL) { - continue; - } - - gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_widget)); - treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_widget)); - - multi_num = 0; - - /* Count the # of items enabled */ - gtk_tree_model_foreach(treemodel, extcap_gtk_count_tree_elements, - &multi_num); - - if (multi_num > 0) - { - multi_data.list = g_new(gchar *, multi_num + 1); - multi_data.num = 0; - multi_data.max = multi_num; - - multi_num = 0; - - /* Get values list of items enabled */ - gtk_tree_model_foreach(treemodel, extcap_gtk_fill_multi_list, - &multi_data); - - multi_data.list[multi_data.max] = NULL; - - call_string = g_strjoinv(",", multi_data.list); - - g_strfreev(multi_data.list); - } - else - { - /* There are no enabled items. Skip this argument from command line. */ - continue; - } - - break; - default: - break; - } - - if (parsed_complex == NULL && call_string == NULL) - continue; - - /* Comparing if the user has changed the value at all, and ignoring it if so */ - if (extcap_compare_is_default(arg, parsed_complex)) - continue; - - /* Flags are set as is, and have not true/false switch */ - if ((arg->arg_type == EXTCAP_ARG_BOOLFLAG) - && (extcap_complex_get_bool(parsed_complex) == TRUE)) { - call_string = g_strdup(" "); - } - - if (parsed_complex != NULL && call_string == NULL) - call_string = extcap_get_complex_as_string(parsed_complex); - - g_hash_table_insert(ret_hash, g_strdup(arg->call), - g_strdup(call_string)); - - g_free(call_string); - call_string = NULL; - - g_free(parsed_complex); - parsed_complex = NULL; - } - - return ret_hash; + GSList *widget_list, *widget_iter; + GSList *radio_list = NULL, *radio_iter = NULL; + + GtkWidget *list_widget, *radio_widget, *tree_widget, *entry_widget; + + extcap_arg *arg = NULL; + extcap_value *value = NULL; + extcap_complex *parsed_complex = NULL; + + GtkTreeSelection *treeselection; + GtkTreeModel *treemodel; + GtkTreeIter treeiter; + + GHashTable *ret_hash; + + gchar *call_string = NULL; + + extcap_gtk_multi_fill_cb_data multi_data = { NULL, 0, 0 }; + + int multi_num = 0; + + widget_list = (GSList *) g_object_get_data(G_OBJECT(widget), + EXTCAP_GTK_DATA_KEY_WIDGETLIST); + + if (widget_list == NULL) + return NULL ; + + /* String hash */ + ret_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + for (widget_iter = widget_list; widget_iter; widget_iter = + widget_iter->next) { + list_widget = (GtkWidget *) widget_iter->data; + + if ((arg = (extcap_arg *) g_object_get_data(G_OBJECT(list_widget), + EXTCAP_GTK_DATA_KEY_ARGPTR)) == NULL) { + continue; + } + + switch (arg->arg_type) { + case EXTCAP_ARG_INTEGER: + case EXTCAP_ARG_UNSIGNED: + case EXTCAP_ARG_LONG: + case EXTCAP_ARG_DOUBLE: + case EXTCAP_ARG_STRING: + parsed_complex = extcap_parse_complex(arg->arg_type, + gtk_entry_get_text(GTK_ENTRY(list_widget))); + if (parsed_complex == NULL) { + continue; + } + break; + case EXTCAP_ARG_BOOLEAN: + case EXTCAP_ARG_BOOLFLAG: + parsed_complex = extcap_parse_complex(arg->arg_type, + gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(list_widget)) ? "true" : "false"); + break; + case EXTCAP_ARG_FILESELECT: + if ((entry_widget = + (GtkWidget *) g_object_get_data(G_OBJECT(list_widget), + EXTCAP_GTK_DATA_KEY_FILENAME)) == NULL) { + continue; + } + parsed_complex = extcap_parse_complex(arg->arg_type, + gtk_entry_get_text(GTK_ENTRY(entry_widget))); + if (parsed_complex == NULL) { + continue; + } + break; + case EXTCAP_ARG_MENU: + break; + case EXTCAP_ARG_RADIO: + if ((radio_widget = (GtkWidget *) g_object_get_data( + G_OBJECT(list_widget), + EXTCAP_GTK_DATA_KEY_FIRSTRADIO)) == NULL) { + continue; + } + + if ((radio_list = gtk_radio_button_get_group( + GTK_RADIO_BUTTON(radio_widget))) == NULL) { + continue; + } + + for (radio_iter = radio_list; radio_iter; + radio_iter = radio_iter->next) { + GtkWidget *cur_radio = (GtkWidget *) radio_iter->data; + + if (gtk_toggle_button_get_active( + GTK_TOGGLE_BUTTON(cur_radio))) { + if ((value = (extcap_value *) g_object_get_data( + G_OBJECT(cur_radio), + EXTCAP_GTK_DATA_KEY_VALPTR)) == NULL) { + continue; + } + + if (value->is_default) + continue; + + call_string = g_strdup(value->call); + break; + } + } + + break; + case EXTCAP_ARG_SELECTOR: + if ((tree_widget = (GtkWidget *) g_object_get_data( + G_OBJECT(list_widget), + EXTCAP_GTK_DATA_KEY_TREEVIEW)) == NULL) { + continue; + } + + treeselection = gtk_tree_view_get_selection( + GTK_TREE_VIEW(tree_widget)); + treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_widget)); + if (gtk_tree_selection_get_selected(treeselection, &treemodel, + &treeiter)) { + gtk_tree_model_get(treemodel, &treeiter, EXTCAP_GTK_COL_VALUE, + &value, -1); + + if (value->is_default) + continue; + + call_string = g_strdup(value->call); + } + + break; + case EXTCAP_ARG_MULTICHECK: + if ((tree_widget = (GtkWidget *) g_object_get_data( + G_OBJECT(list_widget), + EXTCAP_GTK_DATA_KEY_TREEVIEW)) == NULL) { + continue; + } + + gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_widget)); + treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(tree_widget)); + + multi_num = 0; + + /* Count the # of items enabled */ + gtk_tree_model_foreach(treemodel, extcap_gtk_count_tree_elements, + &multi_num); + + if (multi_num > 0) + { + multi_data.list = g_new(gchar *, multi_num + 1); + multi_data.num = 0; + multi_data.max = multi_num; + + multi_num = 0; + + /* Get values list of items enabled */ + gtk_tree_model_foreach(treemodel, extcap_gtk_fill_multi_list, + &multi_data); + + multi_data.list[multi_data.max] = NULL; + + call_string = g_strjoinv(",", multi_data.list); + + g_strfreev(multi_data.list); + } + else + { + /* There are no enabled items. Skip this argument from command line. */ + continue; + } + + break; + default: + break; + } + + if (parsed_complex == NULL && call_string == NULL) + continue; + + /* Comparing if the user has changed the value at all, and ignoring it if so */ + if (extcap_compare_is_default(arg, parsed_complex)) + continue; + + /* Flags are set as is, and have not true/false switch */ + if ((arg->arg_type == EXTCAP_ARG_BOOLFLAG) + && (extcap_complex_get_bool(parsed_complex) == TRUE)) { + call_string = g_strdup(" "); + } + + if (parsed_complex != NULL && call_string == NULL) + call_string = extcap_get_complex_as_string(parsed_complex); + + g_hash_table_insert(ret_hash, g_strdup(arg->call), + g_strdup(call_string)); + + g_free(call_string); + call_string = NULL; + + g_free(parsed_complex); + parsed_complex = NULL; + } + + return ret_hash; } static void extcap_gtk_treeview_vscroll_map_handler(GtkTreeView *treeView, - gpointer data) { - GtkWidget *padBox = (GtkWidget*) data; - gint x, y; + gpointer data) { + GtkWidget *padBox = (GtkWidget*) data; + gint x, y; - g_assert(GTK_IS_BOX(padBox)); + g_assert(GTK_IS_BOX(padBox)); - /* Set the padding above the scrollbar to the height of the tree header window */ - gtk_tree_view_convert_bin_window_to_widget_coords(GTK_TREE_VIEW(treeView), - 0, 0, &x, &y); - gtk_widget_set_size_request(padBox, -1, y); + /* Set the padding above the scrollbar to the height of the tree header window */ + gtk_tree_view_convert_bin_window_to_widget_coords(GTK_TREE_VIEW(treeView), + 0, 0, &x, &y); + gtk_widget_set_size_request(padBox, -1, y); } static GtkWidget *extcap_gtk_wrap_scroll_treeview(GtkWidget *view) { - GtkWidget *vscroll, *padbox, *hbox, *vbox; - GtkAdjustment *padj; + GtkWidget *vscroll, *padbox, *hbox, *vbox; + GtkAdjustment *padj; #if GTK_CHECK_VERSION(3, 0, 0) - padj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(view)); + padj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(view)); #if GTK_CHECK_VERSION(3, 2, 0) - vscroll = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, padj); + vscroll = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, padj); #else - vscroll = gtk_vscrollbar_new(padj); + vscroll = gtk_vscrollbar_new(padj); #endif #else - padj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(view)); - vscroll = gtk_vscrollbar_new(padj); + padj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(view)); + vscroll = gtk_vscrollbar_new(padj); #endif - hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE); + hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE); - /* First insert the tree view */ - gtk_box_pack_start(GTK_BOX(hbox), view, TRUE, TRUE, 0); - gtk_widget_show(view); + /* First insert the tree view */ + gtk_box_pack_start(GTK_BOX(hbox), view, TRUE, TRUE, 0); + gtk_widget_show(view); - /* Pack to the right a vbox containing a box for padding at top and scrollbar */ - vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE); - gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); - gtk_widget_show(vbox); + /* Pack to the right a vbox containing a box for padding at top and scrollbar */ + vbox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE); + gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); + gtk_widget_show(vbox); - padbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE); - gtk_box_pack_start(GTK_BOX(vbox), padbox, FALSE, FALSE, 0); - gtk_widget_show(padbox); + padbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE); + gtk_box_pack_start(GTK_BOX(vbox), padbox, FALSE, FALSE, 0); + gtk_widget_show(padbox); - gtk_box_pack_start(GTK_BOX(vbox), vscroll, TRUE, TRUE, 0); - gtk_widget_show(vscroll); + gtk_box_pack_start(GTK_BOX(vbox), vscroll, TRUE, TRUE, 0); + gtk_widget_show(vscroll); - g_object_set_data(G_OBJECT(hbox), EXTCAP_GTK_DATA_KEY_TREEVIEW, view); + g_object_set_data(G_OBJECT(hbox), EXTCAP_GTK_DATA_KEY_TREEVIEW, view); - g_signal_connect(view, "map", - G_CALLBACK(extcap_gtk_treeview_vscroll_map_handler), padbox); + g_signal_connect(view, "map", + G_CALLBACK(extcap_gtk_treeview_vscroll_map_handler), padbox); - return hbox; + return hbox; } GtkWidget *extcap_create_gtk_listwidget(extcap_arg *argument, - GHashTable *prev_map) { - GtkCellRenderer *renderer; - GtkTreeModel *model; - GtkWidget *view, *retview; - GtkListStore *store; - GtkTreeIter iter; - GtkTreeSelection *selection; - extcap_value *v = NULL; - GList * walker = NULL; - gchar *prev_item = NULL; + GHashTable *prev_map) { + GtkCellRenderer *renderer; + GtkTreeModel *model; + GtkWidget *view, *retview; + GtkListStore *store; + GtkTreeIter iter; + GtkTreeSelection *selection; + extcap_value *v = NULL; + GList * walker = NULL; + gchar *prev_item = NULL; - if (g_list_length(argument->values) == 0) - return NULL ; + if (g_list_length(argument->values) == 0) + return NULL ; - view = gtk_tree_view_new(); + view = gtk_tree_view_new(); - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); - store = gtk_list_store_new(EXTCAP_GTK_NUM_COLS, G_TYPE_STRING, - G_TYPE_POINTER); + store = gtk_list_store_new(EXTCAP_GTK_NUM_COLS, G_TYPE_STRING, + G_TYPE_POINTER); - model = GTK_TREE_MODEL(store); - gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); - gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); + model = GTK_TREE_MODEL(store); + gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); - if (prev_map != NULL) - prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call); + if (prev_map != NULL) + prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call); - for (walker = g_list_first(argument->values); walker != NULL ; walker = - walker->next) { - v = (extcap_value *) walker->data; - if (v->display == NULL) - break; + for (walker = g_list_first(argument->values); walker != NULL ; walker = + walker->next) { + v = (extcap_value *) walker->data; + if (v->display == NULL) + break; - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, EXTCAP_GTK_COL_DISPLAY, v->display, - EXTCAP_GTK_COL_VALUE, v, -1); + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, EXTCAP_GTK_COL_DISPLAY, v->display, + EXTCAP_GTK_COL_VALUE, v, -1); - if (prev_item != NULL) { - if (g_ascii_strcasecmp(prev_item, v->call) == 0) { - gtk_tree_selection_select_iter(selection, &iter); - } - } else if (v->is_default) { - gtk_tree_selection_select_iter(selection, &iter); - } - } + if (prev_item != NULL) { + if (g_ascii_strcasecmp(prev_item, v->call) == 0) { + gtk_tree_selection_select_iter(selection, &iter); + } + } else if (v->is_default) { + gtk_tree_selection_select_iter(selection, &iter); + } + } - renderer = gtk_cell_renderer_text_new(); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, "Name", - renderer, "text", EXTCAP_GTK_COL_DISPLAY, NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, "Name", + renderer, "text", EXTCAP_GTK_COL_DISPLAY, NULL); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); - retview = extcap_gtk_wrap_scroll_treeview(view); + retview = extcap_gtk_wrap_scroll_treeview(view); - if (gtk_tree_model_iter_n_children(model, NULL) > 3) - gtk_widget_set_size_request(retview, 0, 100); + if (gtk_tree_model_iter_n_children(model, NULL) > 3) + gtk_widget_set_size_request(retview, 0, 100); - /* Tree view has own reference */ - g_object_unref(model); + /* Tree view has own reference */ + g_object_unref(model); - return retview; + return retview; } GtkWidget *extcap_create_gtk_radiowidget(extcap_arg *argument, - GHashTable *prev_map) { - GtkWidget *radiobox = NULL, *last_radio = NULL; - extcap_value *v = NULL; - GList * walker = NULL; - gchar *prev_item = NULL; - - if (g_list_length(argument->values) == 0) - return NULL ; - - if (prev_map != NULL) - prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call); - - radiobox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE); - - for (walker = g_list_first(argument->values); walker != NULL ; walker = - walker->next) { - v = (extcap_value *) walker->data; - - if (last_radio == NULL) { - last_radio = gtk_radio_button_new_with_label(NULL, v->display); - /* Set a pointer to the first radio button */ - g_object_set_data(G_OBJECT(radiobox), - EXTCAP_GTK_DATA_KEY_FIRSTRADIO, last_radio); - } else { - last_radio = gtk_radio_button_new_with_label_from_widget( - GTK_RADIO_BUTTON(last_radio), v->display); - } - - /* Set a pointer to the value used in this radio */ - g_object_set_data(G_OBJECT(last_radio), EXTCAP_GTK_DATA_KEY_VALPTR, v); - - if (prev_item != NULL) { - if (g_ascii_strcasecmp(prev_item, v->call) == 0) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(last_radio), - TRUE); - } - } else if (v->is_default) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(last_radio), TRUE); - } - - gtk_box_pack_start(GTK_BOX(radiobox), last_radio, TRUE, TRUE, 0); - gtk_widget_show(last_radio); - } - - return radiobox; + GHashTable *prev_map) { + GtkWidget *radiobox = NULL, *last_radio = NULL; + extcap_value *v = NULL; + GList * walker = NULL; + gchar *prev_item = NULL; + + if (g_list_length(argument->values) == 0) + return NULL ; + + if (prev_map != NULL) + prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call); + + radiobox = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE); + + for (walker = g_list_first(argument->values); walker != NULL ; walker = + walker->next) { + v = (extcap_value *) walker->data; + + if (last_radio == NULL) { + last_radio = gtk_radio_button_new_with_label(NULL, v->display); + /* Set a pointer to the first radio button */ + g_object_set_data(G_OBJECT(radiobox), + EXTCAP_GTK_DATA_KEY_FIRSTRADIO, last_radio); + } else { + last_radio = gtk_radio_button_new_with_label_from_widget( + GTK_RADIO_BUTTON(last_radio), v->display); + } + + /* Set a pointer to the value used in this radio */ + g_object_set_data(G_OBJECT(last_radio), EXTCAP_GTK_DATA_KEY_VALPTR, v); + + if (prev_item != NULL) { + if (g_ascii_strcasecmp(prev_item, v->call) == 0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(last_radio), + TRUE); + } + } else if (v->is_default) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(last_radio), TRUE); + } + + gtk_box_pack_start(GTK_BOX(radiobox), last_radio, TRUE, TRUE, 0); + gtk_widget_show(last_radio); + } + + return radiobox; } static void extcap_gtk_multicheck_toggled(GtkCellRendererToggle *cell _U_, - gchar *path_str, gpointer data) { - GtkTreeModel *model = (GtkTreeModel *) data; - GtkTreeIter iter; - GtkTreePath *path = gtk_tree_path_new_from_string(path_str); - gboolean enabled; + gchar *path_str, gpointer data) { + GtkTreeModel *model = (GtkTreeModel *) data; + GtkTreeIter iter; + GtkTreePath *path = gtk_tree_path_new_from_string(path_str); + gboolean enabled; - gtk_tree_model_get_iter(model, &iter, path); - gtk_tree_model_get(model, &iter, EXTCAP_GTK_MULTI_COL_CHECK, &enabled, -1); + gtk_tree_model_get_iter(model, &iter, path); + gtk_tree_model_get(model, &iter, EXTCAP_GTK_MULTI_COL_CHECK, &enabled, -1); - enabled ^= 1; + enabled ^= 1; - gtk_tree_store_set(GTK_TREE_STORE(model), &iter, EXTCAP_GTK_MULTI_COL_CHECK, - enabled, -1); + gtk_tree_store_set(GTK_TREE_STORE(model), &iter, EXTCAP_GTK_MULTI_COL_CHECK, + enabled, -1); - gtk_tree_path_free(path); + gtk_tree_path_free(path); } GtkWidget *extcap_create_gtk_rangewidget(extcap_arg *argument, - GHashTable *prev_map _U_) { - GtkWidget *spinButton; - GtkAdjustment *adjustment; - - gfloat def = 0.0f, min = 0.0f, max = 0.0f; - - switch (argument->arg_type) { - case EXTCAP_ARG_INTEGER: - def = (gfloat) extcap_complex_get_int(argument->default_complex); - min = (gfloat) extcap_complex_get_int(argument->range_start); - max = (gfloat) extcap_complex_get_int(argument->range_end); - break; - case EXTCAP_ARG_UNSIGNED: - def = (gfloat) extcap_complex_get_uint(argument->default_complex); - min = (gfloat) extcap_complex_get_uint(argument->range_start); - max = (gfloat) extcap_complex_get_uint(argument->range_end); - break; - case EXTCAP_ARG_LONG: - def = (gfloat) extcap_complex_get_long(argument->default_complex); - min = (gfloat) extcap_complex_get_long(argument->range_start); - max = (gfloat) extcap_complex_get_long(argument->range_end); - break; - case EXTCAP_ARG_DOUBLE: - def = (gfloat) extcap_complex_get_double(argument->default_complex); - min = (gfloat) extcap_complex_get_double(argument->range_start); - max = (gfloat) extcap_complex_get_double(argument->range_end); - break; - default: - return NULL ; - break; - } - - adjustment = (GtkAdjustment *)gtk_adjustment_new(def, min, max, 1.0, 10.0, 0.0); - - spinButton = gtk_spin_button_new(adjustment, 0, 0); - gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinButton), TRUE); - gtk_widget_set_size_request(spinButton, 80, -1); - - return spinButton; + GHashTable *prev_map _U_) { + GtkWidget *spinButton; + GtkAdjustment *adjustment; + + gfloat def = 0.0f, min = 0.0f, max = 0.0f; + + switch (argument->arg_type) { + case EXTCAP_ARG_INTEGER: + def = (gfloat) extcap_complex_get_int(argument->default_complex); + min = (gfloat) extcap_complex_get_int(argument->range_start); + max = (gfloat) extcap_complex_get_int(argument->range_end); + break; + case EXTCAP_ARG_UNSIGNED: + def = (gfloat) extcap_complex_get_uint(argument->default_complex); + min = (gfloat) extcap_complex_get_uint(argument->range_start); + max = (gfloat) extcap_complex_get_uint(argument->range_end); + break; + case EXTCAP_ARG_LONG: + def = (gfloat) extcap_complex_get_long(argument->default_complex); + min = (gfloat) extcap_complex_get_long(argument->range_start); + max = (gfloat) extcap_complex_get_long(argument->range_end); + break; + case EXTCAP_ARG_DOUBLE: + def = (gfloat) extcap_complex_get_double(argument->default_complex); + min = (gfloat) extcap_complex_get_double(argument->range_start); + max = (gfloat) extcap_complex_get_double(argument->range_end); + break; + default: + return NULL ; + break; + } + + adjustment = (GtkAdjustment *)gtk_adjustment_new(def, min, max, 1.0, 10.0, 0.0); + + spinButton = gtk_spin_button_new(adjustment, 0, 0); + gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(spinButton), TRUE); + gtk_widget_set_size_request(spinButton, 80, -1); + + return spinButton; } static void extcap_file_selectiondialog( GtkWidget *widget _U_, gpointer data ) { - GtkWidget * filechooser = NULL; - GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE; - gchar *filename = NULL; - gint res = 0; - extcap_arg *argument = NULL; + GtkWidget * filechooser = NULL; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE; + gchar *filename = NULL; + gint res = 0; + extcap_arg *argument = NULL; - if ( GTK_ENTRY(data) == NULL ) - return; + if ( GTK_ENTRY(data) == NULL ) + return; - argument = (extcap_arg *)g_object_get_data(G_OBJECT(data), EXTCAP_GTK_DATA_KEY_ARGUMENT); - if ( argument != NULL && argument->fileexists == TRUE ) - action = GTK_FILE_CHOOSER_ACTION_OPEN; + argument = (extcap_arg *)g_object_get_data(G_OBJECT(data), EXTCAP_GTK_DATA_KEY_ARGUMENT); + if ( argument != NULL && argument->fileexists == TRUE ) + action = GTK_FILE_CHOOSER_ACTION_OPEN; - filechooser = gtk_file_chooser_dialog_new("Select file path", NULL, action, - "_Cancel", GTK_RESPONSE_CANCEL, "_Open", GTK_RESPONSE_ACCEPT, NULL); + filechooser = gtk_file_chooser_dialog_new("Select file path", NULL, action, + "_Cancel", GTK_RESPONSE_CANCEL, "_Open", GTK_RESPONSE_ACCEPT, NULL); - res = gtk_dialog_run (GTK_DIALOG (filechooser)); - if (res == GTK_RESPONSE_ACCEPT) - { - GtkFileChooser *chooser = GTK_FILE_CHOOSER (filechooser); - filename = gtk_file_chooser_get_filename (chooser); + res = gtk_dialog_run (GTK_DIALOG (filechooser)); + if (res == GTK_RESPONSE_ACCEPT) + { + GtkFileChooser *chooser = GTK_FILE_CHOOSER (filechooser); + filename = gtk_file_chooser_get_filename (chooser); - /* this check might not be necessary, but just to be on the safe side */ - if ( action == GTK_FILE_CHOOSER_ACTION_OPEN && ! file_exists ( filename ) ) - filename = g_strdup ( " " ); + /* this check might not be necessary, but just to be on the safe side */ + if ( action == GTK_FILE_CHOOSER_ACTION_OPEN && ! file_exists ( filename ) ) + filename = g_strdup ( " " ); - gtk_entry_set_text(GTK_ENTRY(data), filename); - } + gtk_entry_set_text(GTK_ENTRY(data), filename); + } - gtk_widget_destroy (filechooser); + gtk_widget_destroy (filechooser); } static GtkWidget *extcap_create_gtk_fileselect(extcap_arg *argument, - GHashTable *prev_map _U_, gchar * file _U_) { - GtkWidget * entry = NULL; - GtkWidget * button = NULL; - GtkWidget * ret_box = NULL; - - button = gtk_button_new_with_label ("..."); - entry = gtk_entry_new(); - if (file != NULL) - gtk_entry_set_text(GTK_ENTRY(entry), file); - gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE); - g_object_set_data(G_OBJECT(entry), EXTCAP_GTK_DATA_KEY_ARGUMENT, argument); + GHashTable *prev_map _U_, gchar * file _U_) { + GtkWidget * entry = NULL; + GtkWidget * button = NULL; + GtkWidget * ret_box = NULL; + + button = gtk_button_new_with_label ("..."); + entry = gtk_entry_new(); + if (file != NULL) + gtk_entry_set_text(GTK_ENTRY(entry), file); + gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE); + g_object_set_data(G_OBJECT(entry), EXTCAP_GTK_DATA_KEY_ARGUMENT, argument); #if GTK_CHECK_VERSION(3, 0, 0) - ret_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3); + ret_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3); #else - ret_box = gtk_hbox_new(FALSE, 3); + ret_box = gtk_hbox_new(FALSE, 3); #endif - gtk_box_pack_start ( GTK_BOX(ret_box), entry, TRUE, TRUE, 5 ); - gtk_widget_show(entry); - gtk_box_pack_end ( GTK_BOX(ret_box), button, FALSE, FALSE, 5 ); - gtk_widget_show(button); + gtk_box_pack_start ( GTK_BOX(ret_box), entry, TRUE, TRUE, 5 ); + gtk_widget_show(entry); + gtk_box_pack_end ( GTK_BOX(ret_box), button, FALSE, FALSE, 5 ); + gtk_widget_show(button); - g_signal_connect (button, "clicked", - G_CALLBACK (extcap_file_selectiondialog), (gpointer) entry); + g_signal_connect (button, "clicked", + G_CALLBACK (extcap_file_selectiondialog), (gpointer) entry); - g_object_set_data(G_OBJECT(ret_box), EXTCAP_GTK_DATA_KEY_FILENAME, entry); + g_object_set_data(G_OBJECT(ret_box), EXTCAP_GTK_DATA_KEY_FILENAME, entry); - return ret_box; + return ret_box; } GtkWidget *extcap_create_gtk_multicheckwidget(extcap_arg *argument, - GHashTable *prev_map) { - GtkCellRenderer *renderer, *togglerenderer; - GtkTreeModel *model; - GtkWidget *view, *retview; - GtkTreeStore *store; - GtkTreeIter iter; - GtkTreeSelection *selection; - extcap_value *v = NULL; - GList * walker = NULL; - gchar *prev_item = NULL; - gchar **prev_list = NULL, **prev_iter = NULL; - gboolean prev_value, prev_matched; - extcap_gtk_multi_find_cb_data find_data; - - if (g_list_length(argument->values) == 0) - return NULL ; - - view = gtk_tree_view_new(); - - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); - - store = gtk_tree_store_new(EXTCAP_GTK_MULTI_NUM_COLS, G_TYPE_BOOLEAN, - G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); - - model = GTK_TREE_MODEL(store); - gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); - gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE); - - if (prev_map != NULL) - prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call); - - if (prev_item != NULL) - prev_list = g_strsplit(prev_item, ",", 0); - - for (walker = g_list_first(argument->values); walker != NULL ; walker = - walker->next) { - v = (extcap_value *) walker->data; - if (v->display == NULL) - break; - - find_data.parent = v->parent; - find_data.parent_iter = NULL; - - if (find_data.parent != NULL) - { - gtk_tree_model_foreach(model, extcap_gtk_find_parent_in_multi_list, - &find_data); - if (find_data.parent_iter == NULL) - { - g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, - "Extcap parent %s not found for value %s (%s)", - v->parent, v->call, argument->call); - } - } - - prev_value = FALSE; - prev_matched = FALSE; - gtk_tree_store_append(store, &iter, find_data.parent_iter); - - if (find_data.parent_iter != NULL) - { - gtk_tree_iter_free(find_data.parent_iter); - find_data.parent_iter = NULL; - } - - if (prev_list != NULL) { - prev_matched = FALSE; - prev_iter = prev_list; - - while (*prev_iter != NULL ) { - if (g_strcmp0(*prev_iter, v->call) == 0) { - prev_matched = TRUE; - prev_value = TRUE; - break; - } - - prev_iter++; - } - - if (prev_matched == FALSE) - prev_value = v->enabled; - } - else - { - /* Use default value if there is no information about previously selected items. */ - prev_value = v->is_default; - } - - - /* v->is_default is set when there was {default=true} for this value. */ - /* v->enabled is false for non-clickable tree items ({enabled=false}). */ - gtk_tree_store_set(store, &iter, EXTCAP_GTK_MULTI_COL_CHECK, prev_value, - EXTCAP_GTK_MULTI_COL_DISPLAY, v->display, - EXTCAP_GTK_MULTI_COL_VALUE, v, - EXTCAP_GTK_MULTI_COL_ACTIVATABLE, v->enabled, -1); - } - - if (prev_list != NULL) - g_strfreev(prev_list); - - renderer = gtk_cell_renderer_text_new(); - togglerenderer = gtk_cell_renderer_toggle_new(); - g_signal_connect(togglerenderer, "toggled", - G_CALLBACK(extcap_gtk_multicheck_toggled), model); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, - "Enabled", togglerenderer, "active", EXTCAP_GTK_MULTI_COL_CHECK, - "activatable", EXTCAP_GTK_MULTI_COL_ACTIVATABLE, - "visible", EXTCAP_GTK_MULTI_COL_ACTIVATABLE, - NULL); - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, "Name", - renderer, "text", EXTCAP_GTK_MULTI_COL_DISPLAY, - NULL); - - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); - - retview = extcap_gtk_wrap_scroll_treeview(view); - - if (gtk_tree_model_iter_n_children(model, NULL) > 3) - gtk_widget_set_size_request(retview, 0, 100); - - /* Tree view has own reference */ - g_object_unref(model); - - return retview; + GHashTable *prev_map) { + GtkCellRenderer *renderer, *togglerenderer; + GtkTreeModel *model; + GtkWidget *view, *retview; + GtkTreeStore *store; + GtkTreeIter iter; + GtkTreeSelection *selection; + extcap_value *v = NULL; + GList * walker = NULL; + gchar *prev_item = NULL; + gchar **prev_list = NULL, **prev_iter = NULL; + gboolean prev_value, prev_matched; + extcap_gtk_multi_find_cb_data find_data; + + if (g_list_length(argument->values) == 0) + return NULL ; + + view = gtk_tree_view_new(); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + + store = gtk_tree_store_new(EXTCAP_GTK_MULTI_NUM_COLS, G_TYPE_BOOLEAN, + G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); + + model = GTK_TREE_MODEL(store); + gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE); + + if (prev_map != NULL) + prev_item = (gchar *) g_hash_table_lookup(prev_map, argument->call); + + if (prev_item != NULL) + prev_list = g_strsplit(prev_item, ",", 0); + + for (walker = g_list_first(argument->values); walker != NULL ; walker = + walker->next) { + v = (extcap_value *) walker->data; + if (v->display == NULL) + break; + + find_data.parent = v->parent; + find_data.parent_iter = NULL; + + if (find_data.parent != NULL) + { + gtk_tree_model_foreach(model, extcap_gtk_find_parent_in_multi_list, + &find_data); + if (find_data.parent_iter == NULL) + { + g_log(LOG_DOMAIN_CAPTURE, G_LOG_LEVEL_DEBUG, + "Extcap parent %s not found for value %s (%s)", + v->parent, v->call, argument->call); + } + } + + prev_value = FALSE; + prev_matched = FALSE; + gtk_tree_store_append(store, &iter, find_data.parent_iter); + + if (find_data.parent_iter != NULL) + { + gtk_tree_iter_free(find_data.parent_iter); + find_data.parent_iter = NULL; + } + + if (prev_list != NULL) { + prev_matched = FALSE; + prev_iter = prev_list; + + while (*prev_iter != NULL ) { + if (g_strcmp0(*prev_iter, v->call) == 0) { + prev_matched = TRUE; + prev_value = TRUE; + break; + } + + prev_iter++; + } + + if (prev_matched == FALSE) + prev_value = v->enabled; + } + else + { + /* Use default value if there is no information about previously selected items. */ + prev_value = v->is_default; + } + + + /* v->is_default is set when there was {default=true} for this value. */ + /* v->enabled is false for non-clickable tree items ({enabled=false}). */ + gtk_tree_store_set(store, &iter, EXTCAP_GTK_MULTI_COL_CHECK, prev_value, + EXTCAP_GTK_MULTI_COL_DISPLAY, v->display, + EXTCAP_GTK_MULTI_COL_VALUE, v, + EXTCAP_GTK_MULTI_COL_ACTIVATABLE, v->enabled, -1); + } + + if (prev_list != NULL) + g_strfreev(prev_list); + + renderer = gtk_cell_renderer_text_new(); + togglerenderer = gtk_cell_renderer_toggle_new(); + g_signal_connect(togglerenderer, "toggled", + G_CALLBACK(extcap_gtk_multicheck_toggled), model); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, + "Enabled", togglerenderer, "active", EXTCAP_GTK_MULTI_COL_CHECK, + "activatable", EXTCAP_GTK_MULTI_COL_ACTIVATABLE, + "visible", EXTCAP_GTK_MULTI_COL_ACTIVATABLE, + NULL); + gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, "Name", + renderer, "text", EXTCAP_GTK_MULTI_COL_DISPLAY, + NULL); + + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE); + + retview = extcap_gtk_wrap_scroll_treeview(view); + + if (gtk_tree_model_iter_n_children(model, NULL) > 3) + gtk_widget_set_size_request(retview, 0, 100); + + /* Tree view has own reference */ + g_object_unref(model); + + return retview; } void extcap_gtk_free_args(GtkWidget *vbox) { - GList *arguments = (GList *) g_object_get_data(G_OBJECT(vbox), - EXTCAP_GTK_DATA_KEY_ARGPTR); - extcap_free_arg_list(arguments); - g_object_set_data(G_OBJECT(vbox), EXTCAP_GTK_DATA_KEY_ARGPTR, NULL); + GList *arguments = (GList *) g_object_get_data(G_OBJECT(vbox), + EXTCAP_GTK_DATA_KEY_ARGPTR); + extcap_free_arg_list(arguments); + g_object_set_data(G_OBJECT(vbox), EXTCAP_GTK_DATA_KEY_ARGPTR, NULL); } GSList *extcap_populate_gtk_vbox(GList *arguments, GtkWidget *vbox, - GHashTable *prev_map) { - GSList *widget_toplist = NULL; - - extcap_arg *arg_iter = NULL; - - extcap_complex *prev_complex = NULL; - gchar *prev_call, *default_str; - - GList * arg_list = g_list_first(arguments); - if ( arg_list == NULL ) - return NULL; - - g_object_set_data(G_OBJECT(vbox), EXTCAP_GTK_DATA_KEY_ARGPTR, arguments); - - while (arg_list != NULL ) { - GtkWidget *hbox = NULL, *label = NULL, *item = NULL; - - arg_iter = (extcap_arg*) (arg_list->data); - - /* A new storage box for label + element */ - - hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE); - - if (prev_map != NULL - && (prev_call = (gchar *) g_hash_table_lookup(prev_map, - arg_iter->call)) != NULL) { - prev_complex = extcap_parse_complex(arg_iter->arg_type, prev_call); - } else { - prev_complex = NULL; - } - - switch (arg_iter->arg_type) { - case EXTCAP_ARG_INTEGER: - case EXTCAP_ARG_UNSIGNED: - case EXTCAP_ARG_LONG: - case EXTCAP_ARG_DOUBLE: - label = gtk_label_new(arg_iter->display); - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); - item = extcap_create_gtk_rangewidget(arg_iter, prev_map); - if (item == NULL) { - item = gtk_entry_new(); - - if (prev_complex != NULL) { - default_str = extcap_get_complex_as_string(prev_complex); - gtk_entry_set_text(GTK_ENTRY(item), default_str); - g_free(default_str); - } else if (arg_iter->default_complex != NULL) { - default_str = extcap_get_complex_as_string( - arg_iter->default_complex); - gtk_entry_set_text(GTK_ENTRY(item), default_str); - g_free(default_str); - } - } - break; - case EXTCAP_ARG_STRING: - label = gtk_label_new(arg_iter->display); - - item = gtk_entry_new(); - default_str = NULL; - - if (prev_complex != NULL) - default_str = extcap_get_complex_as_string(prev_complex); - else if (arg_iter->default_complex != NULL) - default_str = extcap_get_complex_as_string( - arg_iter->default_complex); - - if (default_str != NULL) { - gtk_entry_set_text(GTK_ENTRY(item), default_str); - g_free(default_str); - } - - break; - case EXTCAP_ARG_FILESELECT: - label = gtk_label_new(arg_iter->display); - default_str = NULL; - - if (prev_complex != NULL) - default_str = extcap_get_complex_as_string(prev_complex); - else if (arg_iter->default_complex != NULL) - default_str = extcap_get_complex_as_string( - arg_iter->default_complex); - - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); - item = extcap_create_gtk_fileselect(arg_iter, prev_map, default_str); - if (default_str != NULL) - g_free(default_str); - break; - case EXTCAP_ARG_BOOLEAN: - case EXTCAP_ARG_BOOLFLAG: - item = gtk_check_button_new_with_label(arg_iter->display); - - if (prev_complex != NULL) { - if (extcap_complex_get_bool(prev_complex)) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), TRUE); - } else if (arg_iter->default_complex != NULL - && extcap_complex_get_bool(arg_iter->default_complex)) { - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), TRUE); - } - - break; - case EXTCAP_ARG_MENU: - break; - case EXTCAP_ARG_RADIO: - label = gtk_label_new(arg_iter->display); - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); - item = extcap_create_gtk_radiowidget(arg_iter, prev_map); - break; - case EXTCAP_ARG_SELECTOR: - label = gtk_label_new(arg_iter->display); - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); - item = extcap_create_gtk_listwidget(arg_iter, prev_map); - break; - case EXTCAP_ARG_MULTICHECK: - label = gtk_label_new(arg_iter->display); - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); - item = extcap_create_gtk_multicheckwidget(arg_iter, prev_map); - break; - default: - break; - } - - if (prev_complex != NULL) - extcap_free_complex(prev_complex); - - if (label != NULL) { - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); - gtk_widget_show(label); - } - - if (item != NULL) { - gtk_box_pack_start(GTK_BOX(hbox), item, TRUE, TRUE, 0); - gtk_widget_show(item); - g_object_set_data(G_OBJECT(item), EXTCAP_GTK_DATA_KEY_ARGPTR, - arg_iter); - - if (arg_iter->tooltip != NULL) { - gtk_widget_set_tooltip_text(item, arg_iter->tooltip); - } - - widget_toplist = g_slist_append(widget_toplist, item); - } - - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 1); - - gtk_widget_show(hbox); - - arg_list = arg_list->next; - } - - return widget_toplist; + GHashTable *prev_map) { + GSList *widget_toplist = NULL; + + extcap_arg *arg_iter = NULL; + + extcap_complex *prev_complex = NULL; + gchar *prev_call, *default_str; + + GList * arg_list = g_list_first(arguments); + if ( arg_list == NULL ) + return NULL; + + g_object_set_data(G_OBJECT(vbox), EXTCAP_GTK_DATA_KEY_ARGPTR, arguments); + + while (arg_list != NULL ) { + GtkWidget *hbox = NULL, *label = NULL, *item = NULL; + + arg_iter = (extcap_arg*) (arg_list->data); + + /* A new storage box for label + element */ + + hbox = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5, FALSE); + + if (prev_map != NULL + && (prev_call = (gchar *) g_hash_table_lookup(prev_map, + arg_iter->call)) != NULL) { + prev_complex = extcap_parse_complex(arg_iter->arg_type, prev_call); + } else { + prev_complex = NULL; + } + + switch (arg_iter->arg_type) { + case EXTCAP_ARG_INTEGER: + case EXTCAP_ARG_UNSIGNED: + case EXTCAP_ARG_LONG: + case EXTCAP_ARG_DOUBLE: + label = gtk_label_new(arg_iter->display); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); + item = extcap_create_gtk_rangewidget(arg_iter, prev_map); + if (item == NULL) { + item = gtk_entry_new(); + + if (prev_complex != NULL) { + default_str = extcap_get_complex_as_string(prev_complex); + gtk_entry_set_text(GTK_ENTRY(item), default_str); + g_free(default_str); + } else if (arg_iter->default_complex != NULL) { + default_str = extcap_get_complex_as_string( + arg_iter->default_complex); + gtk_entry_set_text(GTK_ENTRY(item), default_str); + g_free(default_str); + } + } + break; + case EXTCAP_ARG_STRING: + label = gtk_label_new(arg_iter->display); + + item = gtk_entry_new(); + default_str = NULL; + + if (prev_complex != NULL) + default_str = extcap_get_complex_as_string(prev_complex); + else if (arg_iter->default_complex != NULL) + default_str = extcap_get_complex_as_string( + arg_iter->default_complex); + + if (default_str != NULL) { + gtk_entry_set_text(GTK_ENTRY(item), default_str); + g_free(default_str); + } + + break; + case EXTCAP_ARG_FILESELECT: + label = gtk_label_new(arg_iter->display); + default_str = NULL; + + if (prev_complex != NULL) + default_str = extcap_get_complex_as_string(prev_complex); + else if (arg_iter->default_complex != NULL) + default_str = extcap_get_complex_as_string( + arg_iter->default_complex); + + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); + item = extcap_create_gtk_fileselect(arg_iter, prev_map, default_str); + if (default_str != NULL) + g_free(default_str); + break; + case EXTCAP_ARG_BOOLEAN: + case EXTCAP_ARG_BOOLFLAG: + item = gtk_check_button_new_with_label(arg_iter->display); + + if (prev_complex != NULL) { + if (extcap_complex_get_bool(prev_complex)) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), TRUE); + } else if (arg_iter->default_complex != NULL + && extcap_complex_get_bool(arg_iter->default_complex)) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), TRUE); + } + + break; + case EXTCAP_ARG_MENU: + break; + case EXTCAP_ARG_RADIO: + label = gtk_label_new(arg_iter->display); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); + item = extcap_create_gtk_radiowidget(arg_iter, prev_map); + break; + case EXTCAP_ARG_SELECTOR: + label = gtk_label_new(arg_iter->display); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); + item = extcap_create_gtk_listwidget(arg_iter, prev_map); + break; + case EXTCAP_ARG_MULTICHECK: + label = gtk_label_new(arg_iter->display); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.1f); + item = extcap_create_gtk_multicheckwidget(arg_iter, prev_map); + break; + default: + break; + } + + if (prev_complex != NULL) + extcap_free_complex(prev_complex); + + if (label != NULL) { + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); + gtk_widget_show(label); + } + + if (item != NULL) { + gtk_box_pack_start(GTK_BOX(hbox), item, TRUE, TRUE, 0); + gtk_widget_show(item); + g_object_set_data(G_OBJECT(item), EXTCAP_GTK_DATA_KEY_ARGPTR, + arg_iter); + + if (arg_iter->tooltip != NULL) { + gtk_widget_set_tooltip_text(item, arg_iter->tooltip); + } + + widget_toplist = g_slist_append(widget_toplist, item); + } + + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 1); + + gtk_widget_show(hbox); + + arg_list = arg_list->next; + } + + return widget_toplist; } /* @@ -901,10 +901,10 @@ GSList *extcap_populate_gtk_vbox(GList *arguments, GtkWidget *vbox, * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/ui/gtk/extcap_gtk.h b/ui/gtk/extcap_gtk.h index eb49c545f7..614a76c787 100644 --- a/ui/gtk/extcap_gtk.h +++ b/ui/gtk/extcap_gtk.h @@ -34,66 +34,66 @@ * GObject data keys for linking argument records to the gtk * UI */ -#define EXTCAP_GTK_DATA_KEY_ARGPTR "EXTCAP_ARGPTR" -#define EXTCAP_GTK_DATA_KEY_VALPTR "EXTCAP_VALPTR" -#define EXTCAP_GTK_DATA_KEY_FIRSTRADIO "EXTCAP_FIRSTRADIO" -#define EXTCAP_GTK_DATA_KEY_WIDGETLIST "EXTCAP_WIDGETLIST" -#define EXTCAP_GTK_DATA_KEY_TREEVIEW "EXTCAP_TREEVIEW" -#define EXTCAP_GTK_DATA_KEY_FILENAME "EXTCAP_FILENAME" -#define EXTCAP_GTK_DATA_KEY_ARGUMENT "EXTCAP_ARGUMENT" +#define EXTCAP_GTK_DATA_KEY_ARGPTR "EXTCAP_ARGPTR" +#define EXTCAP_GTK_DATA_KEY_VALPTR "EXTCAP_VALPTR" +#define EXTCAP_GTK_DATA_KEY_FIRSTRADIO "EXTCAP_FIRSTRADIO" +#define EXTCAP_GTK_DATA_KEY_WIDGETLIST "EXTCAP_WIDGETLIST" +#define EXTCAP_GTK_DATA_KEY_TREEVIEW "EXTCAP_TREEVIEW" +#define EXTCAP_GTK_DATA_KEY_FILENAME "EXTCAP_FILENAME" +#define EXTCAP_GTK_DATA_KEY_ARGUMENT "EXTCAP_ARGUMENT" /* * GTK UI / EXTCAP Linkage: * * Packed vbox of widgets - * Contains EXTCAP_WIDGETLIST pointing to enclosed widget list + * Contains EXTCAP_WIDGETLIST pointing to enclosed widget list * * GSList gtk_ui_widgets - * Linked list of drawable widgets in the UI + * Linked list of drawable widgets in the UI * * GtkWidget contained in GSList - * Drawn GTK UI element. If UI element is directly linked - * to argument, will contain EXTCAP_ARGPTR. + * Drawn GTK UI element. If UI element is directly linked + * to argument, will contain EXTCAP_ARGPTR. * - * Top-level GTK widgets will include text boxes, sliders - * (if supported), and checkboxes. + * Top-level GTK widgets will include text boxes, sliders + * (if supported), and checkboxes. * - * If the top level widget contains radio buttons, it will - * contain an EXTCAP_ARGPTR *and* an EXTCAP_FIRSTRADIO + * If the top level widget contains radio buttons, it will + * contain an EXTCAP_ARGPTR *and* an EXTCAP_FIRSTRADIO * * Radio buttons - * Each radio button will contain an EXTCAP_VALPTR reference - * to the extcap_value * value being used. + * Each radio button will contain an EXTCAP_VALPTR reference + * to the extcap_value * value being used. * * Selectors - * Each selector row contains a pointer to the value, in the - * column COL_VALUE + * Each selector row contains a pointer to the value, in the + * column COL_VALUE * */ enum extcap_gtk_col_types { - EXTCAP_GTK_COL_DISPLAY = 0, EXTCAP_GTK_COL_VALUE = 1, EXTCAP_GTK_NUM_COLS + EXTCAP_GTK_COL_DISPLAY = 0, EXTCAP_GTK_COL_VALUE = 1, EXTCAP_GTK_NUM_COLS }; enum extcap_gtk_multi_col_types { - EXTCAP_GTK_MULTI_COL_CHECK = 0, - EXTCAP_GTK_MULTI_COL_DISPLAY = 1, - EXTCAP_GTK_MULTI_COL_VALUE = 2, - EXTCAP_GTK_MULTI_COL_ACTIVATABLE = 3, - EXTCAP_GTK_MULTI_NUM_COLS + EXTCAP_GTK_MULTI_COL_CHECK = 0, + EXTCAP_GTK_MULTI_COL_DISPLAY = 1, + EXTCAP_GTK_MULTI_COL_VALUE = 2, + EXTCAP_GTK_MULTI_COL_ACTIVATABLE = 3, + EXTCAP_GTK_MULTI_NUM_COLS }; /* Get a hash map of calls and values from the top widget */ GHashTable *extcap_gtk_get_state(GtkWidget *widget); GtkWidget *extcap_create_gtk_rangewidget(extcap_arg *argument, - GHashTable *prev_map); + GHashTable *prev_map); GtkWidget *extcap_create_gtk_listwidget(extcap_arg *argument, - GHashTable *prev_map); + GHashTable *prev_map); GtkWidget *extcap_create_gtk_radiowidget(extcap_arg *argument, - GHashTable *prev_map); + GHashTable *prev_map); GtkWidget *extcap_create_gtk_multicheckwidget(extcap_arg *argument, - GHashTable *prev_map); + GHashTable *prev_map); /* * Populate a (pre-created) container widget based on an arguments record. @@ -102,7 +102,7 @@ GtkWidget *extcap_create_gtk_multicheckwidget(extcap_arg *argument, * repeatedly, for example */ GSList *extcap_populate_gtk_vbox(GList *arguments, GtkWidget *vbox, - GHashTable *prev_map); + GHashTable *prev_map); /* Free args associated with a GTK item */ void extcap_gtk_free_args(GtkWidget *vbox); @@ -114,10 +114,11 @@ void extcap_gtk_free_args(GtkWidget *vbox); * * Local variables: * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: t + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=4 noexpandtab: - * :indentSize=4:tabSize=4:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ + diff --git a/ui/gtk/mcast_stream_dlg.c b/ui/gtk/mcast_stream_dlg.c index f13859fb90..7b1754ce17 100644 --- a/ui/gtk/mcast_stream_dlg.c +++ b/ui/gtk/mcast_stream_dlg.c @@ -69,13 +69,13 @@ static const gchar PAR_LABEL_TEXT[] = "\nBurst int: ms Burst alarm: pps Buf static GtkWidget *mcast_stream_dlg = NULL; static GtkWidget *mcast_params_dlg = NULL; -static GtkListStore *list_store = NULL; +static GtkListStore *list_store = NULL; static GtkTreeIter list_iter; -static GtkWidget *list_w = NULL; -static GtkWidget *top_label = NULL; -static GtkWidget *label_fwd = NULL; -static GtkWidget *label_par = NULL; -static GtkWidget *bt_filter = NULL; +static GtkWidget *list_w = NULL; +static GtkWidget *top_label = NULL; +static GtkWidget *label_fwd = NULL; +static GtkWidget *label_par = NULL; +static GtkWidget *bt_filter = NULL; static mcast_stream_info_t *selected_stream_fwd = NULL; /* current selection */ static GList *last_list = NULL; @@ -84,20 +84,20 @@ static guint32 streams_nb = 0; /* number of displayed streams */ enum { - MC_COL_SRC_ADDR, - MC_COL_SRC_PORT, - MC_COL_DST_ADDR, - MC_COL_DST_PORT, - MC_COL_PACKETS, - MC_COL_PPS, - MC_COL_AVG_BW, - MC_COL_MAX_BW, - MC_COL_MAX_BURST, - MC_COL_BURST_ALARM, - MC_COL_MAX_BUFFER, - MC_COL_BUFFER_ALARM, - MC_COL_DATA, - NUM_COLS /* The number of columns */ + MC_COL_SRC_ADDR, + MC_COL_SRC_PORT, + MC_COL_DST_ADDR, + MC_COL_DST_PORT, + MC_COL_PACKETS, + MC_COL_PPS, + MC_COL_AVG_BW, + MC_COL_MAX_BW, + MC_COL_MAX_BURST, + MC_COL_BURST_ALARM, + MC_COL_MAX_BUFFER, + MC_COL_BUFFER_ALARM, + MC_COL_DATA, + NUM_COLS /* The number of columns */ }; /****************************************************************************/ @@ -106,18 +106,18 @@ enum static void mcaststream_on_destroy(GObject *object _U_, gpointer user_data _U_) { - /* Remove the stream tap listener */ - remove_tap_listener_mcast_stream(); + /* Remove the stream tap listener */ + remove_tap_listener_mcast_stream(); - /* Is there a params window open? */ - if (mcast_params_dlg != NULL) - window_destroy(mcast_params_dlg); + /* Is there a params window open? */ + if (mcast_params_dlg != NULL) + window_destroy(mcast_params_dlg); - /* Clean up memory used by stream tap */ - mcaststream_reset((mcaststream_tapinfo_t*)mcaststream_get_info()); + /* Clean up memory used by stream tap */ + mcaststream_reset((mcaststream_tapinfo_t*)mcaststream_get_info()); - /* Note that we no longer have a "Mcast Streams" dialog box. */ - mcast_stream_dlg = NULL; + /* Note that we no longer have a "Mcast Streams" dialog box. */ + mcast_stream_dlg = NULL; } @@ -125,13 +125,13 @@ mcaststream_on_destroy(GObject *object _U_, gpointer user_data _U_) static void mcaststream_on_unselect(GtkButton *button _U_, gpointer user_data _U_) { - GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_w)); + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_w)); - gtk_tree_selection_unselect_all(selection); + gtk_tree_selection_unselect_all(selection); - selected_stream_fwd = NULL; - gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); - gtk_widget_set_sensitive(bt_filter, FALSE); + selected_stream_fwd = NULL; + gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); + gtk_widget_set_sensitive(bt_filter, FALSE); } @@ -139,32 +139,32 @@ mcaststream_on_unselect(GtkButton *button _U_, gpointer user_data _U_) static void mcaststream_on_filter(GtkButton *button _U_, gpointer user_data _U_) { - gchar *filter_string_fwd; - gchar ip_version[3]; - - if (selected_stream_fwd == NULL) - return; - - if (selected_stream_fwd->src_addr.type == AT_IPv6) { - g_strlcpy(ip_version,"v6",sizeof(ip_version)); - } else { - ip_version[0] = '\0'; - } - filter_string_fwd = g_strdup_printf( - "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u)", - ip_version, - ep_address_to_str(&(selected_stream_fwd->src_addr)), - selected_stream_fwd->src_port, - ip_version, - ep_address_to_str(&(selected_stream_fwd->dest_addr)), - selected_stream_fwd->dest_port); - - gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string_fwd); - g_free(filter_string_fwd); + gchar *filter_string_fwd; + gchar ip_version[3]; + + if (selected_stream_fwd == NULL) + return; + + if (selected_stream_fwd->src_addr.type == AT_IPv6) { + g_strlcpy(ip_version,"v6",sizeof(ip_version)); + } else { + ip_version[0] = '\0'; + } + filter_string_fwd = g_strdup_printf( + "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u)", + ip_version, + ep_address_to_str(&(selected_stream_fwd->src_addr)), + selected_stream_fwd->src_port, + ip_version, + ep_address_to_str(&(selected_stream_fwd->dest_addr)), + selected_stream_fwd->dest_port); + + gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string_fwd); + g_free(filter_string_fwd); #if 0 - main_filter_packets(&cfile, filter_string, FALSE); - mcaststream_dlg_update(mcaststream_get_info()->strinfo_list); + main_filter_packets(&cfile, filter_string, FALSE); + mcaststream_dlg_update(mcaststream_get_info()->strinfo_list); #endif } @@ -173,24 +173,24 @@ mcaststream_on_filter(GtkButton *button _U_, gpointer user_data _U_) static void mcaststream_on_select_row(GtkTreeSelection *selection, gpointer data _U_) { - gchar label_text[80]; - - if (gtk_tree_selection_get_selected(selection, NULL, &list_iter)) - { - gtk_tree_model_get(GTK_TREE_MODEL(list_store), &list_iter, MC_COL_DATA, &selected_stream_fwd, -1); - g_snprintf(label_text, sizeof(label_text), "Selected: %s:%u -> %s:%u", - ep_address_to_display(&(selected_stream_fwd->src_addr)), - selected_stream_fwd->src_port, - ep_address_to_display(&(selected_stream_fwd->dest_addr)), - selected_stream_fwd->dest_port - ); - gtk_label_set_text(GTK_LABEL(label_fwd), label_text); - gtk_widget_set_sensitive(bt_filter, TRUE); - } else { - selected_stream_fwd = NULL; - gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); - gtk_widget_set_sensitive(bt_filter, FALSE); - } + gchar label_text[80]; + + if (gtk_tree_selection_get_selected(selection, NULL, &list_iter)) + { + gtk_tree_model_get(GTK_TREE_MODEL(list_store), &list_iter, MC_COL_DATA, &selected_stream_fwd, -1); + g_snprintf(label_text, sizeof(label_text), "Selected: %s:%u -> %s:%u", + ep_address_to_display(&(selected_stream_fwd->src_addr)), + selected_stream_fwd->src_port, + ep_address_to_display(&(selected_stream_fwd->dest_addr)), + selected_stream_fwd->dest_port + ); + gtk_label_set_text(GTK_LABEL(label_fwd), label_text); + gtk_widget_set_sensitive(bt_filter, TRUE); + } else { + selected_stream_fwd = NULL; + gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); + gtk_widget_set_sensitive(bt_filter, FALSE); + } } @@ -200,70 +200,70 @@ mcaststream_on_select_row(GtkTreeSelection *selection, gpointer data _U_) static void mcast_params_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_) { - /* Note that we no longer have a mcast params dialog box. */ - mcast_params_dlg = NULL; + /* Note that we no longer have a mcast params dialog box. */ + mcast_params_dlg = NULL; } static void mcast_params_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) { - GtkWidget *fnumber_te; - const gchar *fnumber_text; - gint32 fnumber; - char *p; - - fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_1); - fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); - fnumber = (gint)strtol(fnumber_text, &p, 10); - if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 1000) ) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The burst interval should be between 1 and 1000 ms."); - return; - } - mcast_stream_burstint = fnumber; - - fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_2); - fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); - fnumber = (gint)strtol(fnumber_text, &p, 10); - if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) ) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The burst alarm threshold you entered isn't valid."); - return; - } - mcast_stream_trigger = fnumber; - - fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_3); - fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); - fnumber = (gint)strtol(fnumber_text, &p, 10); - if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) ) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The buffer alarm threshold you entered isn't valid."); - return; - } - mcast_stream_bufferalarm = fnumber; - - fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_4); - fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); - fnumber = (gint)strtol(fnumber_text, &p, 10); - if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 10000000) ) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The stream empty speed should be between 1 and 10000000"); - return; - } - mcast_stream_emptyspeed = fnumber; - - fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_5); - fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); - fnumber = (gint)strtol(fnumber_text, &p, 10); - if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 10000000) ) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The total empty speed should be between 1 and 10000000"); - return; - } - mcast_stream_cumulemptyspeed = fnumber; - - window_destroy(GTK_WIDGET(parent_w)); - - /* Clean up memory used by stream tap */ - mcaststream_reset((mcaststream_tapinfo_t*)mcaststream_get_info()); - /* retap all packets */ - cf_retap_packets(&cfile); + GtkWidget *fnumber_te; + const gchar *fnumber_text; + gint32 fnumber; + char *p; + + fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_1); + fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); + fnumber = (gint)strtol(fnumber_text, &p, 10); + if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 1000) ) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The burst interval should be between 1 and 1000 ms."); + return; + } + mcast_stream_burstint = fnumber; + + fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_2); + fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); + fnumber = (gint)strtol(fnumber_text, &p, 10); + if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) ) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The burst alarm threshold you entered isn't valid."); + return; + } + mcast_stream_trigger = fnumber; + + fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_3); + fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); + fnumber = (gint)strtol(fnumber_text, &p, 10); + if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) ) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The buffer alarm threshold you entered isn't valid."); + return; + } + mcast_stream_bufferalarm = fnumber; + + fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_4); + fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); + fnumber = (gint)strtol(fnumber_text, &p, 10); + if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 10000000) ) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The stream empty speed should be between 1 and 10000000"); + return; + } + mcast_stream_emptyspeed = fnumber; + + fnumber_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), E_MCAST_ENTRY_5); + fnumber_text = gtk_entry_get_text(GTK_ENTRY(fnumber_te)); + fnumber = (gint)strtol(fnumber_text, &p, 10); + if ( ((p == fnumber_text) || (*p != '\0')) || (fnumber <= 0) || (fnumber > 10000000) ) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "The total empty speed should be between 1 and 10000000"); + return; + } + mcast_stream_cumulemptyspeed = fnumber; + + window_destroy(GTK_WIDGET(parent_w)); + + /* Clean up memory used by stream tap */ + mcaststream_reset((mcaststream_tapinfo_t*)mcaststream_get_info()); + /* retap all packets */ + cf_retap_packets(&cfile); } @@ -271,90 +271,90 @@ mcast_params_ok_cb(GtkWidget *ok_bt _U_, gpointer parent_w) static void mcast_on_params(GtkButton *button _U_, gpointer data _U_) { - GtkWidget *main_vb; - GtkWidget *label, *hbuttonbox, *grid; - GtkWidget *ok_bt, *cancel_bt; - GtkWidget *entry1, *entry2, *entry3, *entry4, *entry5; - gchar label_text[51]; - - if (mcast_params_dlg != NULL) { - /* There's already a Params dialog box; reactivate it. */ - reactivate_window(mcast_params_dlg); - return; - } - - mcast_params_dlg = dlg_window_new("Wireshark: Set parameters for Multicast Stream Analysis"); - gtk_window_set_destroy_with_parent(GTK_WINDOW(mcast_params_dlg), TRUE); - gtk_window_set_default_size(GTK_WINDOW(mcast_params_dlg), 210, 210); - - gtk_widget_show(mcast_params_dlg); - - /* Container for each row of widgets */ - main_vb =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(main_vb), 2); - gtk_container_add(GTK_CONTAINER(mcast_params_dlg), main_vb); - gtk_widget_show(main_vb); - - grid = ws_gtk_grid_new(); - gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0); - label = gtk_label_new(" Burst measurement interval (ms) "); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 0, 1, 1); - entry1 = gtk_entry_new(); - g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_burstint); - gtk_entry_set_text(GTK_ENTRY(entry1), label_text); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry1, 1, 0, 1, 1); - label = gtk_label_new(" Burst alarm threshold (packets) "); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 1, 1, 1); - entry2 = gtk_entry_new(); - g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_trigger); - gtk_entry_set_text(GTK_ENTRY(entry2), label_text); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry2, 1, 1, 1, 1); - label = gtk_label_new(" Buffer alarm threshold (bytes) "); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 2, 1, 1); - entry3 = gtk_entry_new(); - g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_bufferalarm); - gtk_entry_set_text(GTK_ENTRY(entry3), label_text); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry3, 1, 2, 1, 1); - label = gtk_label_new(" Stream empty speed (kbit/s) "); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 3, 1, 1); - entry4 = gtk_entry_new(); - g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_emptyspeed); - gtk_entry_set_text(GTK_ENTRY(entry4), label_text); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry4, 1, 3, 1, 1); - label = gtk_label_new(" Total empty speed (kbit/s) "); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 4, 1, 1); - entry5 = gtk_entry_new(); - g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_cumulemptyspeed); - gtk_entry_set_text(GTK_ENTRY(entry5), label_text); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry5, 1, 4, 1, 1); - - gtk_widget_show (grid); - - /* button row */ - hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); - ws_gtk_grid_attach_defaults(GTK_GRID(grid), hbuttonbox, 0, 5, 2, 1); - ok_bt = ws_gtk_button_new_from_stock(GTK_STOCK_OK); - gtk_container_add (GTK_CONTAINER(hbuttonbox), ok_bt); - cancel_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CANCEL); - gtk_container_add (GTK_CONTAINER(hbuttonbox), cancel_bt); - gtk_widget_set_can_default(cancel_bt, TRUE); - gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END); - gtk_box_set_spacing(GTK_BOX(hbuttonbox), 0); - - g_signal_connect(mcast_params_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); - g_signal_connect(mcast_params_dlg, "destroy", G_CALLBACK(mcast_params_destroy_cb), NULL); - g_signal_connect(ok_bt, "clicked", G_CALLBACK(mcast_params_ok_cb), mcast_params_dlg); - window_set_cancel_button(mcast_params_dlg, cancel_bt, window_cancel_button_cb); - - /* Attach pointers to needed widgets */ - g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_1, entry1); - g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_2, entry2); - g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_3, entry3); - g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_4, entry4); - g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_5, entry5); - - gtk_widget_show_all(mcast_params_dlg); - window_present(mcast_params_dlg); + GtkWidget *main_vb; + GtkWidget *label, *hbuttonbox, *grid; + GtkWidget *ok_bt, *cancel_bt; + GtkWidget *entry1, *entry2, *entry3, *entry4, *entry5; + gchar label_text[51]; + + if (mcast_params_dlg != NULL) { + /* There's already a Params dialog box; reactivate it. */ + reactivate_window(mcast_params_dlg); + return; + } + + mcast_params_dlg = dlg_window_new("Wireshark: Set parameters for Multicast Stream Analysis"); + gtk_window_set_destroy_with_parent(GTK_WINDOW(mcast_params_dlg), TRUE); + gtk_window_set_default_size(GTK_WINDOW(mcast_params_dlg), 210, 210); + + gtk_widget_show(mcast_params_dlg); + + /* Container for each row of widgets */ + main_vb =ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 3, FALSE); + gtk_container_set_border_width(GTK_CONTAINER(main_vb), 2); + gtk_container_add(GTK_CONTAINER(mcast_params_dlg), main_vb); + gtk_widget_show(main_vb); + + grid = ws_gtk_grid_new(); + gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0); + label = gtk_label_new(" Burst measurement interval (ms) "); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 0, 1, 1); + entry1 = gtk_entry_new(); + g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_burstint); + gtk_entry_set_text(GTK_ENTRY(entry1), label_text); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry1, 1, 0, 1, 1); + label = gtk_label_new(" Burst alarm threshold (packets) "); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 1, 1, 1); + entry2 = gtk_entry_new(); + g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_trigger); + gtk_entry_set_text(GTK_ENTRY(entry2), label_text); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry2, 1, 1, 1, 1); + label = gtk_label_new(" Buffer alarm threshold (bytes) "); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 2, 1, 1); + entry3 = gtk_entry_new(); + g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_bufferalarm); + gtk_entry_set_text(GTK_ENTRY(entry3), label_text); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry3, 1, 2, 1, 1); + label = gtk_label_new(" Stream empty speed (kbit/s) "); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 3, 1, 1); + entry4 = gtk_entry_new(); + g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_emptyspeed); + gtk_entry_set_text(GTK_ENTRY(entry4), label_text); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry4, 1, 3, 1, 1); + label = gtk_label_new(" Total empty speed (kbit/s) "); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, 4, 1, 1); + entry5 = gtk_entry_new(); + g_snprintf(label_text, sizeof(label_text), "%u", mcast_stream_cumulemptyspeed); + gtk_entry_set_text(GTK_ENTRY(entry5), label_text); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), entry5, 1, 4, 1, 1); + + gtk_widget_show (grid); + + /* button row */ + hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); + ws_gtk_grid_attach_defaults(GTK_GRID(grid), hbuttonbox, 0, 5, 2, 1); + ok_bt = ws_gtk_button_new_from_stock(GTK_STOCK_OK); + gtk_container_add (GTK_CONTAINER(hbuttonbox), ok_bt); + cancel_bt = ws_gtk_button_new_from_stock(GTK_STOCK_CANCEL); + gtk_container_add (GTK_CONTAINER(hbuttonbox), cancel_bt); + gtk_widget_set_can_default(cancel_bt, TRUE); + gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END); + gtk_box_set_spacing(GTK_BOX(hbuttonbox), 0); + + g_signal_connect(mcast_params_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); + g_signal_connect(mcast_params_dlg, "destroy", G_CALLBACK(mcast_params_destroy_cb), NULL); + g_signal_connect(ok_bt, "clicked", G_CALLBACK(mcast_params_ok_cb), mcast_params_dlg); + window_set_cancel_button(mcast_params_dlg, cancel_bt, window_cancel_button_cb); + + /* Attach pointers to needed widgets */ + g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_1, entry1); + g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_2, entry2); + g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_3, entry3); + g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_4, entry4); + g_object_set_data(G_OBJECT(mcast_params_dlg), E_MCAST_ENTRY_5, entry5); + + gtk_widget_show_all(mcast_params_dlg); + window_present(mcast_params_dlg); } @@ -363,68 +363,68 @@ mcast_on_params(GtkButton *button _U_, gpointer data _U_) static void add_to_list_store(mcast_stream_info_t* strinfo) { - gchar label_text[256]; - gchar *data[NUM_COLS]; - int i; - char *savelocale; - - /* save the current locale */ - savelocale = g_strdup(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(ep_address_to_display(&(strinfo->src_addr))); - data[1] = g_strdup_printf("%u", strinfo->src_port); - data[2] = g_strdup(ep_address_to_display(&(strinfo->dest_addr))); - data[3] = g_strdup_printf("%u", strinfo->dest_port); - data[4] = g_strdup_printf("%u", strinfo->npackets); - data[5] = g_strdup_printf("%u /s", strinfo->apackets); - data[6] = g_strdup_printf("%2.1f Mbps", strinfo->average_bw); - data[7] = g_strdup_printf("%2.1f Mbps", strinfo->element.maxbw); - data[8] = g_strdup_printf("%u / %dms", strinfo->element.topburstsize, mcast_stream_burstint); - data[9] = g_strdup_printf("%u", strinfo->element.numbursts); - data[10] = g_strdup_printf("%.1f KB", (float)strinfo->element.topbuffusage/1000); - data[11] = g_strdup_printf("%u", strinfo->element.numbuffalarms); - - /* restore previous locale setting */ - setlocale(LC_NUMERIC, savelocale); - g_free(savelocale); - - /* Acquire an iterator */ - gtk_list_store_append(list_store, &list_iter); - - /* Fill the new row */ - gtk_list_store_set(list_store, &list_iter, - MC_COL_SRC_ADDR, data[0], - MC_COL_SRC_PORT, data[1], - MC_COL_DST_ADDR, data[2], - MC_COL_DST_PORT, data[3], - MC_COL_PACKETS, data[4], - MC_COL_PPS, data[5], - MC_COL_AVG_BW, data[6], - MC_COL_MAX_BW, data[7], - MC_COL_MAX_BURST, data[8], - MC_COL_BURST_ALARM, data[9], - MC_COL_MAX_BUFFER, data[10], - MC_COL_BUFFER_ALARM, data[11], - MC_COL_DATA, strinfo, - -1); - - for (i = 0; i < NUM_COLS-1; i++) - g_free(data[i]); - - /* Update the top label with the number of detected streams */ - g_snprintf(label_text, sizeof(label_text), - "Detected %d Multicast streams, Average Bw: %.1f Mbps Max Bw: %.1f Mbps Max burst: %d / %dms Max buffer: %.1f KB", - ++streams_nb, - mcaststream_get_info()->allstreams->average_bw, mcaststream_get_info()->allstreams->element.maxbw, - mcaststream_get_info()->allstreams->element.topburstsize, mcast_stream_burstint, - (float)(mcaststream_get_info()->allstreams->element.topbuffusage)/1000); - gtk_label_set_text(GTK_LABEL(top_label), label_text); - - g_snprintf(label_text, sizeof(label_text), "\nBurst int: %u ms Burst alarm: %u pps Buffer alarm: %u Bytes Stream empty speed: %u Kbps Total empty speed: %u Kbps\n", - mcast_stream_burstint, mcast_stream_trigger, mcast_stream_bufferalarm, mcast_stream_emptyspeed, mcast_stream_cumulemptyspeed); - gtk_label_set_text(GTK_LABEL(label_par), label_text); + gchar label_text[256]; + gchar *data[NUM_COLS]; + int i; + char *savelocale; + + /* save the current locale */ + savelocale = g_strdup(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(ep_address_to_display(&(strinfo->src_addr))); + data[1] = g_strdup_printf("%u", strinfo->src_port); + data[2] = g_strdup(ep_address_to_display(&(strinfo->dest_addr))); + data[3] = g_strdup_printf("%u", strinfo->dest_port); + data[4] = g_strdup_printf("%u", strinfo->npackets); + data[5] = g_strdup_printf("%u /s", strinfo->apackets); + data[6] = g_strdup_printf("%2.1f Mbps", strinfo->average_bw); + data[7] = g_strdup_printf("%2.1f Mbps", strinfo->element.maxbw); + data[8] = g_strdup_printf("%u / %dms", strinfo->element.topburstsize, mcast_stream_burstint); + data[9] = g_strdup_printf("%u", strinfo->element.numbursts); + data[10] = g_strdup_printf("%.1f KB", (float)strinfo->element.topbuffusage/1000); + data[11] = g_strdup_printf("%u", strinfo->element.numbuffalarms); + + /* restore previous locale setting */ + setlocale(LC_NUMERIC, savelocale); + g_free(savelocale); + + /* Acquire an iterator */ + gtk_list_store_append(list_store, &list_iter); + + /* Fill the new row */ + gtk_list_store_set(list_store, &list_iter, + MC_COL_SRC_ADDR, data[0], + MC_COL_SRC_PORT, data[1], + MC_COL_DST_ADDR, data[2], + MC_COL_DST_PORT, data[3], + MC_COL_PACKETS, data[4], + MC_COL_PPS, data[5], + MC_COL_AVG_BW, data[6], + MC_COL_MAX_BW, data[7], + MC_COL_MAX_BURST, data[8], + MC_COL_BURST_ALARM, data[9], + MC_COL_MAX_BUFFER, data[10], + MC_COL_BUFFER_ALARM, data[11], + MC_COL_DATA, strinfo, + -1); + + for (i = 0; i < NUM_COLS-1; i++) + g_free(data[i]); + + /* Update the top label with the number of detected streams */ + g_snprintf(label_text, sizeof(label_text), + "Detected %d Multicast streams, Average Bw: %.1f Mbps Max Bw: %.1f Mbps Max burst: %d / %dms Max buffer: %.1f KB", + ++streams_nb, + mcaststream_get_info()->allstreams->average_bw, mcaststream_get_info()->allstreams->element.maxbw, + mcaststream_get_info()->allstreams->element.topburstsize, mcast_stream_burstint, + (float)(mcaststream_get_info()->allstreams->element.topbuffusage)/1000); + gtk_label_set_text(GTK_LABEL(top_label), label_text); + + g_snprintf(label_text, sizeof(label_text), "\nBurst int: %u ms Burst alarm: %u pps Buffer alarm: %u Bytes Stream empty speed: %u Kbps Total empty speed: %u Kbps\n", + mcast_stream_burstint, mcast_stream_trigger, mcast_stream_bufferalarm, mcast_stream_emptyspeed, mcast_stream_cumulemptyspeed); + gtk_label_set_text(GTK_LABEL(label_par), label_text); } /****************************************************************************/ @@ -432,204 +432,204 @@ add_to_list_store(mcast_stream_info_t* strinfo) static void create_list_view(void) { - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - GtkTreeSortable *sortable; - GtkTreeView *list_view; - GtkTreeSelection *selection; - - /* Create the store */ - list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns */ - G_TYPE_STRING, /* Source address */ - G_TYPE_STRING, /* Source port */ - G_TYPE_STRING, /* Destination address */ - G_TYPE_STRING, /* Destination port */ - G_TYPE_STRING, /* Packets */ - G_TYPE_STRING, /* Packets per second */ - G_TYPE_STRING, /* Average bandwidth */ - G_TYPE_STRING, /* Max. bandwidth */ - G_TYPE_STRING, /* Max. burst */ - G_TYPE_STRING, /* Burst alarms */ - G_TYPE_STRING, /* Max. buffers */ - G_TYPE_STRING, /* Buffer alarms */ - G_TYPE_POINTER /* Data */ - ); - - /* Create a view */ - list_w = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); - - list_view = GTK_TREE_VIEW(list_w); - sortable = GTK_TREE_SORTABLE(list_store); - - /* Speed up the list display */ - gtk_tree_view_set_fixed_height_mode(list_view, TRUE); - - /* Setup the sortable columns */ - gtk_tree_sortable_set_sort_column_id(sortable, MC_COL_SRC_ADDR, GTK_SORT_ASCENDING); - gtk_tree_view_set_headers_clickable(list_view, FALSE); - - /* The view now holds a reference. We can get rid of our own reference */ - g_object_unref(G_OBJECT(list_store)); - - /* - * Create the first column packet, associating the "text" attribute of the - * cell_renderer to the first column of the model - */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Src IP addr", renderer, - "text", MC_COL_SRC_ADDR, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_SRC_ADDR); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 100); - /* Add the column to the view. */ - gtk_tree_view_append_column(list_view, column); - - /* Source port */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Src port", renderer, - "text", MC_COL_SRC_PORT, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_SRC_PORT); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column(list_view, column); - - /* Destination address */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Dst IP addr", renderer, - "text", MC_COL_DST_ADDR, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_DST_ADDR); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 100); - gtk_tree_view_append_column(list_view, column); - - /* Destination port */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Dst port", renderer, - "text", MC_COL_DST_PORT, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_DST_PORT); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column(list_view, column); - - /* Packets */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Packets", renderer, - "text", MC_COL_PACKETS, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_PACKETS); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column(list_view, column); - - /* Packets/s */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Packets/s", renderer, - "text", MC_COL_PPS, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_PPS); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 90); - gtk_tree_view_append_column(list_view, column); - - /* Average bandwidth */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Avg Bw", renderer, - "text", MC_COL_AVG_BW, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_AVG_BW); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column(list_view, column); - - /* Max. bandwidth */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Max Bw", renderer, - "text", MC_COL_MAX_BW, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BW); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column(list_view, column); - - /* Max. bursts */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Max bursts", renderer, - "text", MC_COL_MAX_BURST, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BURST); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); - gtk_tree_view_column_set_fixed_width(column, 100); - gtk_tree_view_append_column(list_view, column); - - /* Burst alarms*/ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Burst alarms", renderer, - "text", MC_COL_BURST_ALARM, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_BURST_ALARM); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 90); - gtk_tree_view_column_set_fixed_width(column, 110); - gtk_tree_view_append_column(list_view, column); - - /* Max. buffers */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Max buffers", renderer, - "text", MC_COL_MAX_BUFFER, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BUFFER); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 90); - gtk_tree_view_column_set_fixed_width(column, 100); - gtk_tree_view_append_column(list_view, column); - - /* Buffer alarms */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Buffer alarms", renderer, - "text", MC_COL_BUFFER_ALARM, - NULL); - gtk_tree_view_column_set_sort_column_id(column, MC_COL_BUFFER_ALARM); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 90); - gtk_tree_view_column_set_fixed_width(column, 120); - gtk_tree_view_append_column(list_view, column); - - /* Now enable the sorting of each column */ - gtk_tree_view_set_rules_hint(list_view, TRUE); - gtk_tree_view_set_headers_clickable(list_view, TRUE); - - /* Setup the selection handler */ - selection = gtk_tree_view_get_selection(list_view); - gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); - - g_signal_connect(G_OBJECT(selection), "changed", /* (un)select_row */ - G_CALLBACK(mcaststream_on_select_row), - NULL); + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeSortable *sortable; + GtkTreeView *list_view; + GtkTreeSelection *selection; + + /* Create the store */ + list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns */ + G_TYPE_STRING, /* Source address */ + G_TYPE_STRING, /* Source port */ + G_TYPE_STRING, /* Destination address */ + G_TYPE_STRING, /* Destination port */ + G_TYPE_STRING, /* Packets */ + G_TYPE_STRING, /* Packets per second */ + G_TYPE_STRING, /* Average bandwidth */ + G_TYPE_STRING, /* Max. bandwidth */ + G_TYPE_STRING, /* Max. burst */ + G_TYPE_STRING, /* Burst alarms */ + G_TYPE_STRING, /* Max. buffers */ + G_TYPE_STRING, /* Buffer alarms */ + G_TYPE_POINTER /* Data */ + ); + + /* Create a view */ + list_w = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); + + list_view = GTK_TREE_VIEW(list_w); + sortable = GTK_TREE_SORTABLE(list_store); + + /* Speed up the list display */ + gtk_tree_view_set_fixed_height_mode(list_view, TRUE); + + /* Setup the sortable columns */ + gtk_tree_sortable_set_sort_column_id(sortable, MC_COL_SRC_ADDR, GTK_SORT_ASCENDING); + gtk_tree_view_set_headers_clickable(list_view, FALSE); + + /* The view now holds a reference. We can get rid of our own reference */ + g_object_unref(G_OBJECT(list_store)); + + /* + * Create the first column packet, associating the "text" attribute of the + * cell_renderer to the first column of the model + */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Src IP addr", renderer, + "text", MC_COL_SRC_ADDR, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_SRC_ADDR); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 100); + /* Add the column to the view. */ + gtk_tree_view_append_column(list_view, column); + + /* Source port */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Src port", renderer, + "text", MC_COL_SRC_PORT, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_SRC_PORT); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Destination address */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Dst IP addr", renderer, + "text", MC_COL_DST_ADDR, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_DST_ADDR); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 100); + gtk_tree_view_append_column(list_view, column); + + /* Destination port */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Dst port", renderer, + "text", MC_COL_DST_PORT, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_DST_PORT); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Packets */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Packets", renderer, + "text", MC_COL_PACKETS, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_PACKETS); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Packets/s */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Packets/s", renderer, + "text", MC_COL_PPS, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_PPS); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 90); + gtk_tree_view_append_column(list_view, column); + + /* Average bandwidth */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Avg Bw", renderer, + "text", MC_COL_AVG_BW, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_AVG_BW); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Max. bandwidth */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Max Bw", renderer, + "text", MC_COL_MAX_BW, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BW); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Max. bursts */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Max bursts", renderer, + "text", MC_COL_MAX_BURST, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BURST); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_fixed_width(column, 100); + gtk_tree_view_append_column(list_view, column); + + /* Burst alarms*/ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Burst alarms", renderer, + "text", MC_COL_BURST_ALARM, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_BURST_ALARM); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 90); + gtk_tree_view_column_set_fixed_width(column, 110); + gtk_tree_view_append_column(list_view, column); + + /* Max. buffers */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Max buffers", renderer, + "text", MC_COL_MAX_BUFFER, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_MAX_BUFFER); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 90); + gtk_tree_view_column_set_fixed_width(column, 100); + gtk_tree_view_append_column(list_view, column); + + /* Buffer alarms */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Buffer alarms", renderer, + "text", MC_COL_BUFFER_ALARM, + NULL); + gtk_tree_view_column_set_sort_column_id(column, MC_COL_BUFFER_ALARM); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 90); + gtk_tree_view_column_set_fixed_width(column, 120); + gtk_tree_view_append_column(list_view, column); + + /* Now enable the sorting of each column */ + gtk_tree_view_set_rules_hint(list_view, TRUE); + gtk_tree_view_set_headers_clickable(list_view, TRUE); + + /* Setup the selection handler */ + selection = gtk_tree_view_get_selection(list_view); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); + + g_signal_connect(G_OBJECT(selection), "changed", /* (un)select_row */ + G_CALLBACK(mcaststream_on_select_row), + NULL); } @@ -639,90 +639,90 @@ create_list_view(void) static void mcaststream_dlg_create(void) { - GtkWidget *mcaststream_dlg_w; - GtkWidget *main_vb; - GtkWidget *scrolledwindow; - GtkWidget *hbuttonbox; - /*GtkWidget *bt_unselect;*/ - GtkWidget *bt_params; - GtkWidget *bt_close; + GtkWidget *mcaststream_dlg_w; + GtkWidget *main_vb; + GtkWidget *scrolledwindow; + GtkWidget *hbuttonbox; + /*GtkWidget *bt_unselect;*/ + GtkWidget *bt_params; + GtkWidget *bt_close; - gchar *title_name_ptr; - gchar *win_name; + gchar *title_name_ptr; + gchar *win_name; - title_name_ptr = cf_get_display_name(&cfile); - win_name = g_strdup_printf("%s - UDP Multicast Streams", title_name_ptr); - g_free(title_name_ptr); - mcaststream_dlg_w = dlg_window_new(win_name); + title_name_ptr = cf_get_display_name(&cfile); + win_name = g_strdup_printf("%s - UDP Multicast Streams", title_name_ptr); + g_free(title_name_ptr); + mcaststream_dlg_w = dlg_window_new(win_name); - gtk_window_set_default_size(GTK_WINDOW(mcaststream_dlg_w), 1150, 400); + gtk_window_set_default_size(GTK_WINDOW(mcaststream_dlg_w), 1150, 400); - main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE); - gtk_container_add(GTK_CONTAINER(mcaststream_dlg_w), main_vb); - gtk_container_set_border_width (GTK_CONTAINER (main_vb), 12); + main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE); + gtk_container_add(GTK_CONTAINER(mcaststream_dlg_w), main_vb); + gtk_container_set_border_width (GTK_CONTAINER (main_vb), 12); - top_label = gtk_label_new ("Detected 0 Multicast streams"); - gtk_box_pack_start (GTK_BOX (main_vb), top_label, FALSE, FALSE, 8); + top_label = gtk_label_new ("Detected 0 Multicast streams"); + gtk_box_pack_start (GTK_BOX (main_vb), top_label, FALSE, FALSE, 8); - scrolledwindow = scrolled_window_new (NULL, NULL); - gtk_box_pack_start (GTK_BOX (main_vb), scrolledwindow, TRUE, TRUE, 0); + scrolledwindow = scrolled_window_new (NULL, NULL); + gtk_box_pack_start (GTK_BOX (main_vb), scrolledwindow, TRUE, TRUE, 0); - create_list_view(); - gtk_container_add(GTK_CONTAINER(scrolledwindow), list_w); + create_list_view(); + gtk_container_add(GTK_CONTAINER(scrolledwindow), list_w); - gtk_widget_show(mcaststream_dlg_w); + gtk_widget_show(mcaststream_dlg_w); - label_fwd = gtk_label_new (FWD_LABEL_TEXT); - gtk_box_pack_start (GTK_BOX (main_vb), label_fwd, FALSE, FALSE, 0); + label_fwd = gtk_label_new (FWD_LABEL_TEXT); + gtk_box_pack_start (GTK_BOX (main_vb), label_fwd, FALSE, FALSE, 0); - label_par = gtk_label_new (PAR_LABEL_TEXT); - gtk_box_pack_start (GTK_BOX (main_vb), label_par, FALSE, FALSE, 0); + label_par = gtk_label_new (PAR_LABEL_TEXT); + gtk_box_pack_start (GTK_BOX (main_vb), label_par, FALSE, FALSE, 0); - /* button row */ - hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); - gtk_box_pack_start (GTK_BOX (main_vb), hbuttonbox, FALSE, FALSE, 0); - gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_END); - gtk_box_set_spacing (GTK_BOX (hbuttonbox), 0); + /* button row */ + hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); + gtk_box_pack_start (GTK_BOX (main_vb), hbuttonbox, FALSE, FALSE, 0); + gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox), GTK_BUTTONBOX_END); + gtk_box_set_spacing (GTK_BOX (hbuttonbox), 0); - /*bt_unselect = gtk_button_new_with_label ("Unselect"); - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_unselect); - gtk_widget_set_tooltip_text (bt_unselect, "Undo stream selection");*/ + /*bt_unselect = gtk_button_new_with_label ("Unselect"); + gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_unselect); + gtk_widget_set_tooltip_text (bt_unselect, "Undo stream selection");*/ - bt_params = gtk_button_new_with_label ("Set parameters"); - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_params); - gtk_widget_set_tooltip_text (bt_params, "Set buffer, limit and speed parameters"); + bt_params = gtk_button_new_with_label ("Set parameters"); + gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_params); + gtk_widget_set_tooltip_text (bt_params, "Set buffer, limit and speed parameters"); - bt_filter = gtk_button_new_with_label ("Prepare Filter"); - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_filter); - gtk_widget_set_tooltip_text (bt_filter, "Prepare a display filter of the selected stream"); + bt_filter = gtk_button_new_with_label ("Prepare Filter"); + gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_filter); + gtk_widget_set_tooltip_text (bt_filter, "Prepare a display filter of the selected stream"); - bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE); - gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close); - gtk_widget_set_tooltip_text (bt_close, "Close this dialog"); - gtk_widget_set_can_default(bt_close, TRUE); + bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE); + gtk_container_add (GTK_CONTAINER (hbuttonbox), bt_close); + gtk_widget_set_tooltip_text (bt_close, "Close this dialog"); + gtk_widget_set_can_default(bt_close, TRUE); - /*g_signal_connect(bt_unselect, "clicked", G_CALLBACK(mcaststream_on_unselect), NULL);*/ - g_signal_connect(bt_params, "clicked", G_CALLBACK(mcast_on_params), NULL); - g_signal_connect(bt_filter, "clicked", G_CALLBACK(mcaststream_on_filter), NULL); - window_set_cancel_button(mcaststream_dlg_w, bt_close, window_cancel_button_cb); + /*g_signal_connect(bt_unselect, "clicked", G_CALLBACK(mcaststream_on_unselect), NULL);*/ + g_signal_connect(bt_params, "clicked", G_CALLBACK(mcast_on_params), NULL); + g_signal_connect(bt_filter, "clicked", G_CALLBACK(mcaststream_on_filter), NULL); + window_set_cancel_button(mcaststream_dlg_w, bt_close, window_cancel_button_cb); - g_signal_connect(mcaststream_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); - g_signal_connect(mcaststream_dlg_w, "destroy", G_CALLBACK(mcaststream_on_destroy), NULL); + g_signal_connect(mcaststream_dlg_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); + g_signal_connect(mcaststream_dlg_w, "destroy", G_CALLBACK(mcaststream_on_destroy), NULL); - gtk_widget_show_all(mcaststream_dlg_w); - window_present(mcaststream_dlg_w); + gtk_widget_show_all(mcaststream_dlg_w); + window_present(mcaststream_dlg_w); - mcaststream_on_unselect(NULL, NULL); + mcaststream_on_unselect(NULL, NULL); - mcast_stream_dlg = mcaststream_dlg_w; + mcast_stream_dlg = mcaststream_dlg_w; - g_free(win_name); + g_free(win_name); } /****************************************************************************/ -/* PUBLIC */ +/* PUBLIC */ /****************************************************************************/ /****************************************************************************/ @@ -731,21 +731,21 @@ mcaststream_dlg_create(void) void mcaststream_dlg_update(GList *list) { - if (mcast_stream_dlg != NULL) { - gtk_list_store_clear(list_store); - streams_nb = 0; + if (mcast_stream_dlg != NULL) { + gtk_list_store_clear(list_store); + streams_nb = 0; - list = g_list_first(list); - while (list) - { - add_to_list_store((mcast_stream_info_t*)(list->data)); - list = g_list_next(list); - } + list = g_list_first(list); + while (list) + { + add_to_list_store((mcast_stream_info_t*)(list->data)); + list = g_list_next(list); + } - mcaststream_on_unselect(NULL, NULL); - } + mcaststream_on_unselect(NULL, NULL); + } - last_list = list; + last_list = list; } @@ -755,19 +755,19 @@ mcaststream_dlg_update(GList *list) void mcaststream_dlg_show(GList *list) { - if (mcast_stream_dlg != NULL) { - /* There's already a dialog box; reactivate it. */ - reactivate_window(mcast_stream_dlg); - /* Another list since last call? */ - if (list != last_list) { - mcaststream_dlg_update(list); - } - } - else { - /* Create and show the dialog box */ - mcaststream_dlg_create(); - mcaststream_dlg_update(list); - } + if (mcast_stream_dlg != NULL) { + /* There's already a dialog box; reactivate it. */ + reactivate_window(mcast_stream_dlg); + /* Another list since last call? */ + if (list != last_list) { + mcaststream_dlg_update(list); + } + } + else { + /* Create and show the dialog box */ + mcaststream_dlg_create(); + mcaststream_dlg_update(list); + } } @@ -776,16 +776,16 @@ mcaststream_dlg_show(GList *list) void mcaststream_launch(GtkAction *action _U_, gpointer user_data _U_) { - /* Register the tap listener */ - register_tap_listener_mcast_stream(); + /* Register the tap listener */ + register_tap_listener_mcast_stream(); - /* Scan for Mcast streams (redissect all packets) */ - mcaststream_scan(); + /* Scan for Mcast streams (redissect all packets) */ + mcaststream_scan(); - /* Show the dialog box with the list of streams */ - mcaststream_dlg_show(mcaststream_get_info()->strinfo_list); + /* Show the dialog box with the list of streams */ + mcaststream_dlg_show(mcaststream_get_info()->strinfo_list); - /* Tap listener will be removed and cleaned up in mcaststream_on_destroy */ + /* Tap listener will be removed and cleaned up in mcaststream_on_destroy */ } /****************************************************************************/ @@ -800,9 +800,9 @@ register_tap_listener_mcast_stream_dlg(void) * Local variables: * c-basic-offset: 4 * tab-width: 8 - * indent-tabs-mode: t + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=8 noexpandtab: - * :indentSize=4:tabSize=8:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ diff --git a/ui/gtk/rtp_stream_dlg.c b/ui/gtk/rtp_stream_dlg.c index ae89d5f10c..41c43cc841 100644 --- a/ui/gtk/rtp_stream_dlg.c +++ b/ui/gtk/rtp_stream_dlg.c @@ -100,53 +100,53 @@ enum /****************************************************************************/ static void save_stream_destroy_cb(GtkWidget *win _U_, gpointer user_data _U_) { - /* Note that we no longer have a Save voice info dialog box. */ - rtpstream_save_dlg = NULL; + /* Note that we no longer have a Save voice info dialog box. */ + rtpstream_save_dlg = NULL; } /****************************************************************************/ /* save in a file */ static gboolean save_stream_ok_cb(GtkWidget *ok_bt _U_, gpointer fs) { - gchar *g_dest; - - if (!selected_stream_fwd) { - return TRUE; - } - - g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs)); - - /* Perhaps the user specified a directory instead of a file. - Check whether they did. */ - if (test_for_directory(g_dest) == EISDIR) { - /* It's a directory - set the file selection box to display it. */ - set_last_open_dir(g_dest); - g_free(g_dest); - file_selection_set_current_folder((GtkWidget *)fs, get_last_open_dir()); - gtk_file_chooser_set_current_name((GtkFileChooser *)fs, ""); - return FALSE; - } - -#if 0 /* GtkFileChooser/gtk_dialog_run currently being used. */ - /* So: Leaving the dialog box displayed after popping-up an */ - /* alert box won't work. */ - /* - * Don't dismiss the dialog box if the save operation fails. - */ - if (!rtpstream_save(selected_stream_fwd, g_dest)) { - g_free(g_dest); - return; - } - g_free(g_dest); - window_destroy(GTK_WIDGET(rtpstream_save_dlg)); - return; + gchar *g_dest; + + if (!selected_stream_fwd) { + return TRUE; + } + + g_dest = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fs)); + + /* Perhaps the user specified a directory instead of a file. + Check whether they did. */ + if (test_for_directory(g_dest) == EISDIR) { + /* It's a directory - set the file selection box to display it. */ + set_last_open_dir(g_dest); + g_free(g_dest); + file_selection_set_current_folder((GtkWidget *)fs, get_last_open_dir()); + gtk_file_chooser_set_current_name((GtkFileChooser *)fs, ""); + return FALSE; + } + +#if 0 /* GtkFileChooser/gtk_dialog_run currently being used. */ + /* So: Leaving the dialog box displayed after popping-up an */ + /* alert box won't work. */ + /* + * Don't dismiss the dialog box if the save operation fails. + */ + if (!rtpstream_save(selected_stream_fwd, g_dest)) { + g_free(g_dest); + return; + } + g_free(g_dest); + window_destroy(GTK_WIDGET(rtpstream_save_dlg)); + return; #else - /* Dialog box needs to be always destroyed. Return TRUE */ - /* so that caller will destroy the dialog box. */ - /* See comment under rtpstream_on_save. */ - rtpstream_save(selected_stream_fwd, g_dest); - g_free(g_dest); - return TRUE; + /* Dialog box needs to be always destroyed. Return TRUE */ + /* so that caller will destroy the dialog box. */ + /* See comment under rtpstream_on_save. */ + rtpstream_save(selected_stream_fwd, g_dest); + g_free(g_dest); + return TRUE; #endif } @@ -157,18 +157,18 @@ static gboolean save_stream_ok_cb(GtkWidget *ok_bt _U_, gpointer fs) static void rtpstream_on_destroy(GObject *object _U_, gpointer user_data _U_) { - /* Remove the stream tap listener */ - remove_tap_listener_rtp_stream(); + /* Remove the stream tap listener */ + remove_tap_listener_rtp_stream(); - /* Is there a save voice window open? */ - if (rtpstream_save_dlg != NULL) - window_destroy(rtpstream_save_dlg); + /* Is there a save voice window open? */ + if (rtpstream_save_dlg != NULL) + window_destroy(rtpstream_save_dlg); - /* Clean up memory used by stream tap */ - rtpstream_reset((rtpstream_tapinfo_t *)rtpstream_get_info()); + /* Clean up memory used by stream tap */ + rtpstream_reset((rtpstream_tapinfo_t *)rtpstream_get_info()); - /* Note that we no longer have a "RTP Streams" dialog box. */ - rtp_stream_dlg = NULL; + /* Note that we no longer have a "RTP Streams" dialog box. */ + rtp_stream_dlg = NULL; } @@ -176,117 +176,117 @@ rtpstream_on_destroy(GObject *object _U_, gpointer user_data _U_) static void rtpstream_on_unselect(GtkButton *button _U_, gpointer user_data _U_) { - GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); - gtk_tree_selection_unselect_all(selection); + GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); + gtk_tree_selection_unselect_all(selection); - selected_stream_fwd = NULL; - selected_stream_rev = NULL; - gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); - gtk_label_set_text(GTK_LABEL(label_rev), REV_LABEL_TEXT); + selected_stream_fwd = NULL; + selected_stream_rev = NULL; + gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); + gtk_label_set_text(GTK_LABEL(label_rev), REV_LABEL_TEXT); } /****************************************************************************/ static gint rtp_stream_info_cmp_reverse(gconstpointer aa, gconstpointer bb) { - const struct _rtp_stream_info* a = (const struct _rtp_stream_info *)aa; - const struct _rtp_stream_info* b = (const struct _rtp_stream_info *)bb; - - if (a==NULL || b==NULL) - return 1; - if ((ADDRESSES_EQUAL(&(a->src_addr), &(b->dest_addr))) - && (a->src_port == b->dest_port) - && (ADDRESSES_EQUAL(&(a->dest_addr), &(b->src_addr))) - && (a->dest_port == b->src_port)) - return 0; - else - return 1; + const struct _rtp_stream_info* a = (const struct _rtp_stream_info *)aa; + const struct _rtp_stream_info* b = (const struct _rtp_stream_info *)bb; + + if (a==NULL || b==NULL) + return 1; + if ((ADDRESSES_EQUAL(&(a->src_addr), &(b->dest_addr))) + && (a->src_port == b->dest_port) + && (ADDRESSES_EQUAL(&(a->dest_addr), &(b->src_addr))) + && (a->dest_port == b->src_port)) + return 0; + else + return 1; } /****************************************************************************/ static void -rtpstream_on_findrev(GtkButton *button _U_, gpointer user_data _U_) +rtpstream_on_findrev(GtkButton *button _U_, gpointer user_data _U_) { - GtkTreeSelection *selection; - GList *path_list; - GList *path_list_item = NULL; - GtkTreePath *path = NULL; - GtkTreePath *path_fwd = NULL; - GtkTreePath *path_rev = NULL; - GtkTreeIter iter; - rtp_stream_info_t *stream = NULL; - gboolean found_it = FALSE; - - if (selected_stream_fwd==NULL) - return; - - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); - path_list = gtk_tree_selection_get_selected_rows(selection, NULL); - - if (path_list) { - path_list_item = g_list_first(path_list); - path = (GtkTreePath *)(path_list_item->data); - } - - if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path)) { - gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); - if (stream == selected_stream_fwd) { - path_fwd = path; - } - if (stream == selected_stream_rev) { - path_rev = path; - } - } - - path = NULL; - if (path_list_item) { - path_list_item = g_list_next(path_list_item); - if (path_list_item) - path = (GtkTreePath *)(path_list_item->data); - } - - if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path)) { - gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); - if (stream == selected_stream_fwd) { - path_fwd = path; - } - if (stream == selected_stream_rev) { - path_rev = path; - } - } - - /* Find it from the forward stream on */ - gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path_fwd); - while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)) { - gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); - if (rtp_stream_info_cmp_reverse(selected_stream_fwd, stream) == 0) { - found_it = TRUE; - break; - } - }; - - if (!found_it) { - /* If we're not done yet, restart at the beginning */ - gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter); - do { - gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); - if (rtp_stream_info_cmp_reverse(selected_stream_fwd, stream) == 0) { - found_it = TRUE; - break; - } - if (stream == selected_stream_fwd) - break; - } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)); - } - - if (found_it) { - if (path_rev) - gtk_tree_selection_unselect_path(selection, path_rev); - gtk_tree_selection_select_iter(selection, &iter); - } - - g_list_foreach(path_list, (GFunc)gtk_tree_path_free, NULL); - g_list_free(path_list); + GtkTreeSelection *selection; + GList *path_list; + GList *path_list_item = NULL; + GtkTreePath *path = NULL; + GtkTreePath *path_fwd = NULL; + GtkTreePath *path_rev = NULL; + GtkTreeIter iter; + rtp_stream_info_t *stream = NULL; + gboolean found_it = FALSE; + + if (selected_stream_fwd==NULL) + return; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); + path_list = gtk_tree_selection_get_selected_rows(selection, NULL); + + if (path_list) { + path_list_item = g_list_first(path_list); + path = (GtkTreePath *)(path_list_item->data); + } + + if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path)) { + gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); + if (stream == selected_stream_fwd) { + path_fwd = path; + } + if (stream == selected_stream_rev) { + path_rev = path; + } + } + + path = NULL; + if (path_list_item) { + path_list_item = g_list_next(path_list_item); + if (path_list_item) + path = (GtkTreePath *)(path_list_item->data); + } + + if (path && gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path)) { + gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); + if (stream == selected_stream_fwd) { + path_fwd = path; + } + if (stream == selected_stream_rev) { + path_rev = path; + } + } + + /* Find it from the forward stream on */ + gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path_fwd); + while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)) { + gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); + if (rtp_stream_info_cmp_reverse(selected_stream_fwd, stream) == 0) { + found_it = TRUE; + break; + } + }; + + if (!found_it) { + /* If we're not done yet, restart at the beginning */ + gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter); + do { + gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &stream, -1); + if (rtp_stream_info_cmp_reverse(selected_stream_fwd, stream) == 0) { + found_it = TRUE; + break; + } + if (stream == selected_stream_fwd) + break; + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter)); + } + + if (found_it) { + if (path_rev) + gtk_tree_selection_unselect_path(selection, path_rev); + gtk_tree_selection_select_iter(selection, &iter); + } + + g_list_foreach(path_list, (GFunc)gtk_tree_path_free, NULL); + g_list_free(path_list); } @@ -296,10 +296,10 @@ static void rtpstream_on_goto (GtkButton *button _U_, gpointer user_data _U_) { - if (selected_stream_fwd) - { - cf_goto_frame(&cfile, selected_stream_fwd->first_frame_num); - } + if (selected_stream_fwd) + { + cf_goto_frame(&cfile, selected_stream_fwd->first_frame_num); + } } */ @@ -309,62 +309,62 @@ static void rtpstream_on_save(GtkButton *button _U_, gpointer data _U_) { /* XX - not needed? - rtpstream_tapinfo_t* tapinfo = data; + rtpstream_tapinfo_t* tapinfo = data; */ - if (!selected_stream_fwd) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, - "Please select a forward stream"); - return; - } + if (!selected_stream_fwd) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, + "Please select a forward stream"); + return; + } #if 0 /* XXX: GtkFileChooserDialog/gtk_dialog_run currently being used is effectively modal so this is not req'd */ - if (rtpstream_save_dlg != NULL) { - /* There's already a Save dialog box; reactivate it. */ - reactivate_window(rtpstream_save_dlg); - return; - } + if (rtpstream_save_dlg != NULL) { + /* There's already a Save dialog box; reactivate it. */ + reactivate_window(rtpstream_save_dlg); + return; + } #endif - rtpstream_save_dlg = gtk_file_chooser_dialog_new( - "Wireshark: Save selected stream in rtpdump ('-F dump') format", - GTK_WINDOW(rtp_stream_dlg), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - NULL); - gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(rtpstream_save_dlg), TRUE); + rtpstream_save_dlg = gtk_file_chooser_dialog_new( + "Wireshark: Save selected stream in rtpdump ('-F dump') format", + GTK_WINDOW(rtp_stream_dlg), GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL); + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(rtpstream_save_dlg), TRUE); - g_signal_connect(rtpstream_save_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); - g_signal_connect(rtpstream_save_dlg, "destroy", G_CALLBACK(save_stream_destroy_cb), NULL); + g_signal_connect(rtpstream_save_dlg, "delete_event", G_CALLBACK(window_delete_event_cb), NULL); + g_signal_connect(rtpstream_save_dlg, "destroy", G_CALLBACK(save_stream_destroy_cb), NULL); - gtk_widget_show(rtpstream_save_dlg); - window_present(rtpstream_save_dlg); + gtk_widget_show(rtpstream_save_dlg); + window_present(rtpstream_save_dlg); #if 0 - if (gtk_dialog_run(GTK_DIALOG(rtpstream_save_dlg)) == GTK_RESPONSE_ACCEPT){ - save_stream_ok_cb(rtpstream_save_dlg, rtpstream_save_dlg); - }else{ - window_destroy(rtpstream_save_dlg); - } + if (gtk_dialog_run(GTK_DIALOG(rtpstream_save_dlg)) == GTK_RESPONSE_ACCEPT){ + save_stream_ok_cb(rtpstream_save_dlg, rtpstream_save_dlg); + }else{ + window_destroy(rtpstream_save_dlg); + } #endif - /* "Run" the GtkFileChooserDialog. */ - /* Upon exit: If "Accept" run the OK callback. */ - /* If the OK callback returns with a FALSE status, re-run the dialog.*/ - /* If not accept (ie: cancel) destroy the window. */ - /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */ - /* return with a TRUE status so that the dialog window will be destroyed. */ - /* Trying to re-run the dialog after popping up an alert box will not work */ - /* since the user will not be able to dismiss the alert box. */ - /* The (somewhat unfriendly) effect: the user must re-invoke the */ - /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */ - /* */ - /* ToDo: use GtkFileChooserWidget in a dialog window instead of */ - /* GtkFileChooserDialog. */ - while (gtk_dialog_run(GTK_DIALOG(rtpstream_save_dlg)) == GTK_RESPONSE_ACCEPT) { - if (save_stream_ok_cb(NULL, rtpstream_save_dlg)) { - break; /* we're done */ - } - } - window_destroy(rtpstream_save_dlg); + /* "Run" the GtkFileChooserDialog. */ + /* Upon exit: If "Accept" run the OK callback. */ + /* If the OK callback returns with a FALSE status, re-run the dialog.*/ + /* If not accept (ie: cancel) destroy the window. */ + /* XXX: If the OK callback pops up an alert box (eg: for an error) it *must* */ + /* return with a TRUE status so that the dialog window will be destroyed. */ + /* Trying to re-run the dialog after popping up an alert box will not work */ + /* since the user will not be able to dismiss the alert box. */ + /* The (somewhat unfriendly) effect: the user must re-invoke the */ + /* GtkFileChooserDialog whenever the OK callback pops up an alert box. */ + /* */ + /* ToDo: use GtkFileChooserWidget in a dialog window instead of */ + /* GtkFileChooserDialog. */ + while (gtk_dialog_run(GTK_DIALOG(rtpstream_save_dlg)) == GTK_RESPONSE_ACCEPT) { + if (save_stream_ok_cb(NULL, rtpstream_save_dlg)) { + break; /* we're done */ + } + } + window_destroy(rtpstream_save_dlg); } @@ -372,9 +372,9 @@ rtpstream_on_save(GtkButton *button _U_, gpointer data _U_) static void rtpstream_on_mark(GtkButton *button _U_, gpointer user_data _U_) { - if (selected_stream_fwd==NULL && selected_stream_rev==NULL) - return; - rtpstream_mark(selected_stream_fwd, selected_stream_rev); + if (selected_stream_fwd==NULL && selected_stream_rev==NULL) + return; + rtpstream_mark(selected_stream_fwd, selected_stream_rev); } @@ -382,67 +382,67 @@ rtpstream_on_mark(GtkButton *button _U_, gpointer user_data _U_) static void rtpstream_on_filter(GtkButton *button _U_, gpointer user_data _U_) { - gchar *filter_string = NULL; - gchar *filter_string_fwd = NULL; - gchar *filter_string_rev = NULL; - gchar ip_version[3]; - - if (selected_stream_fwd==NULL && selected_stream_rev==NULL) - return; - - if (selected_stream_fwd) - { - if (selected_stream_fwd->src_addr.type==AT_IPv6) { - g_strlcpy(ip_version,"v6",sizeof(ip_version)); - } else { - ip_version[0] = '\0'; - } - filter_string_fwd = g_strdup_printf( - "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u && rtp.ssrc==0x%X)", - ip_version, - ep_address_to_str(&(selected_stream_fwd->src_addr)), - selected_stream_fwd->src_port, - ip_version, - ep_address_to_str(&(selected_stream_fwd->dest_addr)), - selected_stream_fwd->dest_port, - selected_stream_fwd->ssrc); - - filter_string = filter_string_fwd; - } - - if (selected_stream_rev) - { - if (selected_stream_rev->src_addr.type==AT_IPv6) { - g_strlcpy(ip_version,"v6",sizeof(ip_version)); - } else { - ip_version[0] = '\0'; - } - filter_string_rev = g_strdup_printf( - "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u && rtp.ssrc==0x%X)", - ip_version, - ep_address_to_str(&(selected_stream_rev->src_addr)), - selected_stream_rev->src_port, - ip_version, - ep_address_to_str(&(selected_stream_rev->dest_addr)), - selected_stream_rev->dest_port, - selected_stream_rev->ssrc); - - filter_string = filter_string_rev; - } - - if ((selected_stream_fwd) && (selected_stream_rev)) - { - filter_string = g_strdup_printf("%s || %s", filter_string_fwd, filter_string_rev); - g_free(filter_string_fwd); - g_free(filter_string_rev); - } - - gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string); - g_free(filter_string); + gchar *filter_string = NULL; + gchar *filter_string_fwd = NULL; + gchar *filter_string_rev = NULL; + gchar ip_version[3]; + + if (selected_stream_fwd==NULL && selected_stream_rev==NULL) + return; + + if (selected_stream_fwd) + { + if (selected_stream_fwd->src_addr.type==AT_IPv6) { + g_strlcpy(ip_version,"v6",sizeof(ip_version)); + } else { + ip_version[0] = '\0'; + } + filter_string_fwd = g_strdup_printf( + "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u && rtp.ssrc==0x%X)", + ip_version, + ep_address_to_str(&(selected_stream_fwd->src_addr)), + selected_stream_fwd->src_port, + ip_version, + ep_address_to_str(&(selected_stream_fwd->dest_addr)), + selected_stream_fwd->dest_port, + selected_stream_fwd->ssrc); + + filter_string = filter_string_fwd; + } + + if (selected_stream_rev) + { + if (selected_stream_rev->src_addr.type==AT_IPv6) { + g_strlcpy(ip_version,"v6",sizeof(ip_version)); + } else { + ip_version[0] = '\0'; + } + filter_string_rev = g_strdup_printf( + "(ip%s.src==%s && udp.srcport==%u && ip%s.dst==%s && udp.dstport==%u && rtp.ssrc==0x%X)", + ip_version, + ep_address_to_str(&(selected_stream_rev->src_addr)), + selected_stream_rev->src_port, + ip_version, + ep_address_to_str(&(selected_stream_rev->dest_addr)), + selected_stream_rev->dest_port, + selected_stream_rev->ssrc); + + filter_string = filter_string_rev; + } + + if ((selected_stream_fwd) && (selected_stream_rev)) + { + filter_string = g_strdup_printf("%s || %s", filter_string_fwd, filter_string_rev); + g_free(filter_string_fwd); + g_free(filter_string_rev); + } + + gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string); + g_free(filter_string); /* - main_filter_packets(&cfile, filter_string, FALSE); - rtpstream_dlg_update(rtpstream_get_info()->strinfo_list); + main_filter_packets(&cfile, filter_string, FALSE); + rtpstream_dlg_update(rtpstream_get_info()->strinfo_list); */ } @@ -451,104 +451,104 @@ rtpstream_on_filter(GtkButton *button _U_, gpointer user_data _U_) static void rtpstream_on_copy_as_csv(GtkWindow *win _U_, gpointer data _U_) { - GtkTreeViewColumn *column; - const gchar *title; - GtkTreeIter iter; - guint i,j; - gchar *table_entry; - guint table_entry_uint; - - GString *CSV_str; - GtkClipboard *cb; - - CSV_str = g_string_sized_new(240*(1+streams_nb)); - /* Add the column headers to the CSV data */ - for (j=0; jstr, (gint)CSV_str->len); - g_string_free(CSV_str, TRUE); + GtkTreeViewColumn *column; + const gchar *title; + GtkTreeIter iter; + guint i,j; + gchar *table_entry; + guint table_entry_uint; + + GString *CSV_str; + GtkClipboard *cb; + + CSV_str = g_string_sized_new(240*(1+streams_nb)); + /* Add the column headers to the CSV data */ + for (j=0; jstr, (gint)CSV_str->len); + g_string_free(CSV_str, TRUE); } /****************************************************************************/ static void rtpstream_on_analyse(GtkButton *button _U_, gpointer user_data _U_) { - address src_fwd; - guint32 port_src_fwd = 0; - address dst_fwd; - guint32 port_dst_fwd = 0; - guint32 ssrc_fwd = 0; - address src_rev; - guint32 port_src_rev = 0; - address dst_rev; - guint32 port_dst_rev = 0; - guint32 ssrc_rev = 0; - - if (!(selected_stream_fwd || selected_stream_rev)) - { - return; - } - - SET_ADDRESS(&src_fwd,AT_NONE,0,NULL); - SET_ADDRESS(&dst_fwd,AT_NONE,0,NULL); - SET_ADDRESS(&src_rev,AT_NONE,0,NULL); - SET_ADDRESS(&dst_rev,AT_NONE,0,NULL); - - if (selected_stream_fwd) { - COPY_ADDRESS(&(src_fwd), &(selected_stream_fwd->src_addr)); - port_src_fwd = selected_stream_fwd->src_port; - COPY_ADDRESS(&(dst_fwd), &(selected_stream_fwd->dest_addr)); - port_dst_fwd = selected_stream_fwd->dest_port; - ssrc_fwd = selected_stream_fwd->ssrc; - } - - if (selected_stream_rev) { - COPY_ADDRESS(&(src_rev), &(selected_stream_rev->src_addr)); - port_src_rev = selected_stream_rev->src_port; - COPY_ADDRESS(&(dst_rev), &(selected_stream_rev->dest_addr)); - port_dst_rev = selected_stream_rev->dest_port; - ssrc_rev = selected_stream_rev->ssrc; - } - - rtp_analysis( - &src_fwd, - port_src_fwd, - &dst_fwd, - port_dst_fwd, - ssrc_fwd, - &src_rev, - port_src_rev, - &dst_rev, - port_dst_rev, - ssrc_rev - ); + address src_fwd; + guint32 port_src_fwd = 0; + address dst_fwd; + guint32 port_dst_fwd = 0; + guint32 ssrc_fwd = 0; + address src_rev; + guint32 port_src_rev = 0; + address dst_rev; + guint32 port_dst_rev = 0; + guint32 ssrc_rev = 0; + + if (!(selected_stream_fwd || selected_stream_rev)) + { + return; + } + + SET_ADDRESS(&src_fwd,AT_NONE,0,NULL); + SET_ADDRESS(&dst_fwd,AT_NONE,0,NULL); + SET_ADDRESS(&src_rev,AT_NONE,0,NULL); + SET_ADDRESS(&dst_rev,AT_NONE,0,NULL); + + if (selected_stream_fwd) { + COPY_ADDRESS(&(src_fwd), &(selected_stream_fwd->src_addr)); + port_src_fwd = selected_stream_fwd->src_port; + COPY_ADDRESS(&(dst_fwd), &(selected_stream_fwd->dest_addr)); + port_dst_fwd = selected_stream_fwd->dest_port; + ssrc_fwd = selected_stream_fwd->ssrc; + } + + if (selected_stream_rev) { + COPY_ADDRESS(&(src_rev), &(selected_stream_rev->src_addr)); + port_src_rev = selected_stream_rev->src_port; + COPY_ADDRESS(&(dst_rev), &(selected_stream_rev->dest_addr)); + port_dst_rev = selected_stream_rev->dest_port; + ssrc_rev = selected_stream_rev->ssrc; + } + + rtp_analysis( + &src_fwd, + port_src_fwd, + &dst_fwd, + port_dst_fwd, + ssrc_fwd, + &src_rev, + port_src_rev, + &dst_rev, + port_dst_rev, + ssrc_rev + ); } @@ -558,111 +558,111 @@ rtpstream_on_analyse(GtkButton *button _U_, gpointer user_data _U_) static gboolean rtpstream_view_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer userdata _U_) { - GtkTreeIter iter; - gint nb_selected; - rtp_stream_info_t* selected_stream; - gboolean result = TRUE; - gchar label_text[80]; - - /* Logic - * nb_selected path_currently_selected forward reverse action result - * 0 must be false any any assign forward true - * 1 true match any delete forward true - * 1 true other any delete reverse true - * 1 false match any invalid true - * 1 false other none assign reverse true - * 1 false other any assign forward true - * 2 true match any delete forward path_currently_selected - * 2 true other match delete reverse path_currently_selected - * 2 true other other invalid path_currently_selected - * 2 false match any invalid path_currently_selected - * 2 false any match invalid path_currently_selected - * 2 false other other assign reverse path_currently_selected - * >2 any any any invalid path_currently_selected - */ - - nb_selected = gtk_tree_selection_count_selected_rows(selection); - if (gtk_tree_model_get_iter(model, &iter, path)) { - gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &selected_stream, -1); - - switch (nb_selected) - { - case 0: - { - if (path_currently_selected) - g_print("Select: He, we've got a selected path while none is selected?\n"); - else - selected_stream_fwd = selected_stream; - break; - } - case 1: - { - if (path_currently_selected) - if (selected_stream == selected_stream_fwd) - selected_stream_fwd = NULL; - else - selected_stream_rev = NULL; - else - if (selected_stream == selected_stream_fwd) - g_print("Select: He, this can't be. 1 not selected but equal to fwd\n"); - else - if (selected_stream_rev) - selected_stream_fwd = selected_stream; - else - selected_stream_rev = selected_stream; - break; - } - case 2: - { - if (path_currently_selected) { - if (selected_stream == selected_stream_fwd) - selected_stream_fwd = NULL; - else if (selected_stream == selected_stream_rev) - selected_stream_rev = NULL; - else - g_print("Select: He, this can't be. 2 selected but not equal to fwd or rev\n"); - } - result = path_currently_selected; - break; - } - default: - { - g_print("Select: He, we're getting a too high selection count\n"); - result = path_currently_selected; - } - } - } - - if (selected_stream_fwd) { - g_snprintf(label_text, sizeof(label_text), "Forward: %s:%u -> %s:%u, SSRC=0x%X", - ep_address_to_display(&(selected_stream_fwd->src_addr)), - selected_stream_fwd->src_port, - ep_address_to_display(&(selected_stream_fwd->dest_addr)), - selected_stream_fwd->dest_port, - selected_stream_fwd->ssrc - ); - gtk_label_set_text(GTK_LABEL(label_fwd), label_text); - } else { - if (selected_stream_rev) - gtk_label_set_text(GTK_LABEL(label_fwd), FWD_ONLY_LABEL_TEXT); - else - gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); - } - - if (selected_stream_rev) { - g_snprintf(label_text, sizeof(label_text), "Reverse: %s:%u -> %s:%u, SSRC=0x%X", - ep_address_to_display(&(selected_stream_rev->src_addr)), - selected_stream_rev->src_port, - ep_address_to_display(&(selected_stream_rev->dest_addr)), - selected_stream_rev->dest_port, - selected_stream_rev->ssrc - ); - gtk_label_set_text(GTK_LABEL(label_rev), label_text); - } else { - gtk_label_set_text(GTK_LABEL(label_rev), REV_LABEL_TEXT); - } - - return result; + GtkTreeIter iter; + gint nb_selected; + rtp_stream_info_t* selected_stream; + gboolean result = TRUE; + gchar label_text[80]; + + /* Logic + * nb_selected path_currently_selected forward reverse action result + * 0 must be false any any assign forward true + * 1 true match any delete forward true + * 1 true other any delete reverse true + * 1 false match any invalid true + * 1 false other none assign reverse true + * 1 false other any assign forward true + * 2 true match any delete forward path_currently_selected + * 2 true other match delete reverse path_currently_selected + * 2 true other other invalid path_currently_selected + * 2 false match any invalid path_currently_selected + * 2 false any match invalid path_currently_selected + * 2 false other other assign reverse path_currently_selected + * >2 any any any invalid path_currently_selected + */ + + nb_selected = gtk_tree_selection_count_selected_rows(selection); + if (gtk_tree_model_get_iter(model, &iter, path)) { + gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, RTP_COL_DATA, &selected_stream, -1); + + switch (nb_selected) + { + case 0: + { + if (path_currently_selected) + g_print("Select: He, we've got a selected path while none is selected?\n"); + else + selected_stream_fwd = selected_stream; + break; + } + case 1: + { + if (path_currently_selected) + if (selected_stream == selected_stream_fwd) + selected_stream_fwd = NULL; + else + selected_stream_rev = NULL; + else + if (selected_stream == selected_stream_fwd) + g_print("Select: He, this can't be. 1 not selected but equal to fwd\n"); + else + if (selected_stream_rev) + selected_stream_fwd = selected_stream; + else + selected_stream_rev = selected_stream; + break; + } + case 2: + { + if (path_currently_selected) { + if (selected_stream == selected_stream_fwd) + selected_stream_fwd = NULL; + else if (selected_stream == selected_stream_rev) + selected_stream_rev = NULL; + else + g_print("Select: He, this can't be. 2 selected but not equal to fwd or rev\n"); + } + result = path_currently_selected; + break; + } + default: + { + g_print("Select: He, we're getting a too high selection count\n"); + result = path_currently_selected; + } + } + } + + if (selected_stream_fwd) { + g_snprintf(label_text, sizeof(label_text), "Forward: %s:%u -> %s:%u, SSRC=0x%X", + ep_address_to_display(&(selected_stream_fwd->src_addr)), + selected_stream_fwd->src_port, + ep_address_to_display(&(selected_stream_fwd->dest_addr)), + selected_stream_fwd->dest_port, + selected_stream_fwd->ssrc + ); + gtk_label_set_text(GTK_LABEL(label_fwd), label_text); + } else { + if (selected_stream_rev) + gtk_label_set_text(GTK_LABEL(label_fwd), FWD_ONLY_LABEL_TEXT); + else + gtk_label_set_text(GTK_LABEL(label_fwd), FWD_LABEL_TEXT); + } + + if (selected_stream_rev) { + g_snprintf(label_text, sizeof(label_text), "Reverse: %s:%u -> %s:%u, SSRC=0x%X", + ep_address_to_display(&(selected_stream_rev->src_addr)), + selected_stream_rev->src_port, + ep_address_to_display(&(selected_stream_rev->dest_addr)), + selected_stream_rev->dest_port, + selected_stream_rev->ssrc + ); + gtk_label_set_text(GTK_LABEL(label_rev), label_text); + } else { + gtk_label_set_text(GTK_LABEL(label_rev), REV_LABEL_TEXT); + } + + return result; } /****************************************************************************/ @@ -672,82 +672,82 @@ rtpstream_view_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, static void add_to_list_store(rtp_stream_info_t* strinfo) { - gchar label_text[256]; - gchar *data[NUM_COLS]; - guint32 expected; - gint32 lost; - double perc; - int i; - char *savelocale; - - /* save the current locale */ - savelocale = g_strdup(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(ep_address_to_display(&(strinfo->src_addr))); - data[1] = NULL; - data[2] = g_strdup(ep_address_to_display(&(strinfo->dest_addr))); - data[3] = NULL; - data[4] = g_strdup_printf("0x%X", strinfo->ssrc); - if (strinfo->info_payload_type_str != NULL) { - data[5] = g_strdup(strinfo->info_payload_type_str); - } else { - data[5] = g_strdup(val_to_str_ext(strinfo->pt, &rtp_payload_type_short_vals_ext, - "Unknown (%u)")); - } - data[6] = NULL; - - expected = (strinfo->rtp_stats.stop_seq_nr + strinfo->rtp_stats.cycles*65536) - - strinfo->rtp_stats.start_seq_nr + 1; - lost = expected - strinfo->rtp_stats.total_nr; - if (expected) { - perc = (double)(lost*100)/(double)expected; - } else { - perc = 0; - } - data[7] = g_strdup_printf("%d (%.1f%%)", lost, perc); - data[8] = NULL; - data[9] = NULL; - data[10] = NULL; - if (strinfo->problem) - data[11] = g_strdup("X"); - else - data[11] = g_strdup(""); - - /* restore previous locale setting */ - setlocale(LC_NUMERIC, savelocale); - g_free(savelocale); - - /* Acquire an iterator */ - gtk_list_store_append(list_store, &list_iter); - - /* Fill the new row */ - gtk_list_store_set(list_store, &list_iter, - RTP_COL_SRC_ADDR, data[0], - RTP_COL_SRC_PORT, strinfo->src_port, - RTP_COL_DST_ADDR, data[2], - RTP_COL_DST_PORT, strinfo->dest_port, - RTP_COL_SSRC, data[4], - RTP_COL_PAYLOAD, data[5], - RTP_COL_PACKETS, strinfo->npackets, - RTP_COL_LOST, data[7], - RTP_COL_MAX_DELTA, strinfo->rtp_stats.max_delta, - RTP_COL_MAX_JITTER, strinfo->rtp_stats.max_jitter, - RTP_COL_MEAN_JITTER, strinfo->rtp_stats.mean_jitter, - RTP_COL_PROBLEM, data[11], - RTP_COL_DATA, strinfo, - -1); - - for (i = 0; i < NUM_COLS-1; i++) - g_free(data[i]); - - /* Update the top label with the number of detected streams */ - g_snprintf(label_text, sizeof(label_text), - "Detected %d RTP streams. Choose one for forward and reverse direction for analysis", - ++streams_nb); - gtk_label_set_text(GTK_LABEL(top_label), label_text); + gchar label_text[256]; + gchar *data[NUM_COLS]; + guint32 expected; + gint32 lost; + double perc; + int i; + char *savelocale; + + /* save the current locale */ + savelocale = g_strdup(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(ep_address_to_display(&(strinfo->src_addr))); + data[1] = NULL; + data[2] = g_strdup(ep_address_to_display(&(strinfo->dest_addr))); + data[3] = NULL; + data[4] = g_strdup_printf("0x%X", strinfo->ssrc); + if (strinfo->info_payload_type_str != NULL) { + data[5] = g_strdup(strinfo->info_payload_type_str); + } else { + data[5] = g_strdup(val_to_str_ext(strinfo->pt, &rtp_payload_type_short_vals_ext, + "Unknown (%u)")); + } + data[6] = NULL; + + expected = (strinfo->rtp_stats.stop_seq_nr + strinfo->rtp_stats.cycles*65536) + - strinfo->rtp_stats.start_seq_nr + 1; + lost = expected - strinfo->rtp_stats.total_nr; + if (expected) { + perc = (double)(lost*100)/(double)expected; + } else { + perc = 0; + } + data[7] = g_strdup_printf("%d (%.1f%%)", lost, perc); + data[8] = NULL; + data[9] = NULL; + data[10] = NULL; + if (strinfo->problem) + data[11] = g_strdup("X"); + else + data[11] = g_strdup(""); + + /* restore previous locale setting */ + setlocale(LC_NUMERIC, savelocale); + g_free(savelocale); + + /* Acquire an iterator */ + gtk_list_store_append(list_store, &list_iter); + + /* Fill the new row */ + gtk_list_store_set(list_store, &list_iter, + RTP_COL_SRC_ADDR, data[0], + RTP_COL_SRC_PORT, strinfo->src_port, + RTP_COL_DST_ADDR, data[2], + RTP_COL_DST_PORT, strinfo->dest_port, + RTP_COL_SSRC, data[4], + RTP_COL_PAYLOAD, data[5], + RTP_COL_PACKETS, strinfo->npackets, + RTP_COL_LOST, data[7], + RTP_COL_MAX_DELTA, strinfo->rtp_stats.max_delta, + RTP_COL_MAX_JITTER, strinfo->rtp_stats.max_jitter, + RTP_COL_MEAN_JITTER, strinfo->rtp_stats.mean_jitter, + RTP_COL_PROBLEM, data[11], + RTP_COL_DATA, strinfo, + -1); + + for (i = 0; i < NUM_COLS-1; i++) + g_free(data[i]); + + /* Update the top label with the number of detected streams */ + g_snprintf(label_text, sizeof(label_text), + "Detected %d RTP streams. Choose one for forward and reverse direction for analysis", + ++streams_nb); + gtk_label_set_text(GTK_LABEL(top_label), label_text); } /****************************************************************************/ @@ -755,202 +755,202 @@ add_to_list_store(rtp_stream_info_t* strinfo) static void create_list_view(void) { - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - GtkTreeSortable *sortable; - GtkTreeView *list_view; - GtkTreeSelection *selection; - - /* Create the store */ - list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns */ - G_TYPE_STRING, /* Source address */ - G_TYPE_UINT, /* Source port */ - G_TYPE_STRING, /* Destination address */ - G_TYPE_UINT, /* Destination port */ - G_TYPE_STRING, /* SSRC */ - G_TYPE_STRING, /* Payload */ - G_TYPE_UINT, /* Packets */ - G_TYPE_STRING, /* Lost */ - G_TYPE_DOUBLE, /* Max. delta */ - G_TYPE_DOUBLE, /* Max. jitter */ - G_TYPE_DOUBLE, /* Mean jitter */ - G_TYPE_STRING, /* Problem */ - G_TYPE_POINTER /* Data */ - ); - - /* Create a view */ - list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); - - list_view = GTK_TREE_VIEW(list); - sortable = GTK_TREE_SORTABLE(list_store); - - /* Speed up the list display */ - gtk_tree_view_set_fixed_height_mode(list_view, TRUE); - - /* Setup the sortable columns */ - gtk_tree_sortable_set_sort_column_id(sortable, RTP_COL_SRC_ADDR, GTK_SORT_ASCENDING); - gtk_tree_view_set_headers_clickable(list_view, FALSE); - - /* The view now holds a reference. We can get rid of our own reference */ - g_object_unref(G_OBJECT(list_store)); - - /* - * Create the first column packet, associating the "text" attribute of the - * cell_renderer to the first column of the model - */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Src addr", renderer, - "text", RTP_COL_SRC_ADDR, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SRC_ADDR); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 100); - /* Add the column to the view. */ - gtk_tree_view_append_column(list_view, column); - - /* Source port */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Src port", renderer, - "text", RTP_COL_SRC_PORT, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SRC_PORT); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column(list_view, column); - - /* Destination address */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Dst addr", renderer, - "text", RTP_COL_DST_ADDR, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_DST_ADDR); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 100); - gtk_tree_view_append_column(list_view, column); - - /* Destination port */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Dst port", renderer, - "text", RTP_COL_DST_PORT, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_DST_PORT); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 80); - gtk_tree_view_append_column(list_view, column); - - /* SSRC */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("SSRC", renderer, - "text", RTP_COL_SSRC, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SSRC); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); - gtk_tree_view_column_set_fixed_width(column, 90); - gtk_tree_view_append_column(list_view, column); - - /* Payload */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Payload", renderer, - "text", RTP_COL_PAYLOAD, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PAYLOAD); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 80); - gtk_tree_view_column_set_fixed_width(column, 100); - gtk_tree_view_append_column(list_view, column); - - /* Packets */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Packets", renderer, - "text", RTP_COL_PACKETS, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PACKETS); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 70); - gtk_tree_view_append_column(list_view, column); - - /* Lost */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Lost", renderer, - "text", RTP_COL_LOST, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_LOST); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 60); - gtk_tree_view_column_set_fixed_width(column, 90); - gtk_tree_view_append_column(list_view, column); - - /* Max Delta (ms) */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Max Delta (ms)", renderer, - "text", RTP_COL_MAX_DELTA, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MAX_DELTA); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 90); - gtk_tree_view_column_set_fixed_width(column, 130); - gtk_tree_view_append_column(list_view, column); - - /* Max Jitter (ms) */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Max Jitter (ms)", renderer, - "text", RTP_COL_MAX_JITTER, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MAX_JITTER); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 50); - gtk_tree_view_column_set_fixed_width(column, 120); - gtk_tree_view_append_column(list_view, column); - - /* Mean Jitter (ms) */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Mean Jitter (ms)", renderer, - "text", RTP_COL_MEAN_JITTER, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MEAN_JITTER); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 50); - gtk_tree_view_column_set_fixed_width(column, 130); - gtk_tree_view_append_column(list_view, column); - - /* Problems? */ - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Pb?", renderer, - "text", RTP_COL_PROBLEM, - NULL); - gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PROBLEM); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 30); - gtk_tree_view_column_set_fixed_width(column, 50); - gtk_tree_view_append_column(list_view, column); - - /* Now enable the sorting of each column */ - gtk_tree_view_set_rules_hint(list_view, TRUE); - gtk_tree_view_set_headers_clickable(list_view, TRUE); - - /* Setup the selection handler */ - selection = gtk_tree_view_get_selection(list_view); - - gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); - gtk_tree_selection_set_select_function(selection, rtpstream_view_selection_func, NULL, NULL); + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + GtkTreeSortable *sortable; + GtkTreeView *list_view; + GtkTreeSelection *selection; + + /* Create the store */ + list_store = gtk_list_store_new(NUM_COLS, /* Total number of columns */ + G_TYPE_STRING, /* Source address */ + G_TYPE_UINT, /* Source port */ + G_TYPE_STRING, /* Destination address */ + G_TYPE_UINT, /* Destination port */ + G_TYPE_STRING, /* SSRC */ + G_TYPE_STRING, /* Payload */ + G_TYPE_UINT, /* Packets */ + G_TYPE_STRING, /* Lost */ + G_TYPE_DOUBLE, /* Max. delta */ + G_TYPE_DOUBLE, /* Max. jitter */ + G_TYPE_DOUBLE, /* Mean jitter */ + G_TYPE_STRING, /* Problem */ + G_TYPE_POINTER /* Data */ + ); + + /* Create a view */ + list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); + + list_view = GTK_TREE_VIEW(list); + sortable = GTK_TREE_SORTABLE(list_store); + + /* Speed up the list display */ + gtk_tree_view_set_fixed_height_mode(list_view, TRUE); + + /* Setup the sortable columns */ + gtk_tree_sortable_set_sort_column_id(sortable, RTP_COL_SRC_ADDR, GTK_SORT_ASCENDING); + gtk_tree_view_set_headers_clickable(list_view, FALSE); + + /* The view now holds a reference. We can get rid of our own reference */ + g_object_unref(G_OBJECT(list_store)); + + /* + * Create the first column packet, associating the "text" attribute of the + * cell_renderer to the first column of the model + */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Src addr", renderer, + "text", RTP_COL_SRC_ADDR, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SRC_ADDR); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 100); + /* Add the column to the view. */ + gtk_tree_view_append_column(list_view, column); + + /* Source port */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Src port", renderer, + "text", RTP_COL_SRC_PORT, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SRC_PORT); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* Destination address */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Dst addr", renderer, + "text", RTP_COL_DST_ADDR, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_DST_ADDR); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 100); + gtk_tree_view_append_column(list_view, column); + + /* Destination port */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Dst port", renderer, + "text", RTP_COL_DST_PORT, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_DST_PORT); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 80); + gtk_tree_view_append_column(list_view, column); + + /* SSRC */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("SSRC", renderer, + "text", RTP_COL_SSRC, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_SSRC); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_fixed_width(column, 90); + gtk_tree_view_append_column(list_view, column); + + /* Payload */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Payload", renderer, + "text", RTP_COL_PAYLOAD, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PAYLOAD); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 80); + gtk_tree_view_column_set_fixed_width(column, 100); + gtk_tree_view_append_column(list_view, column); + + /* Packets */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Packets", renderer, + "text", RTP_COL_PACKETS, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PACKETS); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 70); + gtk_tree_view_append_column(list_view, column); + + /* Lost */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Lost", renderer, + "text", RTP_COL_LOST, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_LOST); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 60); + gtk_tree_view_column_set_fixed_width(column, 90); + gtk_tree_view_append_column(list_view, column); + + /* Max Delta (ms) */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Max Delta (ms)", renderer, + "text", RTP_COL_MAX_DELTA, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MAX_DELTA); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 90); + gtk_tree_view_column_set_fixed_width(column, 130); + gtk_tree_view_append_column(list_view, column); + + /* Max Jitter (ms) */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Max Jitter (ms)", renderer, + "text", RTP_COL_MAX_JITTER, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MAX_JITTER); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 50); + gtk_tree_view_column_set_fixed_width(column, 120); + gtk_tree_view_append_column(list_view, column); + + /* Mean Jitter (ms) */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Mean Jitter (ms)", renderer, + "text", RTP_COL_MEAN_JITTER, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_MEAN_JITTER); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 50); + gtk_tree_view_column_set_fixed_width(column, 130); + gtk_tree_view_append_column(list_view, column); + + /* Problems? */ + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Pb?", renderer, + "text", RTP_COL_PROBLEM, + NULL); + gtk_tree_view_column_set_sort_column_id(column, RTP_COL_PROBLEM); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 30); + gtk_tree_view_column_set_fixed_width(column, 50); + gtk_tree_view_append_column(list_view, column); + + /* Now enable the sorting of each column */ + gtk_tree_view_set_rules_hint(list_view, TRUE); + gtk_tree_view_set_headers_clickable(list_view, TRUE); + + /* Setup the selection handler */ + selection = gtk_tree_view_get_selection(list_view); + + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + gtk_tree_selection_set_select_function(selection, rtpstream_view_selection_func, NULL, NULL); } @@ -1068,7 +1068,7 @@ rtpstream_dlg_create (void) /****************************************************************************/ -/* PUBLIC */ +/* PUBLIC */ /****************************************************************************/ /****************************************************************************/ @@ -1076,21 +1076,21 @@ rtpstream_dlg_create (void) /* list: pointer to list of rtp_stream_info_t* */ void rtpstream_dlg_update(GList *list_lcl) { - if (rtp_stream_dlg != NULL) { - gtk_list_store_clear(list_store); - streams_nb = 0; + if (rtp_stream_dlg != NULL) { + gtk_list_store_clear(list_store); + streams_nb = 0; - list_lcl = g_list_first(list_lcl); - while (list_lcl) - { - add_to_list_store((rtp_stream_info_t*)(list_lcl->data)); - list_lcl = g_list_next(list_lcl); - } + list_lcl = g_list_first(list_lcl); + while (list_lcl) + { + add_to_list_store((rtp_stream_info_t*)(list_lcl->data)); + list_lcl = g_list_next(list_lcl); + } - rtpstream_on_unselect(NULL, NULL); - } + rtpstream_on_unselect(NULL, NULL); + } - last_list = list_lcl; + last_list = list_lcl; } @@ -1099,19 +1099,19 @@ void rtpstream_dlg_update(GList *list_lcl) /* list: pointer to list of rtp_stream_info_t* */ void rtpstream_dlg_show(GList *list_lcl) { - if (rtp_stream_dlg != NULL) { - /* There's already a dialog box; reactivate it. */ - reactivate_window(rtp_stream_dlg); - /* Another list since last call? */ - if (list_lcl != last_list) { - rtpstream_dlg_update(list_lcl); - } - } - else { - /* Create and show the dialog box */ - rtpstream_dlg_create(); - rtpstream_dlg_update(list_lcl); - } + if (rtp_stream_dlg != NULL) { + /* There's already a dialog box; reactivate it. */ + reactivate_window(rtp_stream_dlg); + /* Another list since last call? */ + if (list_lcl != last_list) { + rtpstream_dlg_update(list_lcl); + } + } + else { + /* Create and show the dialog box */ + rtpstream_dlg_create(); + rtpstream_dlg_update(list_lcl); + } } @@ -1119,16 +1119,16 @@ void rtpstream_dlg_show(GList *list_lcl) /* entry point when called via the GTK menu */ void rtpstream_launch(GtkAction *action _U_, gpointer user_data _U_) { - /* Register the tap listener */ - register_tap_listener_rtp_stream(); + /* Register the tap listener */ + register_tap_listener_rtp_stream(); - /* Scan for RTP streams (redissect all packets) */ - rtpstream_scan(); + /* Scan for RTP streams (redissect all packets) */ + rtpstream_scan(); - /* Show the dialog box with the list of streams */ - rtpstream_dlg_show(rtpstream_get_info()->strinfo_list); + /* Show the dialog box with the list of streams */ + rtpstream_dlg_show(rtpstream_get_info()->strinfo_list); - /* Tap listener will be removed and cleaned up in rtpstream_on_destroy */ + /* Tap listener will be removed and cleaned up in rtpstream_on_destroy */ } /****************************************************************************/ @@ -1143,9 +1143,9 @@ register_tap_listener_rtp_stream_dlg(void) * Local variables: * c-basic-offset: 4 * tab-width: 8 - * indent-tabs-mode: t + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=4 tabstop=8 noexpandtab: - * :indentSize=4:tabSize=8:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ -- cgit v1.2.3