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

hannes at gwydiondylan.org hannes at gwydiondylan.org
Tue Nov 21 23:04:41 CET 2006


Author: hannes
Date: Tue Nov 21 23:04:39 2006
New Revision: 10980

Modified:
   trunk/libraries/packetizer/fields.dylan
   trunk/libraries/packetizer/module.dylan
   trunk/libraries/packetizer/packetizer.dylan
Log:
Bug: 7299
 * fixed protocol stacking during assembly (layering-fields have a fixup-function now)
 * fixed assembling of frames
  * assemble-frame is not destructive on it's argument
  * assemble-frame! is destructive
 * implemented copy-frame

Modified: trunk/libraries/packetizer/fields.dylan
==============================================================================
--- trunk/libraries/packetizer/fields.dylan	(original)
+++ trunk/libraries/packetizer/fields.dylan	Tue Nov 21 23:04:39 2006
@@ -27,7 +27,7 @@
   for (field in list)
     if (instance?(field, <layering-field>))
       unless (field.fixup-function)
-        field.fixup-function := payload-type;
+        field.fixup-function := fixup-protocol-magic;
       end;
     end;
     if (start ~= $unknown-at-compile-time)

Modified: trunk/libraries/packetizer/module.dylan
==============================================================================
--- trunk/libraries/packetizer/module.dylan	(original)
+++ trunk/libraries/packetizer/module.dylan	Tue Nov 21 23:04:39 2006
@@ -84,6 +84,8 @@
     <leaf-frame>,
     parse-frame,
     assemble-frame,
+    assemble-frame!,
+    copy-frame,
     assemble-frame-as,
     read-frame,
     summary;

Modified: trunk/libraries/packetizer/packetizer.dylan
==============================================================================
--- trunk/libraries/packetizer/packetizer.dylan	(original)
+++ trunk/libraries/packetizer/packetizer.dylan	Tue Nov 21 23:04:39 2006
@@ -260,6 +260,10 @@
   element(table, frame.layer-magic, default: <raw-frame>);
 end;
 
+define inline method fixup-protocol-magic (frame :: <header-frame>) => (magic)
+  get-protocol-magic(frame, frame.payload);
+end;
+
 define inline method get-protocol-magic (frame :: <header-frame>, payload :: <frame>) => (magic)
   let reverse-layering = reverse-layer(frame.object-class);
   let res = element(reverse-layering, decoded-class(payload.object-class), default: #f);
@@ -354,6 +358,11 @@
 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>)
   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);
@@ -380,6 +389,18 @@
             end, fields(frame)))
 end;
 
+define method copy-frame (frame :: <container-frame>) => (res :: <container-frame>)
+  let res = make(decoded-class(frame.object-class));
+  for (field in frame.fields)
+    field.setter(copy-frame(field.getter(frame)), res);
+  end;
+  res;
+end;
+
+define method copy-frame (frame) => (res)
+  frame;
+end;
+
 define method assemble-frame-into (frame :: <container-frame>,
                                    packet :: <stretchy-vector-subsequence>) => (res :: <integer>)
   let offset :: <integer> = 0;



More information about the chatter mailing list