[Gd-chatter] r10859 - trunk/libraries/gui-sniffer

hannes at gwydiondylan.org hannes at gwydiondylan.org
Mon Aug 21 23:22:14 CEST 2006


Author: hannes
Date: Mon Aug 21 23:22:13 2006
New Revision: 10859

Modified:
   trunk/libraries/gui-sniffer/gui-sniffer.dylan
Log:
Bug: 7299
*some more features

Modified: trunk/libraries/gui-sniffer/gui-sniffer.dylan
==============================================================================
--- trunk/libraries/gui-sniffer/gui-sniffer.dylan	(original)
+++ trunk/libraries/gui-sniffer/gui-sniffer.dylan	Mon Aug 21 23:22:13 2006
@@ -19,8 +19,7 @@
 end;
 
 define method frame-children-predicate (frame-field :: <frame-field>)
-  instance?(frame-field.value, <container-frame>)
-    | (instance?(frame-field.field, <repeated-field>) & frame-field.value.size > 0)
+  frame-children-predicate(frame-field.value);
 end;
 
 define method frame-children-generator (collection :: <collection>)
@@ -37,39 +36,30 @@
 end;
 
 define method frame-children-generator (frame-field :: <frame-field>)
-  if (instance?(frame-field.field, <repeated-field>))
-    frame-field.value
-  elseif (instance?(frame-field.value, <container-frame>))
-    sorted-frame-fields(frame-field.value)
-  else
-    error("huh?")
-  end
+  frame-children-generator(frame-field.value);
 end;
 
+define method frame-root-generator (frame :: <ethernet-frame>)
+  add!(next-method(), frame);
+end;
 define method frame-root-generator (frame :: <header-frame>)
