[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