[Gd-chatter] r10986 - trunk/libraries/packetizer

hannes at gwydiondylan.org hannes at gwydiondylan.org
Wed Nov 22 19:30:26 CET 2006


Author: hannes
Date: Wed Nov 22 19:30:24 2006
New Revision: 10986

Modified:
   trunk/libraries/packetizer/packetizer.dylan
Log:
Bug: 7299
fix for assembling <pcap-packet>s in the gui...
 the whole assembling is a mess, and should be properly designed.

Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan	(original)
+++ trunk/libraries/packetizer/packetizer.dylan	Wed Nov 22 19:30:24 2006
@@ -357,12 +357,19 @@
   reduce1(\+, map(curry(get-field-size-aux, frame), frame.fields));
 end;
 
+define method assemble-frame (frame :: <unparsed-container-frame>) => (packet :: <unparsed-container-frame>);
+  frame;
+end;
+
 define method assemble-frame (frame :: <container-frame>) => (packet :: <unparsed-container-frame>);
   let f = copy-frame(frame);
   assemble-frame!(f);
 end;
 
-define function assemble-frame! (frame :: <container-frame>) => (packet :: <unparsed-container-frame>)
+define method assemble-frame! (frame :: <unparsed-container-frame>) => (res :: <unparsed-container-frame>)
+  frame;
+end;
+define method assemble-frame! (frame :: <decoded-container-frame>) => (packet :: <unparsed-container-frame>)
   let result = make(<stretchy-byte-vector-subsequence>, data: make(<stretchy-byte-vector>, capacity: 1548));
   assemble-frame-into(frame, result);
   let uf = make(unparsed-class(frame.object-class), cache: frame, packet: result);
@@ -389,7 +396,15 @@
             end, fields(frame)))
 end;
 
-define method copy-frame (frame :: <container-frame>) => (res :: <container-frame>)
+define method copy-frame (frame :: <unparsed-container-frame>) => (res :: <container-frame>)
+  let my-cache = copy-frame(frame.cache);
+  make(unparsed-class(frame.object-class),
+       cache: my-cache,
+       packet: as(<stretchy-byte-vector-subsequence>, (copy-sequence(frame.packet))),
+       parent: frame.parent);
+end;
+
+define method copy-frame (frame :: <decoded-container-frame>) => (res :: <decoded-container-frame>)
   let res = make(decoded-class(frame.object-class));
   for (field in frame.fields)
     field.setter(copy-frame(field.getter(frame)), res);
@@ -428,7 +443,7 @@
     end;
     let length = offset + assemble-field-into(field, frame, subsequence(packet, start: offset));
     frame.concrete-frame-fields[field.index].%start-offset := offset;
-    if (instance?(field.getter(frame), <container-frame>))
+    if (instance?(field.getter(frame), <decoded-container-frame>))
       let unparsed = make(unparsed-class(field.getter(frame).object-class),
                           cache: field.getter(frame),
                           packet: subsequence(packet, start: offset, length: length),



More information about the chatter mailing list