Now that WinPcap is a DLL, I can load it at run-time rather than load-time.
[obnox/wireshark/wip.git] / file.c
diff --git a/file.c b/file.c
index e2717da15c211570ac499cb88b393bc84c2106c2..ff5527c1f960e0641a3b79423bb96ffeeff5839a 100644 (file)
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
 /* file.c
  * File I/O routines
  *
- * $Id: file.c,v 1.226 2000/11/19 08:53:53 guy Exp $
+ * $Id: file.c,v 1.235 2001/03/24 02:14:54 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -72,6 +72,8 @@
 #include <epan.h>
 
 #include "gtk/main.h"
+#include "color.h"
+#include "gtk/color_utils.h"
 #include "column.h"
 #include "packet.h"
 #include "print.h"
 #include "menu.h"
 #include "util.h"
 #include "simple_dialog.h"
+#include "progress_dlg.h"
 #include "ui_util.h"
 #include "prefs.h"
 #include "gtk/proto_draw.h"
-#include "dfilter.h"
+#include "gtk/packet_win.h"
+#include "dfilter/dfilter.h"
 #include "conversation.h"
 #include "globals.h"
 #include "gtk/colors.h"
 
-#include "plugins.h"
-
-extern GtkWidget *packet_list, *info_bar, *byte_view, *tree_view;
+extern GtkWidget *packet_list, *info_bar, *byte_nb_ptr, *tree_view;
 extern guint      file_ctx;
 
 gboolean auto_scroll_live = FALSE;
@@ -170,6 +172,7 @@ open_cap_file(char *fname, gboolean is_tempfile, capture_file *cf)
 
   cf->cd_t      = wtap_file_type(cf->wth);
   cf->count     = 0;
+  cf->drops_known = FALSE;
   cf->drops     = 0;
   cf->esec      = 0;
   cf->eusec     = 0;
@@ -224,7 +227,7 @@ close_cap_file(capture_file *cf, void *w)
     cf->plist_chunk = NULL;
   }
   if (cf->rfcode != NULL) {
-    dfilter_destroy(cf->rfcode);
+    dfilter_free(cf->rfcode);
     cf->rfcode = NULL;
   }
   cf->plist = NULL;
@@ -265,7 +268,8 @@ set_display_filename(capture_file *cf)
 {
   gchar  *name_ptr;
   size_t  msg_len;
-  gchar  *done_fmt = " File: %s  Drops: %u";
+  static const gchar done_fmt_nodrops[] = " File: %s";
+  static const gchar done_fmt_drops[] = " File: %s  Drops: %u";
   gchar  *done_msg;
   gchar  *win_name_fmt = "%s - Ethereal";
   gchar  *win_name;
@@ -280,9 +284,15 @@ set_display_filename(capture_file *cf)
     name_ptr = "<capture>";
   }
 
-  msg_len = strlen(name_ptr) + strlen(done_fmt) + 64;
-  done_msg = g_malloc(msg_len);
-  snprintf(done_msg, msg_len, done_fmt, name_ptr, cf->drops);
+  if (cf->drops_known) {
+    msg_len = strlen(name_ptr) + strlen(done_fmt_drops) + 64;
+    done_msg = g_malloc(msg_len);
+    snprintf(done_msg, msg_len, done_fmt_drops, name_ptr, cf->drops);
+  } else {
+    msg_len = strlen(name_ptr) + strlen(done_fmt_nodrops);
+    done_msg = g_malloc(msg_len);
+    snprintf(done_msg, msg_len, done_fmt_nodrops, name_ptr);
+  }
   gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, done_msg);
   g_free(done_msg);
 
@@ -575,9 +585,7 @@ finish_tail_cap_file(capture_file *cf, int *err)
 
 typedef struct {
   color_filter_t *colorf;
-  proto_tree   *protocol_tree;
-  const guint8 *pd;
-  frame_data   *fdata;
+  epan_dissect_t *edt;
 } apply_color_filter_args;
 
 /*
@@ -592,7 +600,7 @@ apply_color_filter(gpointer filter_arg, gpointer argp)
   apply_color_filter_args *args = argp;
 
   if (colorf->c_colorfilter != NULL && args->colorf == NULL) {
-    if (dfilter_apply(colorf->c_colorfilter, args->protocol_tree, args->pd, args->fdata->cap_len))
+    if (dfilter_apply_edt(colorf->c_colorfilter, args->edt))
       args->colorf = colorf;
   }
 }
@@ -606,6 +614,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
   gint          i, row;
   proto_tree   *protocol_tree = NULL;
   epan_dissect_t *edt;
+  GdkColor      fg, bg;
 
   /* We don't yet have a color filter to apply. */
   args.colorf = NULL;
@@ -630,16 +639,10 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
 
        we have a list of color filters;
 
-       we have plugins to apply;
-
      allocate a protocol tree root node, so that we'll construct
      a protocol tree against which a filter expression can be
      evaluated. */
