}
static void
-unref_GPtrArray_value(gpointer key, gpointer value _U_, gpointer user_data _U_)
+free_GPtrArray_value(gpointer key, gpointer value, gpointer user_data _U_)
{
+ GPtrArray *ptrs = value;
gint hfid = (gint)(long)key;
header_field_info *hfinfo;
}
hfinfo->ref_type = HF_REF_TYPE_NONE;
}
-}
-
-static void
-free_GPtrArray_value(gpointer value)
-{
- GPtrArray *ptrs = value;
g_ptr_array_free(ptrs, TRUE);
}
if (tree_data->interesting_hfids) {
/* Free all the GPtrArray's in the interesting_hfids hash. */
g_hash_table_foreach(tree_data->interesting_hfids,
- unref_GPtrArray_value, NULL);
+ free_GPtrArray_value, NULL);
/* And then destroy the hash. */
g_hash_table_destroy(tree_data->interesting_hfids);
free_node_tree_data(tree_data);
}
-void
-proto_tree_reset(proto_tree *tree)
-{
- tree_data_t *tree_data = PTREE_DATA(tree);
-
- proto_tree_children_foreach(tree, proto_tree_free_node, NULL);
-
- /* reset tree */
- tree->parent = NULL;
- tree->first_child = NULL;
- tree->last_child = NULL;
- tree->next = NULL;
- PNODE_FINFO(tree) = NULL;
-
- /* reset tree_data */
- if (tree_data->interesting_hfids) {
- g_hash_table_destroy(tree_data->interesting_hfids);
- tree_data->interesting_hfids = NULL;
- }
- tree_data->count = 0;
-}
-
/* Is the parsing being done for a visible proto_tree or an invisible one?
* By setting this correctly, the proto_tree creation is sped up by not
* having to call g_vsnprintf and copy strings around.
if (PTREE_DATA(tree)->interesting_hfids == NULL) {
/* Initialize the hash because we now know that it is needed */
PTREE_DATA(tree)->interesting_hfids =
- g_hash_table_new_full(g_direct_hash, NULL /* g_direct_equal */, NULL, free_GPtrArray_value);
+ g_hash_table_new(g_direct_hash, NULL /* g_direct_equal */);
}
ptrs = g_hash_table_lookup(PTREE_DATA(tree)->interesting_hfids,
static void cf_reset_state(capture_file *cf);
static int read_packet(capture_file *cf, dfilter_t *dfcode,
- epan_dissect_t *edt, column_info *cinfo, gint64 offset);
+ gboolean create_proto_tree, column_info *cinfo, gint64 offset);
static void rescan_packets(capture_file *cf, const char *action, const char *action_item, gboolean redissect);
return progbar_val;
}
-static void
-epan_dissect_finish(epan_dissect_t *edt)
-{
- if (edt->tree)
- proto_tree_free(edt->tree);
-}
-
cf_read_status_t
cf_read(capture_file *cf, gboolean reloading)
{
gboolean stop_flag;
GTimeVal start_time;
dfilter_t *dfcode;
- epan_dissect_t edt;
gboolean create_proto_tree;
guint tap_flags;
gboolean compiled;
tap_flags = union_of_tap_listener_flags();
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
- epan_dissect_init(&edt, create_proto_tree, FALSE);
- if (dfcode != NULL)
- epan_dissect_prime_dfilter(&edt, dfcode);
reset_tap_listeners();
hours even on fast machines) just to see that it was the wrong file. */
break;
}
- read_packet(cf, dfcode, &edt, cinfo, data_offset);
+ read_packet(cf, dfcode, create_proto_tree, cinfo, data_offset);
}
}
CATCH(OutOfMemoryError) {
#endif
}
ENDTRY;
- epan_dissect_finish(&edt);
/* Free the display name */
g_free(name_ptr);
gchar *err_info;
int newly_displayed_packets = 0;
dfilter_t *dfcode;
- epan_dissect_t edt;
gboolean create_proto_tree;
guint tap_flags;
gboolean compiled;
tap_flags = union_of_tap_listener_flags();
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
- epan_dissect_init(&edt, create_proto_tree, FALSE);
- if (dfcode != NULL)
- epan_dissect_prime_dfilter(&edt, dfcode);
*err = 0;
aren't any packets left to read) exit. */
break;
}
- if (read_packet(cf, dfcode, &edt, (column_info *) cinfo, data_offset) != -1) {
+ if (read_packet(cf, dfcode, create_proto_tree, (column_info *) cinfo, data_offset) != -1) {
newly_displayed_packets++;
}
to_read--;
#endif
}
ENDTRY;
- epan_dissect_finish(&edt);
/* Update the file encapsulation; it might have changed based on the
packets we've read. */
dfilter_t *dfcode;
column_info *cinfo;
gboolean create_proto_tree;
- epan_dissect_t edt;
guint tap_flags;
gboolean compiled;
cinfo = (tap_flags & TL_REQUIRES_COLUMNS) ? &cf->cinfo : NULL;
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
- epan_dissect_init(&edt, create_proto_tree, FALSE);
- if (dfcode != NULL)
- epan_dissect_prime_dfilter(&edt, dfcode);
if (cf->wth == NULL) {
cf_close(cf);
aren't any packets left to read) exit. */
break;
}
- read_packet(cf, dfcode, &edt, cinfo, data_offset);
+ read_packet(cf, dfcode, create_proto_tree, cinfo, data_offset);
}
- epan_dissect_finish(&edt);
/* Cleanup and release all dfilter resources */
if (dfcode != NULL) {
static int
add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
- dfilter_t *dfcode, epan_dissect_t *edt, column_info *cinfo,
+ dfilter_t *dfcode, gboolean create_proto_tree, column_info *cinfo,
struct wtap_pkthdr *phdr, const guchar *buf,
gboolean add_to_packet_list)
{
- gint row = -1;
+ epan_dissect_t edt;
+ gint row = -1;
frame_data_set_before_dissect(fdata, &cf->elapsed_time,
&first_ts, prev_dis, prev_cap);
prev_cap = fdata;
- epan_dissect_run_with_taps(edt, phdr, buf, fdata, cinfo);
+ /* Dissect the frame. */
+ epan_dissect_init(&edt, create_proto_tree, FALSE);
+
+ if (dfcode != NULL) {
+ epan_dissect_prime_dfilter(&edt, dfcode);
+ }
+
+ epan_dissect_run_with_taps(&edt, phdr, buf, fdata, cinfo);
/* If we don't have a display filter, set "passed_dfilter" to 1. */
if (dfcode != NULL) {
- fdata->flags.passed_dfilter = dfilter_apply_edt(dfcode, edt) ? 1 : 0;
+ fdata->flags.passed_dfilter = dfilter_apply_edt(dfcode, &edt) ? 1 : 0;
if (fdata->flags.passed_dfilter) {
/* This frame passed the display filter but it may depend on other
* (potentially not displayed) frames. Find those frames and mark them
* as depended upon.
*/
- g_slist_foreach(edt->pi.dependent_frames, find_and_mark_frame_depended_upon, cf);
+ g_slist_foreach(edt.pi.dependent_frames, find_and_mark_frame_depended_upon, cf);
}
} else
fdata->flags.passed_dfilter = 1;
if (add_to_packet_list) {
/* We fill the needed columns from new_packet_list */
- row = packet_list_append(cinfo, fdata, &edt->pi);
+ row = packet_list_append(cinfo, fdata, &edt.pi);
}
if (fdata->flags.passed_dfilter || fdata->flags.ref_time)
cf->last_displayed = fdata->num;
}
- epan_dissect_reset(edt);
+ epan_dissect_cleanup(&edt);
return row;
}
/* returns the row of the new packet in the packet list or -1 if not displayed */
static int
read_packet(capture_file *cf, dfilter_t *dfcode,
- epan_dissect_t *edt, column_info *cinfo, gint64 offset)
+ gboolean create_proto_tree, column_info *cinfo, gint64 offset)
{
struct wtap_pkthdr *phdr = wtap_phdr(cf->wth);
const guchar *buf = wtap_buf_ptr(cf->wth);
if (!cf->redissecting) {
row = add_packet_to_packet_list(fdata, cf, dfcode,
- edt, cinfo,
+ create_proto_tree, cinfo,
phdr, buf, TRUE);
}
}
int progbar_quantum;
dfilter_t *dfcode;
column_info *cinfo;
- epan_dissect_t edt;
gboolean create_proto_tree;
guint tap_flags;
gboolean add_to_packet_list = FALSE;
cinfo = (tap_flags & TL_REQUIRES_COLUMNS) ? &cf->cinfo : NULL;
create_proto_tree =
(dfcode != NULL || have_filtering_tap_listeners() || (tap_flags & TL_REQUIRES_PROTO_TREE));
- epan_dissect_init(&edt, create_proto_tree, FALSE);
- if (dfcode != NULL)
- epan_dissect_prime_dfilter(&edt, dfcode);
reset_tap_listeners();
/* Which frame, if any, is the currently selected frame?
preceding_frame_num = prev_frame_num;
preceding_frame = prev_frame;
}
- add_packet_to_packet_list(fdata, cf, dfcode, &edt,
+ add_packet_to_packet_list(fdata, cf, dfcode, create_proto_tree,
cinfo, &cf->phdr, cf->pd,
add_to_packet_list);
prev_frame_num = fdata->num;
prev_frame = fdata;
}
- epan_dissect_finish(&edt);
/* We are done redissecting the packet list. */
cf->redissecting = FALSE;