-  add!(frame-root-generator(payload(frame)), frame);
+  add!(frame-root-generator(payload(frame)), get-frame-field(#"payload", frame));
 end;
 
 define method frame-root-generator (frame :: <frame>)
-  list(frame);
+  #();
 end;
 
 define method frame-print-label (frame-field :: <frame-field>)
-  if (~ frame-children-predicate(frame-field))
-    format-to-string("%s: %=", frame-field.field.field-name, frame-field.value)
-  elseif (instance?(frame-field.value, <container-frame>))
-    format-to-string("%s: %s %s",
-                     frame-field.field.field-name, 
-                     frame-field.value.frame-name,
-                     frame-field.value.summary)
-  elseif (instance?(frame-field.field, <repeated-field>))
-    format-to-string("%s: %= %s",
-                     frame-field.field.field-name,
-                     frame-field.value.size,
-                     frame-field.field.type)
+  if (frame-field.field.field-name = #"payload")
+    format-to-string("%s", frame-print-label(frame-field.value))
   else
-    format-to-string("%s", frame-field.field.field-name)
-  end
+    format-to-string("%s: %s", frame-field.field.field-name, frame-print-label(frame-field.value))
+  end;
+end;
+
+define method frame-print-label (frame :: <collection>)
+  format-to-string("(%d elements)", frame.size)
 end;
 
 define method frame-print-label (frame :: <container-frame>)
@@ -80,18 +70,85 @@
   format-to-string("%=", frame);
 end;
 
+define method frame-print-label (frame :: <object>)
+  as(<string>, frame);
+end;
+
 define method print-source (frame :: <frame-with-metadata>)
-  as(<string>, frame.real-frame.source-address)
+  print-source(frame.real-frame) | "Unknown"
+end;
+
+define method print-source (frame :: <header-frame>)
+  print-source(frame.payload);
+end;
+
+define method print-source (frame :: <frame>)
+  #f;
+end;
+
+define method print-source (frame :: <ethernet-frame>)
+  next-method() | as(<string>, frame.source-address)
+end;
+
+define method print-source (frame :: <ipv4-frame>)
+  next-method() | as(<string>, frame.source-address)
+end;
+
+/*define method print-source (frame :: <arp-frame>)
+  as(<string>, frame.source-ip-address)
+end;*/
+
+define method print-source (frame :: <ieee80211-management-frame>)
+  next-method() | as(<string>, frame.source-address)
 end;
 
 define method print-destination (frame :: <frame-with-metadata>)
-  as(<string>, frame.real-frame.destination-address)
+  print-destination(frame.real-frame) | "Unknown"
+end;
+
+define method print-destination (frame :: <header-frame>)
+  print-destination(frame.payload);
+end;
+
+define method print-destination (frame :: <frame>)
+  #f;
 end;
 
+define method print-destination (frame :: <ethernet-frame>)
+  next-method() | as(<string>, frame.destination-address)
+end;
+
+define method print-destination (frame :: <ipv4-frame>)
+  next-method() | as(<string>, frame.destination-address)
+end;
+
+define method print-destination (frame :: <ieee80211-management-frame>)
+  next-method() | as(<string>, frame.destination-address)
+end;
+
+/*define method print-destination (frame :: <arp-frame>)
+  if (frame.target-mac-address ~= mac-address("00:00:00:00:00:00"))
+    as(<string>, frame.target-ip-address)
+  else
+    "Broadcast"
+  end;
+end;*/
+
 define method print-protocol (frame :: <frame-with-metadata>)
-  frame.real-frame.type-code
+  print-protocol(frame.real-frame) | "Unknown"
 end;
 
+define method print-protocol (frame :: <ethernet-frame>)
+  next-method | frame.type-code
+end;
+
+define method print-protocol (frame :: <header-frame>)
+  print-protocol(frame.payload);
+end;
+
+define method print-protocol (frame :: <frame>)
+  #f
+end;
 define method print-info (frame :: <frame-with-metadata>)
   summary(frame.real-frame.payload)
 end;
@@ -176,35 +233,57 @@
 
 define method compute-absolute-offset (frame :: <ethernet-frame>)
  => (res :: <integer>)
-  sorted-frame-fields(frame).last.start-offset
+  0
 end;
 
-define method compute-absolute-offset (frame :: <header-frame>)
+define method compute-absolute-offset (frame :: <container-frame>)
  => (res :: <integer>)
+  format-out("START <container-frame> %s ", frame.frame-name);
   if (frame.parent)
-    compute-absolute-offset(frame.parent) + sorted-frame-fields(frame).last.start-offset
+    format-out("%d\n", sorted-frame-fields(frame.parent).last.start-offset);
+    compute-absolute-offset(frame.parent) +
+     if (instance?(frame.parent, <header-frame>))
+       sorted-frame-fields(frame.parent).last.start-offset;
+     else
+       0
+     end;
   else
+    format-out("0\n");
     0
   end;
 end;
 
-define method compute-absolute-offset (frame :: <frame-field>)
+define method compute-absolute-offset (frame-field :: <frame-field>)
  => (res :: <integer>)
-  if (instance?(frame-field.frame, <ethernet-frame>))
-    0
+ format-out("START <frame-field> %s %d\n", frame-field.field.field-name, start-offset(frame-field));
+  start-offset(frame-field) + compute-absolute-offset(frame-field.frame)
+end;
+
+define method compute-length (frame :: <header-frame>) => (res :: <integer>)
+  start-offset(sorted-frame-fields(frame).last)
+end;
+
+define method compute-length (frame :: <frame>) => (res :: <integer>)
+  frame-size(frame)
+end;
+
+define method compute-length (frame-field :: <frame-field>) => (res :: <integer>)
+  if (frame-field.field.field-name = #"payload")
+    compute-length(frame-field.value)
   else
-    compute-absolute-offset(frame-field.frame.parent)
-  end;
+    frame-field.length;
+  end
 end;
 
 define method highlight-hex-dump (mframe :: <gui-sniffer-frame>)
   let packet = mframe.packet-table.gadget-value;
   let tree = mframe.packet-tree-view;
-  let frame-field = tree.gadget-items[tree.gadget-selection[0]];
-  let off = compute-absolute-offset(frame-field);
+  let selected-packet = tree.gadget-items[tree.gadget-selection[0]];
+  
+  let off = compute-absolute-offset(selected-packet);
 
-  let start-highlight = off + frame-field.start-offset;
-  let end-highlight = off + frame-field.end-offset;
+  let start-highlight = off;
+  let end-highlight = off + compute-length(selected-packet);
 
   format-out("start %d end %d\n",
              start-highlight,
@@ -378,7 +457,7 @@
 end;
 
 define class <frame-with-metadata> (<object>)
-  constant slot real-frame :: <ethernet-frame>, required-init-keyword: frame:;
+  constant slot real-frame :: <container-frame>, required-init-keyword: frame:;
   constant slot number :: <integer> = counter();
   constant slot receive-time :: <date> = current-date(), init-keyword: receive-time:;
 end;



More information about the chatter mailing list