-  if ((cf->dfcode != NULL && refilter) || filter_list != NULL
-#ifdef HAVE_PLUGINS
-       || enabled_plugins_number > 0
-#endif
-       )
+  if ((cf->dfcode != NULL && refilter) || filter_list != NULL)
     protocol_tree = proto_tree_create_root();
 
   /* Dissect the frame. */
@@ -652,7 +655,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
   if (cf->dfcode != NULL) {
     if (refilter) {
       if (cf->dfcode != NULL)
-        fdata->flags.passed_dfilter = dfilter_apply(cf->dfcode, protocol_tree, buf, fdata->cap_len) ? 1 : 0;
+        fdata->flags.passed_dfilter = dfilter_apply_edt(cf->dfcode, edt) ? 1 : 0;
       else
         fdata->flags.passed_dfilter = 1;
     }
@@ -663,9 +666,7 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
      the color filters. */
   if (fdata->flags.passed_dfilter) {
     if (filter_list != NULL) {
-      args.protocol_tree = protocol_tree;
-      args.pd = buf;
-      args.fdata = fdata;
+      args.edt = edt;
       g_slist_foreach(filter_list, apply_color_filter, &args);
     }
   }
@@ -734,17 +735,17 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf,
     gtk_clist_set_row_data(GTK_CLIST(packet_list), row, fdata);
 
     if (fdata->flags.marked) {
-       gtk_clist_set_background(GTK_CLIST(packet_list), row, &prefs.gui_marked_bg);
-       gtk_clist_set_foreground(GTK_CLIST(packet_list), row, &prefs.gui_marked_fg);
+       color_t_to_gdkcolor(&bg, &prefs.gui_marked_bg);
+       color_t_to_gdkcolor(&fg, &prefs.gui_marked_fg);
     } else if (filter_list != NULL && (args.colorf != NULL)) {
-        gtk_clist_set_background(GTK_CLIST(packet_list), row,
-                   &args.colorf->bg_color);
-        gtk_clist_set_foreground(GTK_CLIST(packet_list), row,
-                   &args.colorf->fg_color);
+       bg = args.colorf->bg_color;
+       fg = args.colorf->fg_color;
     } else {
-        gtk_clist_set_background(GTK_CLIST(packet_list), row, &WHITE);
-        gtk_clist_set_foreground(GTK_CLIST(packet_list), row, &BLACK);
+       bg = WHITE;
+       fg = BLACK;
     }
+    gtk_clist_set_background(GTK_CLIST(packet_list), row, &bg);
+    gtk_clist_set_foreground(GTK_CLIST(packet_list), row, &fg);
   } else {
     /* This frame didn't pass the display filter, so it's not being added
        to the clist, and thus has no row. */
@@ -772,6 +773,7 @@ read_packet(capture_file *cf, int offset)
   fdata->next = NULL;
   fdata->prev = NULL;
   fdata->pfd  = NULL;
+  fdata->data_src  = NULL;
   fdata->pkt_len  = phdr->len;
   fdata->cap_len  = phdr->caplen;
   fdata->file_off = offset;
@@ -787,7 +789,7 @@ read_packet(capture_file *cf, int offset)
   if (cf->rfcode) {
     protocol_tree = proto_tree_create_root();
     edt = epan_dissect_new(pseudo_header, buf, fdata, protocol_tree);
-    passed = dfilter_apply(cf->rfcode, protocol_tree, buf, fdata->cap_len);
+    passed = dfilter_apply_edt(cf->rfcode, edt);
     proto_tree_free(protocol_tree);
     epan_dissect_free(edt);
   }   
@@ -819,7 +821,7 @@ read_packet(capture_file *cf, int offset)
 int
 filter_packets(capture_file *cf, gchar *dftext)
 {
-  dfilter *dfcode;
+  dfilter_t *dfcode;
 
   if (dftext == NULL) {
     /* The new filter is an empty filter (i.e., display all packets). */
@@ -828,7 +830,7 @@ filter_packets(capture_file *cf, gchar *dftext)
     /*
      * We have a filter; try to compile it.
      */
-    if (dfilter_compile(dftext, &dfcode) != 0) {
+    if (!dfilter_compile(dftext, &dfcode)) {
       /* The attempt failed; report an error. */
       simple_dialog(ESD_TYPE_CRIT, NULL, dfilter_error_msg);
       return 0;
@@ -847,7 +849,7 @@ filter_packets(capture_file *cf, gchar *dftext)
     g_free(cf->dfilter);
   cf->dfilter = dftext;
   if (cf->dfcode != NULL)
-    dfilter_destroy(cf->dfcode);
+    dfilter_free(cf->dfcode);
   cf->dfcode = dfcode;
 
   /* Now rescan the packet list, applying the new filter, but not
@@ -991,6 +993,10 @@ rescan_packets(capture_file *cf, const char *action, gboolean refilter,
        g_slist_free(fdata->pfd);
       }
       fdata->pfd = NULL;
+      if (fdata->data_src) {   /* release data source list */
+       g_slist_free(fdata->data_src);
+      }
+      fdata->data_src = NULL;
     }
 
     wtap_seek_read (cf->wth, fdata->file_off, &cf->pseudo_header,
@@ -1018,6 +1024,10 @@ rescan_packets(capture_file *cf, const char *action, gboolean refilter,
        g_slist_free(fdata->pfd);
       }
       fdata->pfd = NULL;
+      if (fdata->data_src) {
+       g_slist_free(fdata->data_src);
+      }
+      fdata->data_src = NULL;
     }
   }
 
@@ -1223,8 +1233,7 @@ print_packets(capture_file *cf, print_args_t *print_args)
 
        if (print_args->print_hex) {
          /* Print the full packet data as hex. */
-         print_hex_data(cf->print_fh, print_args->format, cf->pd,
-                       fdata->cap_len, fdata->flags.encoding);
+         print_hex_data(cf->print_fh, print_args->format, fdata);
        }
 
         /* Print a blank line if we print anything after this. */
@@ -1365,19 +1374,32 @@ static void
 clear_tree_and_hex_views(void)
 {
   /* Clear the hex dump. */
-  gtk_text_freeze(GTK_TEXT(byte_view));
-  gtk_text_set_point(GTK_TEXT(byte_view), 0);
-  gtk_text_forward_delete(GTK_TEXT(byte_view),
-    gtk_text_get_length(GTK_TEXT(byte_view)));
-  gtk_text_thaw(GTK_TEXT(byte_view));
 
+  GtkWidget *byte_view;
+  int i;
+
+/* Get the current tab scroll window, then get the text widget  */
+/* from the E_BYTE_VIEW_TEXT_INFO_KEY data field               */
+
+  i = gtk_notebook_get_current_page( GTK_NOTEBOOK(byte_nb_ptr));
+
+  if ( i >= 0){
+    byte_view = gtk_notebook_get_nth_page( GTK_NOTEBOOK(byte_nb_ptr), i);
+    byte_view = gtk_object_get_data(GTK_OBJECT(byte_view), E_BYTE_VIEW_TEXT_INFO_KEY);
+
+    gtk_text_freeze(GTK_TEXT(byte_view));
+    gtk_text_set_point(GTK_TEXT(byte_view), 0);
+    gtk_text_forward_delete(GTK_TEXT(byte_view),
+      gtk_text_get_length(GTK_TEXT(byte_view)));
+    gtk_text_thaw(GTK_TEXT(byte_view));
+  }
   /* Remove all nodes in ctree. This is how it's done in testgtk.c in GTK+ */
   gtk_clist_clear ( GTK_CLIST(tree_view) );
 
 }
 
 gboolean
-find_packet(capture_file *cf, dfilter *sfcode)
+find_packet(capture_file *cf, dfilter_t *sfcode)
 {
   frame_data *start_fd;
   frame_data *fdata;
@@ -1456,7 +1478,7 @@ find_packet(capture_file *cf, dfilter *sfcode)
         wtap_seek_read(cf->wth, fdata->file_off, &cf->pseudo_header,
                        cf->pd, fdata->cap_len);
         edt = epan_dissect_new(&cf->pseudo_header, cf->pd, fdata, protocol_tree);
-        frame_matched = dfilter_apply(sfcode, protocol_tree, cf->pd, fdata->cap_len);
+        frame_matched = dfilter_apply_edt(sfcode, edt);
         proto_tree_free(protocol_tree);
        epan_dissect_free(edt);
         if (frame_matched) {
@@ -1517,6 +1539,8 @@ void
 select_packet(capture_file *cf, int row)
 {
   frame_data *fdata;
+  tvbuff_t *bv_tvb;
+  int i;
 
   /* Get the frame data struct pointer for this frame */
   fdata = (frame_data *) gtk_clist_get_row_data(GTK_CLIST(packet_list), row);
@@ -1570,8 +1594,15 @@ select_packet(capture_file *cf, int row)
 
   /* Display the GUI protocol tree and hex dump. */
   clear_tree_and_hex_views();
+
+  i = 0; 
+  while((bv_tvb = g_slist_nth_data ( cf->current_frame->data_src, i++))){
+       add_byte_view( tvb_get_name( bv_tvb), tvb_get_ptr(bv_tvb, 0, -1), tvb_length(bv_tvb));
+  }
+
   proto_tree_draw(cf->protocol_tree, tree_view);
-  packet_hex_print(GTK_TEXT(byte_view), cf->pd, cf->current_frame, NULL);
+
+  set_notebook_page( byte_nb_ptr, 0);
 
   /* A packet is selected. */
   set_menus_for_selected_packet(TRUE);
@@ -1988,7 +2019,7 @@ file_close_error_message(int err)
     break;
 
   case WTAP_ERR_SHORT_WRITE:
-    errmsg = "Not all the data could be written to the file \"%s\".";
+    errmsg = "Not all the packets could be written to the file \"%s\".";
     break;
 
   case ENOSPC: