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

hannes at gwydiondylan.org hannes at gwydiondylan.org
Fri Sep 1 19:23:19 CEST 2006


Author: hannes
Date: Fri Sep  1 19:23:15 2006
New Revision: 10875

Added:
   trunk/libraries/gui-sniffer/bitmaps.rc   (contents, props changed)
   trunk/libraries/gui-sniffer/icons/
   trunk/libraries/gui-sniffer/icons/open.ico   (contents, props changed)
   trunk/libraries/gui-sniffer/icons/play.ico   (contents, props changed)
   trunk/libraries/gui-sniffer/icons/save.ico   (contents, props changed)
   trunk/libraries/gui-sniffer/icons/stop.ico   (contents, props changed)
Modified:
   trunk/libraries/gui-sniffer/gui-sniffer.dylan
   trunk/libraries/gui-sniffer/gui-sniffer.hdp
   trunk/libraries/gui-sniffer/library.dylan
   trunk/libraries/gui-sniffer/module.dylan
   trunk/libraries/packetizer/leaf-frames.dylan
   trunk/libraries/packetizer/module.dylan
   trunk/libraries/packetizer/packetizer.dylan
Log:
Bug: 7299
*export <position-mixin> from packetizer
*introduce parent slot in <raw-frame>
*display hex-dump of <raw-frame> as children, 16 bytes each row
*introduce tool-bar (icons from fundev/sources/environment/win32/bitmaps)

Added: trunk/libraries/gui-sniffer/bitmaps.rc
==============================================================================
--- (empty file)
+++ trunk/libraries/gui-sniffer/bitmaps.rc	Fri Sep  1 19:23:15 2006
@@ -0,0 +1,4 @@
+OPEN		ICON DISCARDABLE "open.ico"
+PLAY		ICON DISCARDABLE "play.ico"
+SAVE		ICON DISCARDABLE "save.ico"
+STOP		ICON DISCARDABLE "stop.ico"

