/* Print a tree's data, and any child nodes. */ static void proto_tree_print_node(proto_node *node, gpointer data) { field_info *fi = PNODE_FINFO(node); print_data *pdata = (print_data*) data; const guint8 *pd; gchar label_str[ITEM_LABEL_LENGTH]; gchar *label_ptr; __android_log_print(ANDROID_LOG_INFO, "libtshark", "in proto_tree_print_node !"); g_assert(fi && "dissection with an invisible proto tree?"); /* Don't print invisible entries. */ if (PROTO_ITEM_IS_HIDDEN(node)) return; __android_log_print(ANDROID_LOG_INFO, "libtshark", "the proto tree is not invisible"); /* Give up if we've already gotten an error. */ if (!pdata->success) return; __android_log_print(ANDROID_LOG_INFO, "libtshark", "success so far"); /* was a free format label produced? */ if (fi->rep) { label_ptr = fi->rep->representation; __android_log_print(ANDROID_LOG_INFO, "libtshark", "free format"); } else { /* no, make a generic label */ __android_log_print(ANDROID_LOG_INFO, "libtshark", "generic label"); label_ptr = label_str; proto_item_fill_label(fi, label_str); } __android_log_print(ANDROID_LOG_INFO, "libtshark", "A-OK"); if (PROTO_ITEM_IS_GENERATED(node)) { label_ptr = g_strdup_printf("[%s]", label_ptr); } __android_log_print(ANDROID_LOG_INFO, "libtshark", "proto was generated"); //if (!print_line(pdata->stream, pdata->level, label_ptr)) { // pdata->success = FALSE; // return; //} __android_log_print(ANDROID_LOG_INFO, "libtshark", "line: %s", label_ptr); __android_log_print(ANDROID_LOG_INFO, "libtshark", "line is printed"); if (PROTO_ITEM_IS_GENERATED(node)) { g_free(label_ptr); } __android_log_print(ANDROID_LOG_INFO, "libtshark", "item is generated"); /* If it's uninterpreted data, dump it (unless our caller will be printing the entire packet in hex). */ if (fi->hfinfo->id == proto_data && pdata->print_hex_for_data) { /* * Find the data for this field. */ pd = get_field_data(pdata->src_list, fi); __android_log_print(ANDROID_LOG_INFO, "libtshark", "uninterpreted"); if (pd) { if (!print_hex_data_buffer(pdata->stream, pd, fi->length, pdata->encoding)) { pdata->success = FALSE; return; } } } __android_log_print(ANDROID_LOG_INFO, "libtshark", "getting ready to traverse all subtrees"); /* If we're printing all levels, or if this node is one with a subtree and its subtree is expanded, recurse into the subtree, if it exists. */ g_assert(fi->tree_type >= -1 && fi->tree_type < num_tree_types); __android_log_print(ANDROID_LOG_INFO, "libtshark", "passed the assert"); if (pdata->print_dissections == print_dissections_expanded || (pdata->print_dissections == print_dissections_as_displayed && fi->tree_type >= 0 && tree_is_expanded[fi->tree_type])) { __android_log_print(ANDROID_LOG_INFO, "libtshark", "made it in"); if (node->first_child != NULL) { __android_log_print(ANDROID_LOG_INFO, "libtshark", "and we're about to level up"); pdata->level++; __android_log_print(ANDROID_LOG_INFO, "libtshark", "for each child..."); proto_tree_children_foreach(node, proto_tree_print_node, pdata); pdata->level--; if (!pdata->success) return; } } }
/* Print a tree's data, and any child nodes. */ static void proto_tree_print_node(proto_node *node, gpointer data) { field_info *fi = PNODE_FINFO(node); print_data *pdata = (print_data*) data; const guint8 *pd; gchar label_str[ITEM_LABEL_LENGTH]; gchar *label_ptr; /* dissection with an invisible proto tree? */ g_assert(fi); /* Don't print invisible entries. */ if (PROTO_ITEM_IS_HIDDEN(node)) return; /* Give up if we've already gotten an error. */ if (!pdata->success) return; /* was a free format label produced? */ if (fi->rep) { label_ptr = fi->rep->representation; } else { /* no, make a generic label */ label_ptr = label_str; proto_item_fill_label(fi, label_str); } if (PROTO_ITEM_IS_GENERATED(node)) { label_ptr = g_strdup_printf("[%s]", label_ptr); } if (!print_line(pdata->stream, pdata->level, label_ptr)) { pdata->success = FALSE; return; } /* * If -O is specified, only display the protocols which are in the * lookup table. Only check on the first level: once we start printing * a tree, print the rest of the subtree. Otherwise we won't print * subitems whose abbreviation doesn't match the protocol--for example * text items (whose abbreviation is simply "text"). */ if (output_only_tables != NULL && pdata->level == 0 && g_hash_table_lookup(output_only_tables, fi->hfinfo->abbrev) == NULL) { pdata->success = TRUE; return; } if (PROTO_ITEM_IS_GENERATED(node)) { g_free(label_ptr); } /* If it's uninterpreted data, dump it (unless our caller will be printing the entire packet in hex). */ if (fi->hfinfo->id == proto_data && pdata->print_hex_for_data) { /* * Find the data for this field. */ pd = get_field_data(pdata->src_list, fi); if (pd) { if (!print_line(pdata->stream, 0, "")) { pdata->success = FALSE; return; } if (!print_hex_data_buffer(pdata->stream, pd, fi->length, pdata->encoding)) { pdata->success = FALSE; return; } } } /* If we're printing all levels, or if this node is one with a subtree and its subtree is expanded, recurse into the subtree, if it exists. */ g_assert(fi->tree_type >= -1 && fi->tree_type < num_tree_types); if (pdata->print_dissections == print_dissections_expanded || (pdata->print_dissections == print_dissections_as_displayed && fi->tree_type >= 0 && tree_is_expanded[fi->tree_type])) { if (node->first_child != NULL) { pdata->level++; proto_tree_children_foreach(node, proto_tree_print_node, pdata); pdata->level--; if (!pdata->success) return; } } }