Fixed some bugs with reading data back from the server, including

subtracting 4 from the length of the frame and fixing the reading
of fields for which we have a basic streamer.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3885 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Ray Greenwell
2006-02-23 22:22:57 +00:00
parent 6d9d71256f
commit 465b680aa2
4 changed files with 46 additions and 46 deletions
+6 -1
View File
@@ -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;
}
@@ -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;
}
+33 -42
View File
@@ -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;
@@ -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);