aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/export_object.c12
-rw-r--r--gtk/export_object.h11
-rw-r--r--gtk/export_object_dicom.c2
-rw-r--r--gtk/export_object_http.c2
-rw-r--r--gtk/export_object_smb.c45
5 files changed, 33 insertions, 39 deletions
diff --git a/gtk/export_object.c b/gtk/export_object.c
index b852de57f0..f013a97c43 100644
--- a/gtk/export_object.c
+++ b/gtk/export_object.c
@@ -64,6 +64,8 @@ enum {
EO_NUM_COLUMNS /* must be last */
};
+static eo_protocoldata_reset_cb eo_protocoldata_reset = NULL;
+
static void
eo_remember_this_row(GtkTreeModel *model _U_, GtkTreePath *path,
@@ -121,6 +123,9 @@ eo_win_destroy_cb(GtkWindow *win _U_, gpointer data)
/* Free the GSList elements */
g_slist_free(object_list->entries);
g_free(object_list);
+
+ /* Free the private export_object_xxx data */
+ if (eo_protocoldata_reset != NULL) eo_protocoldata_reset();
}
static gboolean
@@ -350,6 +355,8 @@ eo_reset(void *tapdata)
object_list->entries = NULL;
object_list->iter = NULL;
object_list->row_selected = -1;
+
+ if (eo_protocoldata_reset != NULL) eo_protocoldata_reset();
}
static void
@@ -386,7 +393,7 @@ eo_draw(void *tapdata)
}
void
-export_object_window(const gchar *tapname, const gchar *name, tap_packet_cb tap_packet)
+export_object_window(const gchar *tapname, const gchar *name, tap_packet_cb tap_packet, eo_protocoldata_reset_cb eo_protocoldata_resetfn)
{
GtkWidget *sw;
GtkCellRenderer *renderer;
@@ -398,6 +405,9 @@ export_object_window(const gchar *tapname, const gchar *name, tap_packet_cb tap_
export_object_list_t *object_list;
gchar *window_title;
+ /* Initialize the pointer to the private data clearing function */
+ eo_protocoldata_reset = eo_protocoldata_resetfn;
+
/* Initialize our object list structure */
object_list = g_malloc0(sizeof(export_object_list_t));
diff --git a/gtk/export_object.h b/gtk/export_object.h
index f1e6e873aa..eba4cdd175 100644
--- a/gtk/export_object.h
+++ b/gtk/export_object.h
@@ -48,8 +48,17 @@ typedef struct _export_object_entry_t {
guint8 *payload_data;
} export_object_entry_t;
+/* When a protocol needs intermediate data structures to construct the
+export objects, then it must specifiy a function that cleans up all
+those data structures. This function is passed to export_object_window
+and called when tap reset or windows closes occurs. If no function is needed
+a NULL value should be passed instead */
+typedef void (*eo_protocoldata_reset_cb)();
+
+
void export_object_window(const gchar *tapname, const gchar *name,
- tap_packet_cb tap_packet);
+ tap_packet_cb tap_packet,
+ eo_protocoldata_reset_cb eo_protocoldata_resetfn);
/* Protocol specific */
void eo_http_cb(GtkWidget *widget _U_, gpointer data _U_);
diff --git a/gtk/export_object_dicom.c b/gtk/export_object_dicom.c
index b060c5f405..c9acc48a80 100644
--- a/gtk/export_object_dicom.c
+++ b/gtk/export_object_dicom.c
@@ -74,5 +74,5 @@ eo_dicom_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_,
void
eo_dicom_cb(GtkWidget *widget _U_, gpointer data _U_)
{
- export_object_window("dicom_eo", "DICOM", eo_dicom_packet);
+ export_object_window("dicom_eo", "DICOM", eo_dicom_packet, NULL);
}
diff --git a/gtk/export_object_http.c b/gtk/export_object_http.c
index 50a971b998..9ad82a3ba4 100644
--- a/gtk/export_object_http.c
+++ b/gtk/export_object_http.c
@@ -71,5 +71,5 @@ eo_http_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_,
void
eo_http_cb(GtkWidget *widget _U_, gpointer data _U_)
{
- export_object_window("http_eo", "HTTP", eo_http_packet);
+ export_object_window("http_eo", "HTTP", eo_http_packet, NULL);
}
diff --git a/gtk/export_object_smb.c b/gtk/export_object_smb.c
index 800aa58b38..e2795c6f99 100644
--- a/gtk/export_object_smb.c
+++ b/gtk/export_object_smb.c
@@ -79,10 +79,6 @@ typedef struct _active_file {
/* This is the GSList that will contain all the files that we are tracking */
static GSList *GSL_active_files = NULL;
-/* This is the hash table that will contain the frame numbers of the packets already processed.
- We want to process each smb packet only once */
-static GHashTable *visited_packet_hash_table = NULL;
-
/* We define a free chunk in a file as an start offset and end offset
Consider a free chunk as a "hole" in a file that we are capturing */
typedef struct _free_chunk {
@@ -310,25 +306,6 @@ eo_smb_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, const
gchar **aux_string_v;
-
- if (eo_info == NULL) { /* XXX: Can this happen ? */
- return FALSE; /* State unchanged - no window updates needed */
- }
-
- /* Obtain the packet number that originates the analysis */
- #ifdef SMB_DEBUG
- printf("\tbtree_visited_packet: Looking for packet %u\n",pinfo->fd-num);
- #endif
-
- if (g_hash_table_lookup(visited_packet_hash_table, GUINT_TO_POINTER(pinfo->fd->num)) != NULL) {
- return FALSE; /* already seen: State unchanged - no window updates needed */
- }
-
- /* remember that we've seen this packet */
- /* XXX: TBD: Is this needed ? */
- /* Under what circumstances will a packet be encountered twice ? */
- g_hash_table_insert(visited_packet_hash_table, GUINT_TO_POINTER(pinfo->fd->num), GUINT_TO_POINTER(1));
-
/* Is this an eo_smb supported file_type? (right now we only support FILE */
is_supported_filetype = (eo_info->fid_type==SMB_FID_TYPE_FILE);
@@ -352,7 +329,6 @@ eo_smb_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, const
active_row=find_incoming_file(GSL_active_files, &incoming_file);
if (active_row==-1) { /* This is a new-tracked file */
-
/* Construct the entry in the list of active files */
entry = g_malloc(sizeof(export_object_entry_t));
entry->payload_data=NULL;
@@ -439,9 +415,11 @@ eo_smb_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, const
return TRUE; /* State changed - window should be redrawn */
}
-
+/* This is the eo_protocoldata_reset function that is used in the export_object module
+ to cleanup any previous private data of the export object functionality before perform
+ the eo_reset function or when the window closes */
void
-eo_smb_cb(GtkWidget *widget _U_, gpointer data _U_)
+eo_smb_cleanup()
{
int i,last;
active_file *in_list_file;
@@ -461,14 +439,11 @@ eo_smb_cb(GtkWidget *widget _U_, gpointer data _U_)
g_slist_free(GSL_active_files);
GSL_active_files=NULL;
}
+}
- /* Initialize the tree */
- if (visited_packet_hash_table) {
- g_hash_table_destroy(visited_packet_hash_table);
- visited_packet_hash_table=NULL;
- }
- visited_packet_hash_table=g_hash_table_new(NULL,NULL);
-
- /* Then call the export_object window */
- export_object_window("smb_eo", "SMB", eo_smb_packet);
+void
+eo_smb_cb(GtkWidget *widget _U_, gpointer data _U_)
+{
+ /* Call the export_object window */
+ export_object_window("smb_eo", "SMB", eo_smb_packet, eo_smb_cleanup);
}