[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