[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