[Gd-chatter] r10848 - in trunk/libraries: gui-sniffer packetizer

hannes at gwydiondylan.org hannes at gwydiondylan.org
Thu Aug 10 23:54:48 CEST 2006


Author: hannes
Date: Thu Aug 10 23:54:46 2006
New Revision: 10848

Modified:
   trunk/libraries/gui-sniffer/gui-sniffer.dylan
   trunk/libraries/packetizer/module.dylan
Log:
Bug: 7299
*add status bar displaying last command
*add hex-dump view of selected packet
*use add-item to add packets received via the network flow to the packet-table, redrawing the entire table was expensive

Modified: trunk/libraries/gui-sniffer/gui-sniffer.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.dylan	(original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.dylan	Thu Aug 10 23:54:46 2006
@@ -112,8 +112,13 @@
   end;
 end;
 
-define method show-packet-tree (frame :: <gui-sniffer-frame>)
+define method show-packet (frame :: <gui-sniffer-frame>)
   let packet = frame.packet-table.gadget-value;
+  show-packet-tree(frame, packet);
+  show-packet-hex-dump(frame, packet);
+end;
+
+define method show-packet-tree (frame :: <gui-sniffer-frame>, packet)
   frame.packet-tree-view.tree-control-roots
     := if (packet)
          frame-children-generator(packet);
@@ -121,6 +126,22 @@
          #[]
        end;
 end;
+
+define method show-packet-hex-dump (frame :: <gui-sniffer-frame>, network-packet)
+  frame.packet-hex-dump.gadget-value
+    := if (network-packet)
+         let out = make(<string-stream>, direction: #"output");
+         block()
+           hexdump(out, network-packet.packet);
+           stream-contents(out);
+         cleanup
+           close(out)
+         end
+       else
+         ""
+       end;
+end;
+
 define variable *count* :: <integer> = 0;
 define method counter (frame :: <object>)
   *count* := *count* + 1;
@@ -130,6 +151,7 @@
   slot network-frames = make(<stretchy-vector>);
   slot filter-expression = #f;
   slot ethernet-interface = #f;
+
   pane filter-field (frame)
     make(<text-field>,
          label: "Filter expression",
@@ -146,7 +168,7 @@
          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);
+         value-changed-callback: method(x) show-packet(frame) end);
 
   pane packet-tree-view (frame)
     make(<tree-control>,
@@ -154,13 +176,28 @@
          children-generator: frame-children-generator,
          children-predicate: frame-children-predicate);
 
+  pane packet-hex-dump (frame)
+    make(<text-editor>,
+         read-only?: #t,
+         tab-stop?: #t,
+         lines: 20,
+         columns: 100,
+         scroll-bars: #"vertical",
+         text-style: make(<text-style>, family: #"fix"));
+
+
+  pane sniffer-status-bar (frame)
+    make(<status-bar>, label: "GUI Sniffer");
+
   layout (frame) vertically()
                    frame.filter-pane;
                    frame.packet-table;
                    frame.packet-tree-view;
+                   frame.packet-hex-dump;
                  end;
 
   command-table (frame) *gui-sniffer-command-table*;
+  status-bar (frame) frame.sniffer-status-bar;
   keyword title: = "GUI Sniffer"
 end;
 
@@ -183,10 +220,12 @@
   let file = choose-file(frame: frame, direction: #"input");
   if (file)
     frame.network-frames := make(<stretchy-vector>);
+    refresh-packet-table(frame);
     let file-stream = make(<file-stream>, locator: file, direction: #"input");
     let pcap-reader = make(<pcap-file-reader>, stream: file-stream);
     connect(pcap-reader, frame);
     toplevel(pcap-reader);
+    gadget-label(frame.sniffer-status-bar) := concatenate("Opened ", file);
     close(file-stream);
     refresh-packet-table(frame);
   end;
@@ -203,25 +242,29 @@
     connect(frame, pcap-writer);
     do(curry(push-data, frame.the-output), frame.network-frames);
     //XXX: disconnect in flow graph, but disconnect is NYI
+    gadget-label(frame.sniffer-status-bar) := concatenate("Wrote ", file);
     close(file-stream);
   end;
 end;
 
 define method open-interface (frame :: <gui-sniffer-frame>)
-  let (interface, promiscious?) = prompt-for-interface(owner: frame);
-  if (interface)
+  let (interface-name, promiscious?) = prompt-for-interface(owner: frame);
+  if (interface-name)
     let interface = make(<ethernet-interface>,
-                         name: interface,
+                         name: interface-name,
                          promiscious?: promiscious?);
     connect(interface, frame);
     frame.network-frames := make(<stretchy-vector>);
+    refresh-packet-table(frame);
     make(<thread>, function: curry(toplevel, interface));
     frame.ethernet-interface := interface;
+    gadget-label(frame.sniffer-status-bar) := concatenate("Capturing ", interface-name);
   end;
 end;
 
 define method close-interface (frame :: <gui-sniffer-frame>)
   frame.ethernet-interface.running? := #f;
+  gadget-label(frame.sniffer-status-bar) := "Stopped capturing";
   //XXX: disconnect in flow graph, but disconnect is NYI
 end;
 
@@ -236,7 +279,7 @@
     = make(<dialog-frame>,
            title: title,
            owner: owner,
-           layout: vertically()
+           layout: horizontally()
                      interface-text;
                      promiscious?
                    end,
@@ -258,7 +301,7 @@
     update-gadget(frame.packet-table)
   else
     gadget-items(frame.packet-table) := shown-packets;
-    show-packet-tree(frame);
+    show-packet(frame);
   end;
 end;
 
@@ -266,7 +309,9 @@
                              node :: <gui-sniffer-frame>,
                              frame :: <frame>)
   add!(node.network-frames, frame);
-  refresh-packet-table(node);
+  if (~ node.filter-expression | matches?(frame, node.filter-expression))
+    add-item(node.packet-table, make-item(node.packet-table, frame))
+  end;
 end;
 begin
   let gui-sniffer = make(<gui-sniffer-frame>);

Modified: trunk/libraries/packetizer/module.dylan
==============================================================================
--- trunk/libraries/packetizer/module.dylan	(original)
+++ trunk/libraries/packetizer/module.dylan	Thu Aug 10 23:54:46 2006
@@ -88,7 +88,8 @@
     cache-class,
     field-count,
     fixup!,
-    parent;
+    parent,
+    packet;
 
   export <header-frame>,
     <header-frame-cache>,



More information about the chatter mailing list