[Gd-chatter] r10972 - trunk/libraries/gui-sniffer
andreas at gwydiondylan.org
andreas at gwydiondylan.org
Tue Nov 21 15:55:24 CET 2006
Author: andreas
Date: Tue Nov 21 15:55:21 2006
New Revision: 10972
Added:
trunk/libraries/gui-sniffer/hex-view.dylan (contents, props changed)
Modified:
trunk/libraries/gui-sniffer/gui-sniffer.dylan
trunk/libraries/gui-sniffer/gui-sniffer.hdp
trunk/libraries/gui-sniffer/module.dylan
Log:
job: 7299
Better hex view, general layout improvements.
Modified: trunk/libraries/gui-sniffer/gui-sniffer.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.dylan (original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.dylan Tue Nov 21 15:55:21 2006
@@ -231,7 +231,7 @@
let (days, hours, minutes, seconds, microseconds)
= decode-duration(diff);
let secs = (((days * 24 + hours) * 60) + minutes) * 60 + seconds;
- secs + as(<float>, microseconds) / 1000000
+ concatenate(integer-to-string(secs), ".", integer-to-string(truncate/(microseconds, 1000), size: 3));
end;
define method apply-filter (frame :: <gui-sniffer-frame>)
@@ -267,10 +267,13 @@
end;
define method show-packet (frame :: <gui-sniffer-frame>)
- let packet = frame.packet-table.gadget-value;
- if (packet) packet := real-frame(packet) end;
- show-packet-tree(frame, packet);
- show-packet-hex-dump(frame, packet);
+ let current-packet = frame.packet-table.gadget-value;
+ if (current-packet) current-packet := real-frame(current-packet) end;
+ show-packet-tree(frame, current-packet);
+ current-packet & show-hexdump(frame, current-packet.packet);
+ redisplay-window(frame.packet-hex-dump);
+// note-gadget-text-changed(window);
+// note-gadget-value-changed(window);
end;
define method show-packet-tree (frame :: <gui-sniffer-frame>, packet)
@@ -282,26 +285,6 @@
end;
end;
-define method show-packet-hex-dump (frame :: <gui-sniffer-frame>, network-packet)
- frame.packet-hex-dump.gadget-value := get-hex-dump(network-packet);
-end;
-
-define function get-hex-dump (network-packet) => (string :: <string>)
- if (network-packet)
- //XXX: this should be easier!
- let out = make(<string-stream>, direction: #"output");
- block()
- hexdump(out, network-packet.packet); //XXX: once assemble-frame
- //on unparsed-container-frame works,
- //we can use assemble-frame here
- stream-contents(out);
- cleanup
- close(out)
- end
- else
- ""
- end;
-end;
define method compute-absolute-offset (frame :: <ethernet-frame>)
=> (res :: <integer>)
0
@@ -409,35 +392,9 @@
let start-highlight = compute-absolute-offset(selected-packet);
let end-highlight = start-highlight + compute-length(selected-packet);
- let (start-line, start-rest) = floor/(byte-offset(start-highlight), 16);
- let (end-line, end-rest) = floor/(byte-offset(end-highlight + 7), 16);
+ set-highlight(mframe, start-highlight, end-highlight);
+ redisplay-window(mframe.packet-hex-dump);
- if (end-rest = 0)
- end-rest := 16;
- end-line := end-line - 1
- 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;
-
- unless (start-line = end-line & start-pos = end-pos)
- hex-dump[start-line + 1][start-pos - 1] := '[';
- if (end-pos >= hex-dump[end-line + 1].size)
- hex-dump[end-line + 1] := add!(hex-dump[end-line + 1], ']');
- else
- hex-dump[end-line + 1][end-pos - 1] := ']';
- end;
- end;
- hex-dump := reduce1(method(a,b) concatenate(a, "\n", b) end, hex-dump);
- mframe.packet-hex-dump.gadget-value := hex-dump;
end;
define variable *count* :: <integer> = 0;
@@ -446,6 +403,8 @@
*count*;
end;
+define constant $text-style = make(<text-style>, family: #"fix", size: 8);
+
define frame <gui-sniffer-frame> (<simple-frame>, deuce/<basic-editor-frame>, <filter>)
slot network-frames :: <stretchy-vector> = make(<stretchy-vector>);
slot filter-expression = #f;
@@ -458,6 +417,7 @@
label: "Filter expression",
value-changed-callback: method(x) apply-filter(frame) end,
activate-callback: method(x) apply-filter(frame) end,
+ text-style: $text-style,
items: frame.filter-history);
pane filter-pane (frame)
@@ -475,7 +435,9 @@
print-destination,
print-protocol,
print-info),
+ widths: #[30, 60, 150, 150, 100, 500],
items: #[],
+ text-style: $text-style,
value-changed-callback: method(x) show-packet(frame) end);
pane packet-tree-view (frame)
@@ -483,6 +445,7 @@
label-key: frame-print-label,
children-generator: frame-children-generator,
children-predicate: frame-children-predicate,
+ text-style: $text-style,
value-changed-callback: method(x) highlight-hex-dump(frame) end);
pane packet-hex-dump (frame)
@@ -493,7 +456,7 @@
lines: 20,
columns: 100,
scroll-bars: #"vertical",
- text-style: make(<text-style>, family: #"fix", size: 10));
+ text-style: $text-style);
pane sniffer-status-bar (frame)
@@ -529,7 +492,9 @@
make(<column-splitter>,
children: vector(frame.packet-table,
frame.packet-tree-view,
- frame.packet-hex-dump));
+ scrolling (scroll-bars: #"both")
+ frame.packet-hex-dump
+ end));
end;
tool-bar (frame) frame.sniffer-tool-bar;
@@ -690,6 +655,7 @@
begin
initialize-icons();
let gui-sniffer = make(<gui-sniffer-frame>);
+ set-frame-size(gui-sniffer, 800, 600);
deuce/frame-window(gui-sniffer) := gui-sniffer.packet-hex-dump;
deuce/*editor-frame* := gui-sniffer;
deuce/*buffer* := deuce/make-initial-buffer();
Modified: trunk/libraries/gui-sniffer/gui-sniffer.hdp
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.hdp (original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.hdp Tue Nov 21 15:55:21 2006
@@ -1,20 +1,21 @@
-Format-Version: 2
-Library: gui-sniffer
-Synopsis: A brief description of the project.
-Author: Andreas Bogk, Hannes Mehnert
-Copyright: (C) 2005, All rights reserved.
-Major-Version: 1
-Minor-Version: 0
-Files: library
+comment: This file is generated, please don't edit
+format-version: 2
+library: gui-sniffer
+files: library
module
+ hex-view
gui-sniffer
-Linker-Options: $(guilflags)
-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
-
+base-address: 0x63FE0000
+start-function: main
+linker-options: $(guilflags)
+c-header-files: icons\open.ico
+ icons\save.ico
+ icons\play.ico
+ icons\stop.ico
+rc-files: bitmaps.rc
+major-version: 1
+minor-version: 0
+library-pack: 0
+compilation-mode: loose
+target-type: executable
+comment: additional keywords
Added: trunk/libraries/gui-sniffer/hex-view.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/gui-sniffer/hex-view.dylan Tue Nov 21 15:55:21 2006
@@ -0,0 +1,174 @@
+module: hex-view
+
+define function hex(integer :: <integer>, #key size)
+ => (string :: <string>)
+ integer-to-string(integer, base: 16, size: size)
+end function hex;
+
+/*
+define method hexdump (sequence :: <sequence>) => (dump :: <string>)
+ let stream = make(<string-stream>, direction: #"output");
+ block()
+ for (byte in sequence,
+ index from 0)
+ if(modulo(index, 16) == 0)
+ format(stream, "%s ", hex(index, size: 4))
+ end;
+ format(stream, "%s", hex(byte, size: 2));
+ if(modulo(index, 16) == 15
+ | (index == sequence.size - 1 & sequence.size > 16))
+ format(stream, "\n")
+ elseif(modulo(index, 16) == 7)
+ format(stream, " ");
+ else
+ format(stream, " ");
+ end if;
+ end for;
+ stream-contents(stream);
+ cleanup
+ close(stream)
+ end
+end method hexdump;
+*/
+
+define method hexdump (sequence :: <sequence>) => (dump :: <string>)
+ let stream = make(<string-stream>, direction: #"output");
+ block()
+ for (index from 0 below sequence.size by 16)
+ let rest-bytes = min(16, sequence.size - index);
+ format(stream, "%s ", hex(index, size: 4));
+ for (byte-index from 0 below rest-bytes)
+ format(stream, "%s", hex(sequence[index + byte-index], size: 2));
+ if(modulo(byte-index, 16) == 7)
+ format(stream, " ");
+ else
+ format(stream, " ");
+ end if;
+ end for;
+ for (byte-index from rest-bytes below 16)
+ if(modulo(byte-index, 16) == 7)
+ format(stream, " ");
+ else
+ format(stream, " ");
+ end if;
+ end for;
+ format(stream, " ");
+ for (byte-index from 0 below rest-bytes)
+ let byte = sequence[index + byte-index];
+ if (byte >= 32 & byte < 128) // lame, I know
+ format(stream, "%s", as(<character>, byte))
+ else
+ format(stream, ".")
+ end;
+ end for;
+ format(stream, "\n");
+ end for;
+ stream-contents(stream);
+ cleanup
+ close(stream)
+ end
+end method hexdump;
+
+
+define method set-highlight (frame, start-offset, end-offset)
+ let window :: <basic-window> = frame-window(frame);
+ let name = "hex view";
+ let editor = frame-editor(frame);
+ let buffer = find-buffer(editor, name);
+ if (buffer)
+ let (start-line, start-rest) = floor/(floor/(start-offset, 8), 16);
+ let (end-line, end-rest) = floor/(floor/(end-offset - 1, 8), 16);
+ let start-pos = 6 + start-rest * 3 + if (start-rest >= 8) 1 else 0 end;
+ let end-pos = 8 + end-rest * 3 + if (end-rest >= 8) 1 else 0 end;
+ let start-pos2 = start-rest + 58;
+ let end-pos2 = end-rest + 59;
+
+ format-out("%= %=, %= %=, %= %=\n", start-offset, end-offset, start-line, start-pos, end-line, end-pos);
+
+ For (i from 0,
+ line = buffer.buffer-start-node.node-section.section-start-line then line.line-next,
+ while: line)
+ line.line-style-changes := #[];
+ if (end-offset - start-offset > 0)
+ if ((start-line < i) & (end-line >= i))
+ line.line-style-changes := vector(make(<style-change>,
+ index: 6,
+ font: window-default-bold-font(window)));
+ line.line-style-changes := add!(line.line-style-changes,
+ make(<style-change>,
+ index: 58,
+ font: window-default-bold-font(window)));
+ end;
+ if (end-line = i)
+ line.line-style-changes := add!(line.line-style-changes,
+ make(<style-change>,
+ index: end-pos,
+ font: window-default-font(window)));
+ line.line-style-changes := add!(line.line-style-changes,
+ make(<style-change>,
+ index: end-pos2,
+ font: window-default-font(window)));
+ end;
+ if (start-line = i)
+ line.line-style-changes := add!(line.line-style-changes,
+ make(<style-change>,
+ index: start-pos,
+ font: window-default-bold-font(window)));
+ line.line-style-changes := add!(line.line-style-changes,
+ make(<style-change>,
+ index: start-pos2,
+ font: window-default-bold-font(window)));
+ end;
+ end;
+ end;
+ select-buffer-in-appropriate-window(window, buffer);
+ initialize-redisplay-for-buffer(window, buffer);
+ frame-last-command-type(frame) := #"display";
+ end;
+end;
+
+define method show-hexdump (frame :: <basic-editor-frame>,
+ text)
+ let lines = split(hexdump(text), '\n');
+
+ if (lines.size = 0)
+ lines := #("");
+ end;
+
+ let window :: <basic-window> = frame-window(frame);
+ let name = "hex view";
+ let editor = frame-editor(frame);
+ let buffer = find-buffer(editor, name)
+ | make-empty-buffer(<simple-display-buffer>,
+ name: name,
+ major-mode: find-mode(<text-mode>),
+ read-only?: #t,
+ editor: editor);
+ let section = make(<section>, start-line: #f, end-line: #f);
+ let first-line :: false-or(<basic-line>) = #f;
+ let last-line :: false-or(<basic-line>) = #f;
+ for (line in lines)
+ let line = make(<rich-text-line>,
+ contents: line,
+ length: size(line),
+ section: section);
+ unless (first-line)
+ first-line := line
+ end;
+ line-previous(line) := last-line;
+ when (last-line)
+ line-next(last-line) := line
+ end;
+ last-line := line;
+ end;
+ section-start-line(section) := first-line;
+ section-end-line(section) := last-line;
+ let node = make-section-node(buffer, section);
+ node-buffer(node) := buffer;
+ section-nodes(section) := list(node);
+ buffer-start-node(buffer) := node;
+ buffer-end-node(buffer) := node;
+ select-buffer-in-appropriate-window(window, buffer);
+ initialize-redisplay-for-buffer(window, buffer);
+ frame-last-command-type(frame) := #"display";
+end;
Modified: trunk/libraries/gui-sniffer/module.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/module.dylan (original)
+++ trunk/libraries/gui-sniffer/module.dylan Tue Nov 21 15:55:21 2006
@@ -2,6 +2,17 @@
Author: Andreas Bogk, Hannes Mehnert
Copyright: (C) 2005, 2006, All rights reserved. Free for non-commercial use.
+define module hex-view
+ use common-dylan, exclude: { format-to-string };
+ use streams;
+ use format;
+ use format-out;
+ use deuce;
+ use deuce-internals;
+
+ export show-hexdump, set-highlight;
+end;
+
define module gui-sniffer
use common-dylan, exclude: { format-to-string };
use threads;
@@ -19,6 +30,7 @@
use network-flow;
use flow;
use interfaces;
+ use hex-view;
use ethernet, import: { <ethernet-frame> };
use pcap, import: { make-unix-time, <pcap-packet>, decode-unix-time, timestamp };
use prism2, import: { <prism2-frame> };
More information about the chatter
mailing list