Modified: trunk/libraries/gui-sniffer/gui-sniffer.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.dylan	(original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.dylan	Fri Sep  1 19:23:15 2006
@@ -14,6 +14,10 @@
   collection.size > 0
 end;
 
+define method frame-children-predicate (raw-frame :: <raw-frame>)
+  raw-frame.data.size > 0
+end;
+
 define method frame-children-predicate (object :: <object>)
   #f
 end;
@@ -38,6 +42,34 @@
   sorted-frame-fields(a-frame)
 end;
 
+define class <raw-frame-element> (<position-mixin>)
+  constant slot raw-frame :: <raw-frame>, required-init-keyword: raw-frame:;
+  constant slot hex-dump-row :: <string>, required-init-keyword: value:;
+end;
+
+define method frame-children-generator (raw-frame :: <raw-frame>)
+  let out = make(<string-stream>, direction: #"output");
+  let hex = block()
+              hexdump(out, raw-frame.data);
+              stream-contents(out);
+            cleanup
+              close(out)
+            end;
+  let lines = split(hex, '\n', start: 1, end: hex.size - 1);
+  let start :: <integer> = 0;
+  let length :: <integer> = 16 * 8;
+  map(method(x)
+        let rff = make(<raw-frame-element>,
+                       start: start,
+                       length: length,
+                       end: start + length,
+                       raw-frame: raw-frame,
+                       value: x);
+        start := start + length;
+        rff;
+      end, lines)
+end;
+
 define method frame-children-generator (a-frame :: <header-frame>)
   let ffs = sorted-frame-fields(a-frame);
   copy-sequence(ffs, end: ffs.size - 1);
@@ -93,6 +125,14 @@
   as(<string>, frame);
 end;
 
+define method frame-print-label (frame :: <raw-frame>)
+  format-to-string("Additional data: %d bytes", frame.data.size)
+end;
+
+define method frame-print-label (frame :: <raw-frame-element>)
+  frame.hex-dump-row;
+end;
+
 define method print-source (frame :: <frame-with-metadata>)
   print-source(frame.real-frame) | "Unknown"
 end;
@@ -261,7 +301,7 @@
   0
 end;
 
-define method find-frame-field (frame :: <container-frame>, search :: <container-frame>)
+define method find-frame-field (frame :: <container-frame>, search :: type-union(<container-frame>, <raw-frame>))
  => (res :: false-or(type-union(<frame-field>, <rep-frame-field>)))
   block(ret)
     for (ff in sorted-frame-fields(frame))
@@ -280,7 +320,7 @@
   end;
 end;
 
-define method compute-absolute-offset (frame :: <container-frame>)
+define method compute-absolute-offset (frame :: type-union(<container-frame>, <raw-frame>))
   if (frame.parent)
     let ff = find-frame-field(frame.parent, frame);
     compute-absolute-offset(ff);
@@ -297,6 +337,11 @@
   start-offset(frame-field) + compute-absolute-offset(frame-field.frame)
 end;
 
+define method compute-absolute-offset (ff :: <raw-frame-element>)
+ => (res :: <integer>)
+  start-offset(ff) + compute-absolute-offset(ff.raw-frame);
+end;
+
 define method compute-length (frame :: <header-frame>) => (res :: <integer>)
   start-offset(sorted-frame-fields(frame).last)
 end;
@@ -305,7 +350,7 @@
   frame-size(frame)
 end;
 
-define method compute-length (frame-field :: <rep-frame-field>) => (res :: <integer>)
+define method compute-length (frame-field :: <position-mixin>) => (res :: <integer>)
   frame-field.length
 end;
 
@@ -363,6 +408,12 @@
   end;
 
   let hex-dump = split(get-hex-dump(packet.real-frame), '\n');
+  hex-dump := copy-sequence(hex-dump, end: hex-dump.size - 1);
+
+  if (end-line >= hex-dump.size - 1)
+    end-line := hex-dump.size - 2;
+    end-rest := 16;
+  end;
   
   let start-pos = 6 + start-rest * 3 + if (start-rest >= 8) 1 else 0 end;
   let end-pos = 6 + end-rest * 3 + if (end-rest > 8) 1 else 0 end;
@@ -437,6 +488,31 @@
   pane sniffer-status-bar (frame)
     make(<status-bar>, label: "GUI Sniffer");
 
+  pane open-button (frame)
+    make(<push-button>, label: $icons["open"],
+         activate-callback: method(x) open-pcap-file(frame) end);
+  pane save-button (frame)
+    make(<push-button>, label: $icons["save"],
+         activate-callback: method(x) save-pcap-file(frame) end);
+  pane play-button (frame)
+    make(<push-button>, label: $icons["play"],
+         activate-callback: method(x) open-interface(frame) end);
+  pane stop-button (frame)
+    make(<push-button>, label: $icons["stop"],
+         activate-callback: method(x) close-interface(frame) end);
+    
+  pane sniffer-tool-bar (frame)
+    make(<tool-bar>,
+         height: 18,
+         resizable?: #f,
+         child: horizontally ()
+                  frame.open-button;
+                  frame.save-button;
+                  make(<separator>, orientation: #"vertical");
+                  frame.play-button;
+                  frame.stop-button;
+                end);
+
   layout (frame) vertically()
                    frame.filter-pane;
                    frame.packet-table;
@@ -444,6 +520,7 @@
                    frame.packet-hex-dump;
                  end;
 
+  tool-bar (frame) frame.sniffer-tool-bar;
   command-table (frame) *gui-sniffer-command-table*;
   status-bar (frame) frame.sniffer-status-bar;
   keyword title: = "GUI Sniffer"
@@ -512,8 +589,11 @@
     frame.ethernet-interface := interface;
     gadget-label(frame.sniffer-status-bar) := concatenate("Capturing ", interface-name);
     command-enabled?(open-pcap-file, frame) := #f;
+    gadget-enabled?(frame.open-button) := #f;
     command-enabled?(open-interface, frame) := #f;
+    gadget-enabled?(frame.play-button) := #f;
     command-enabled?(close-interface, frame) := #t;
+    gadget-enabled?(frame.stop-button) := #t;
   end;
 end;
 
@@ -522,8 +602,11 @@
   gadget-label(frame.sniffer-status-bar) := "Stopped capturing";
   disconnect(frame.ethernet-interface, frame);
   command-enabled?(open-pcap-file, frame) := #t;
+  gadget-enabled?(frame.open-button) := #t;
   command-enabled?(open-interface, frame) := #t;
+  gadget-enabled?(frame.play-button) := #t;
   command-enabled?(close-interface, frame) := #f;
+  gadget-enabled?(frame.stop-button) := #f;
 end;
 
 define method prompt-for-interface
@@ -579,9 +662,24 @@
   end;
 end;
 
+define constant $icons = make(<string-table>);
+
+define function initialize-icons ()
+  local method doit (name)
+    $icons[as-lowercase(name)]
+      := read-image-as(<win32-icon>, as(<byte-string>, name), #"icon", width: 16, height: 16);
+  end;
+  doit("PLAY");
+  doit("OPEN");
+  doit("SAVE");
+  doit("STOP");
+end;
+
 begin
+  initialize-icons();
   let gui-sniffer = make(<gui-sniffer-frame>);
   command-enabled?(close-interface, gui-sniffer) := #f;
+  gadget-enabled?(gui-sniffer.stop-button) := #f;
   start-frame(gui-sniffer);
 end;
 

Modified: trunk/libraries/gui-sniffer/gui-sniffer.hdp
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.hdp	(original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.hdp	Fri Sep  1 19:23:15 2006
@@ -12,4 +12,9 @@
 Start-Function:   main
 Compilation-Mode: loose
 Target-Type:      executable
+RC-Files:	bitmaps.rc
+C-Header-Files:	icons/open.ico
+			icons/save.ico
+			icons/play.ico
+			icons/stop.ico
 

Added: trunk/libraries/gui-sniffer/icons/open.ico
==============================================================================
Binary file. No diff available.

Added: trunk/libraries/gui-sniffer/icons/play.ico
==============================================================================
Binary file. No diff available.

Added: trunk/libraries/gui-sniffer/icons/save.ico
==============================================================================
Binary file. No diff available.

Added: trunk/libraries/gui-sniffer/icons/stop.ico
==============================================================================
Binary file. No diff available.

Modified: trunk/libraries/gui-sniffer/library.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/library.dylan	(original)
+++ trunk/libraries/gui-sniffer/library.dylan	Fri Sep  1 19:23:15 2006
@@ -5,6 +5,7 @@
 define library gui-sniffer
   use common-dylan;
   use duim;
+  use win32-duim;
   use io;
   use system;
   use packetizer;

Modified: trunk/libraries/gui-sniffer/module.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/module.dylan	(original)
+++ trunk/libraries/gui-sniffer/module.dylan	Fri Sep  1 19:23:15 2006
@@ -6,6 +6,7 @@
   use common-dylan;
   use threads;
   use duim;
+  use win32-duim;
   use format;
   use format-out;
   use standard-io;

Modified: trunk/libraries/packetizer/leaf-frames.dylan
==============================================================================
--- trunk/libraries/packetizer/leaf-frames.dylan	(original)
+++ trunk/libraries/packetizer/leaf-frames.dylan	Fri Sep  1 19:23:15 2006
@@ -471,6 +471,7 @@
 
 define abstract class <variable-size-byte-vector> (<variable-size-untranslated-leaf-frame>)
   slot data :: <byte-vector>, required-init-keyword: data:;
+  slot parent :: false-or(<container-frame>) = #f, init-keyword: parent:;
 end;
 
 define method frame-size (frame :: <variable-size-byte-vector>) => (res :: <integer>)
@@ -479,14 +480,16 @@
 
 define method parse-frame (frame-type :: subclass(<variable-size-byte-vector>),
                            packet :: <byte-sequence>,
-                           #key start :: <integer> = 0)
+                           #key start :: <integer> = 0,
+                           parent)
  => (frame :: <variable-size-byte-vector>, next-unparsed :: <integer>)
  byte-aligned(start);
  if (packet.size < byte-offset(start))
    signal(make(<malformed-packet-error>))
  else
    values(make(frame-type,
-               data: copy-sequence(packet, start: byte-offset(start))),
+               data: copy-sequence(packet, start: byte-offset(start)),
+               parent: parent),
           start + packet.size * 8)
  end
 end;

Modified: trunk/libraries/packetizer/module.dylan
==============================================================================
--- trunk/libraries/packetizer/module.dylan	(original)
+++ trunk/libraries/packetizer/module.dylan	Fri Sep  1 19:23:15 2006
@@ -60,6 +60,7 @@
   export <frame-field>,
     <repeated-frame-field>,
     <rep-frame-field>,
+    <position-mixin>,
     parent-frame-field,
     frame-field-list,
     start-offset,

Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan	(original)
+++ trunk/libraries/packetizer/packetizer.dylan	Fri Sep  1 19:23:15 2006
@@ -536,7 +536,7 @@
 define generic assemble-field (frame :: <frame>, field :: <field>)
  => (packet :: <vector>);
 
-define class <position-mixin> (<object>)
+define open abstract class <position-mixin> (<object>)
   slot %start-offset :: false-or(<integer>) = #f, init-keyword: start:;
   slot %end-offset :: false-or(<integer>) = #f, init-keyword: end:;
   slot %length :: false-or(<integer>) = #f, init-keyword: length:;
@@ -550,9 +550,11 @@
 define method start-offset (ff :: <position-mixin>)
   ff.%start-offset;
 end;
+
 define method end-offset (ff :: <position-mixin>)
   ff.%end-offset;
 end;
+
 define method length (ff :: <position-mixin>)
   ff.%length;
 end;



More information about the chatter mailing list