logo       
Google Custom Search
    AddThis Social Bookmark Button

r10844 - trunk/libraries/gui-sniffer: msg#00004

Subject: r10844 - trunk/libraries/gui-sniffer
Author: hannes
Date: Wed Aug  9 20:11:46 2006
New Revision: 10844

Modified:
   trunk/libraries/gui-sniffer/gui-sniffer.dylan
Log:
Bug: 7299
*improved gui-sniffer (real frame, containing table and tree-control, 
file->open menu item, filter-expression)

Modified: trunk/libraries/gui-sniffer/gui-sniffer.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.dylan       (original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.dylan       Wed Aug  9 20:11:46 2006
@@ -83,18 +83,137 @@
        children-predicate: frame-children-predicate)
 end;
 
-define variable *frame* = #f;
+define method print-source (frame :: <ethernet-frame>)
+  as(<string>, frame.source-address)
+end;
 
-begin
-  let file = as(<byte-vector>, 
-                with-open-file (stream = "c:\\cap.pcap",
-                                direction: #"input")
-                  stream-contents(stream);
-                end);
+define method print-destination (frame :: <ethernet-frame>)
+  as(<string>, frame.destination-address)
+end;
+
+define method print-protocol (frame :: <ethernet-frame>)
+  frame.type-code
+end;
+
+define method print-info (frame :: <ethernet-frame>)
+  summary(frame.payload)
+end;
+
+define method apply-filter (frame :: <gui-sniffer-frame>)
+  let filter-string = gadget-value(frame.filter-field);
+  let old = frame.filter-expression;
+  if (filter-string.size > 0)
+    frame.filter-expression := parse-filter(filter-string)
+  else
+    frame.filter-expression := #f
+  end;
+  if (old ~= frame.filter-expression)
+    refresh-packet-table(frame);
+  end;
+end;
+
+define method show-packet-tree (frame :: <gui-sniffer-frame>)
+  let packet = frame.packet-table.gadget-value;
+  frame.packet-tree-view.tree-control-roots
+    := if (packet)
+         frame-children-generator(packet);
+       else
+         #[]
+       end;
+end;
+define variable *count* :: <integer> = 0;
+define method counter (frame :: <object>)
+  *count* := *count* + 1;
+  *count*;
+end;
+define frame <gui-sniffer-frame> (<simple-frame>)
+  slot network-frames = make(<stretchy-vector>);
+  slot filter-expression = #f;
+  pane filter-field (frame)
+    make(<text-field>,
+         label: "Filter expression",
+         activate-callback: method(x) apply-filter(frame) end);
+
+  pane filter-pane (frame)
+    horizontally()
+      make(<label>, label: "Filter: ");
+      frame.filter-field;
+    end;
+
+  pane packet-table (frame)
+    make(<table-control>,
+         headings: #("No", "Source", "Destination", "Protocol", "Info"),
+         generators: list(counter, print-source, print-destination, 
print-protocol, print-info),
+         items: #[],
+         value-changed-callback: method(x) show-packet-tree(frame) end);
+
+  pane packet-tree-view (frame)
+    make(<tree-control>,
+         label-key: frame-print-label,
+         children-generator: frame-children-generator,
+         children-predicate: frame-children-predicate);
+
+  layout (frame) vertically()
+                   frame.filter-pane;
+                   frame.packet-table;
+                   frame.packet-tree-view;
+                 end;
+
+  command-table (frame) *gui-sniffer-command-table*;
+  keyword title: = "GUI Sniffer"
+end;
+
+define command-table *file-command-table* (*global-command-table*)
+  menu-item "Open pcap file" = open-pcap-file;
+end;
+
+define command-table *gui-sniffer-command-table* (*global-command-table*)
+  menu-item "File" = *file-command-table*;
+end;
+
+define method open-pcap-file (frame :: <gui-sniffer-frame>)
+  let file = choose-file(frame: frame, direction: #"input");
+  if (file)
+    let packets = load-pcap-file(file);
+    if (packets)
+      frame.network-frames := packets;
+      refresh-packet-table(frame);
+    else
+      notify-user(format-to-string("Failed to open file %s", file), owner: 
frame)
+    end;
+  end;
+end;
+
+define method refresh-packet-table (frame :: <gui-sniffer-frame>)
+  let shown-packets = if (frame.filter-expression)
+                        choose(rcurry(matches?, frame.filter-expression),
+                               frame.network-frames)
+                      else
+                        frame.network-frames
+                      end;
+  *count* := 0;
+  if (shown-packets = gadget-items(frame.packet-table))
+    update-gadget(frame.packet-table)
+  else
+    gadget-items(frame.packet-table) := shown-packets;
+  end;
+  show-packet-tree(frame);
+end;
+define method load-pcap-file (file :: <string>) => (res :: 
false-or(<collection>))
+  let file-content
+    = as(<byte-vector>, 
+         with-open-file (stream = file,
+                         direction: #"input")
+           stream-contents(stream);
+         end);
   let pcap-file = make(unparsed-class(<pcap-file>),
-                       packet: file);
-  *frame* := map(payload, packets(pcap-file));
-  contain(frame-viewer(*frame*));
+                       packet: file-content);
+  //now check for real pcap-header... and return worst case #f
+  map(payload, packets(pcap-file));
+end;
+begin
+  let gui-sniffer-frame = make(<gui-sniffer-frame>);
+  start-frame(gui-sniffer-frame); 
 end;
 
 
-- 
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://www.opendylan.org/mailman/listinfo/gd-chatter




Try Searching:
servers, voip, java, networking, microsoft ...
<Prev in Thread] Current Thread [Next in Thread>