logo       

r10972 - trunk/libraries/gui-sniffer: msg#00041

Subject: r10972 - trunk/libraries/gui-sniffer
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> };
-- 
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://www.opendylan.org/mailman/listinfo/gd-chatter



<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

Recently Viewed:
audio.irate.dev...    yellowdog.gener...    ietf.ips/2002-0...    xfree86.fonts/2...    busybox/2003-07...    emacs.jdee/2004...    linux.mandrake....    hardware.microc...    user-groups.lin...    science.analysi...    version-control...    db.filemaker.de...    cluster.openmos...    mail.eyebrowse....    text.xml.xerces...    kde.devel.kwrit...    finance.moneyda...    gcc.regression/...    network.routing...    os.freebsd.deve...    recreation.radi...    qnx.openqnx.dev...    python.xml/2002...   
Home | blog view | USPTO Patent Archive | advertise | OSDir is an inevitable website. super tiny logo

Free Magazines

Cisco News
Receive a free quarterly e-newsletter with exclusive articles on how Cisco IT uses its own products and solutions to enable the business.
subscribe

Systems Management News, the newspaper for IT systems administration and data center managers! Each issue of Systems Management News is chock-full of news and analysis to help you understand what's happening in your field.
subscribe

The Enterprise Newsweekly eWeek is the essential technology information source for builders of e-business.
subscribe

Oracle Magazine Oracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world's largest enterprise software company.
subscribe

Total Telecom Total Telecom is "The Economist of the communications industry".
subscribe