diff --git a/src/as/com/threerings/io/FrameReader.as b/src/as/com/threerings/io/FrameReader.as index 4689de3c4..59772fdca 100644 --- a/src/as/com/threerings/io/FrameReader.as +++ b/src/as/com/threerings/io/FrameReader.as @@ -33,7 +33,12 @@ public class FrameReader extends EventDispatcher // all at once return; } - _length = _socket.readInt(); + // the length specified is the length of the entire frame, + // including the length of the bytes used to encode the length. + // (I think this is pretty silly). + // So for our purposes we subtract 4 bytes so we know how much + // more data is in the frame. + _length = _socket.readInt() - HEADER_SIZE; _curData = new ByteArray(); _curData.endian = Endian.BIG_ENDIAN; } diff --git a/src/as/com/threerings/io/ObjectInputStream.as b/src/as/com/threerings/io/ObjectInputStream.as index c8f056a7f..699257746 100644 --- a/src/as/com/threerings/io/ObjectInputStream.as +++ b/src/as/com/threerings/io/ObjectInputStream.as @@ -84,7 +84,7 @@ public class ObjectInputStream readBareObjectImpl(obj, Streamer.getStreamer(obj)); } - protected function readBareObjectImpl (obj :Object, streamer :Streamer) :void + internal function readBareObjectImpl (obj :Object, streamer :Streamer) :void { // streamable objects if (streamer == null) { @@ -110,8 +110,10 @@ public class ObjectInputStream //throws IOError { if (readBoolean()) { - var obj :Object = new clazz(); - return readBareObject(obj); + var streamer :Streamer = Streamer.getStreamerByClass(clazz); + var obj :Object = streamer.createObject(this); + streamer.readObject(obj, this); + return obj; } return null; } diff --git a/src/as/com/threerings/io/Streamer.as b/src/as/com/threerings/io/Streamer.as index 8c3415630..0dcaf7777 100644 --- a/src/as/com/threerings/io/Streamer.as +++ b/src/as/com/threerings/io/Streamer.as @@ -14,37 +14,30 @@ import com.threerings.io.streamers.StringStreamer; public class Streamer { - /* - public static function getStreamer (className :String) :Streamer - //throws IOError - { - if (_streamerMap == null) { - createStreamers(); - } - - var streamer :Streamer = _streamerMap[className]; - if (streamer == null) { - streamer = new Streamer(className); - _streamerMap[className] = streamer; - } - - return streamer; - } - */ - public static function getStreamer (obj :Object) :Streamer { if (obj is Streamable) { return null; } - if (_streamers == null) { - createStreamers(); + initStreamers(); + + for each (var streamer :Streamer in _streamers) { + if (streamer.isStreamerFor(obj)) { + return streamer; + } } - for (var ii :int = 0; ii < _streamers.length; ii++) { - if (_streamers[ii].isStreamerFor(obj)) { - return _streamers[ii]; + return undefined; + } + + public static function getStreamerByClass (clazz :Class) :Streamer + { + initStreamers(); + + for each (var streamer :Streamer in _streamers) { + if (streamer._targ == clazz) { + return streamer; } } @@ -53,13 +46,11 @@ public class Streamer public static function getStreamerByJavaName (jname :String) :Streamer { - if (_streamers == null) { - createStreamers(); - } + initStreamers(); - for (var ii :int = 0; ii < _streamers.length; ii++) { - if (_streamers[ii].getJavaClassName() === jname) { - return _streamers[ii]; + for each (var streamer :Streamer in _streamers) { + if (streamer.getJavaClassName() === jname) { + return streamer; } } @@ -116,21 +107,21 @@ public class Streamer } /** - * Creates our streamers table map and registers streamers for - * basic types. + * Initialize our streamers. This cannot simply be done statically + * because we cannot instantiate a subclass when this class is still + * being created. Fucking actionscript. */ - protected static function createStreamers () :void + private static function initStreamers () :void { - _streamers = new Array(); - - // add our default streamers - _streamers.push( - new StringStreamer(), - new IntStreamer(), - new NumberStreamer(), - new ArrayStreamer(), - new ByteArrayStreamer() - ); + if (_streamers == null) { + _streamers = [ + new StringStreamer(), + new IntStreamer(), + new NumberStreamer(), + new ArrayStreamer(), + new ByteArrayStreamer() + ]; + } } protected var _targ :Class; diff --git a/src/as/com/threerings/presents/client/Communicator.as b/src/as/com/threerings/presents/client/Communicator.as index a4849388e..acee2ec51 100644 --- a/src/as/com/threerings/presents/client/Communicator.as +++ b/src/as/com/threerings/presents/client/Communicator.as @@ -133,6 +133,8 @@ public class Communicator { // convert the frame data into a message from the server var frameData :ByteArray = event.getFrameData(); + //trace("length of in frame: " + frameData.length); + //trace("inBuffer: " + Util.bytesToString(frameData)); _inStream.setSource(frameData); var msg :DownstreamMessage = (_inStream.readObject() as DownstreamMessage);