Fixed up some things and added streaming translations.
I'm to the point where I need to go back to array streaming and straighten that out. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3905 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -8,6 +8,8 @@ import flash.util.IDataInput;
|
|||||||
import com.threerings.util.ClassUtil;
|
import com.threerings.util.ClassUtil;
|
||||||
import com.threerings.util.SimpleMap;
|
import com.threerings.util.SimpleMap;
|
||||||
|
|
||||||
|
import com.threerings.presents.Log;
|
||||||
|
|
||||||
public class ObjectInputStream
|
public class ObjectInputStream
|
||||||
{
|
{
|
||||||
public function ObjectInputStream (source :IDataInput = null)
|
public function ObjectInputStream (source :IDataInput = null)
|
||||||
@@ -26,6 +28,14 @@ public class ObjectInputStream
|
|||||||
_source = source;
|
_source = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a translation that should be used when writing objects.
|
||||||
|
*/
|
||||||
|
public function addTranslation (oldName :String, newName :String) :void
|
||||||
|
{
|
||||||
|
_translations[oldName] = newName;
|
||||||
|
}
|
||||||
|
|
||||||
public function readObject () :Object
|
public function readObject () :Object
|
||||||
//throws IOError
|
//throws IOError
|
||||||
{
|
{
|
||||||
@@ -48,6 +58,12 @@ public class ObjectInputStream
|
|||||||
|
|
||||||
// read in the class metadata
|
// read in the class metadata
|
||||||
var cname :String = readUTF();
|
var cname :String = readUTF();
|
||||||
|
Log.debug("read cname: " + cname);
|
||||||
|
// if we have a translation, use it
|
||||||
|
var tname :String = _translations[cname];
|
||||||
|
if (tname != null) {
|
||||||
|
cname = tname;
|
||||||
|
}
|
||||||
var streamer :Streamer = Streamer.getStreamerByJavaName(cname);
|
var streamer :Streamer = Streamer.getStreamerByJavaName(cname);
|
||||||
|
|
||||||
cmap = new ClassMapping(code, cname, streamer);
|
cmap = new ClassMapping(code, cname, streamer);
|
||||||
@@ -199,5 +215,9 @@ public class ObjectInputStream
|
|||||||
|
|
||||||
/** A map of short class code to ClassMapping info. */
|
/** A map of short class code to ClassMapping info. */
|
||||||
protected var _classMap :Array = new Array();
|
protected var _classMap :Array = new Array();
|
||||||
|
|
||||||
|
/** An collection of class name translations to use when unserializing
|
||||||
|
* objects. */
|
||||||
|
protected var _translations :SimpleMap = new SimpleMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,15 @@ public class ObjectOutputStream
|
|||||||
_targ = targ;
|
_targ = targ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a classname translation for rewriting the names of objects
|
||||||
|
* that we send to the server.
|
||||||
|
*/
|
||||||
|
public function addTranslation (oldName :String, newName :String) :void
|
||||||
|
{
|
||||||
|
_translations[oldName] = newName;
|
||||||
|
}
|
||||||
|
|
||||||
public function writeObject (obj :Object) :void
|
public function writeObject (obj :Object) :void
|
||||||
//throws IOError
|
//throws IOError
|
||||||
{
|
{
|
||||||
@@ -43,6 +52,12 @@ public class ObjectOutputStream
|
|||||||
|
|
||||||
// TODO: if _nextCode blows short, log an error
|
// TODO: if _nextCode blows short, log an error
|
||||||
|
|
||||||
|
// see if there's a translation we should use
|
||||||
|
var tname :String = _translations[cname];
|
||||||
|
if (tname != null) {
|
||||||
|
cname = tname;
|
||||||
|
}
|
||||||
|
|
||||||
writeShort(-cmap.code);
|
writeShort(-cmap.code);
|
||||||
writeUTF((streamer == null) ? cname : streamer.getJavaClassName());
|
writeUTF((streamer == null) ? cname : streamer.getJavaClassName());
|
||||||
|
|
||||||
@@ -183,7 +198,10 @@ public class ObjectOutputStream
|
|||||||
/** The streamer being used currently. */
|
/** The streamer being used currently. */
|
||||||
protected var _streamer :Streamer;
|
protected var _streamer :Streamer;
|
||||||
|
|
||||||
/** A map of classname to ClassMapping inffaro. */
|
/** A map of classname to ClassMapping info. */
|
||||||
protected var _classMap :SimpleMap = new SimpleMap();
|
protected var _classMap :SimpleMap = new SimpleMap();
|
||||||
|
|
||||||
|
/** A map of classname translations. */
|
||||||
|
protected var _translations :SimpleMap = new SimpleMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,9 +95,9 @@ public class Client extends EventDispatcher
|
|||||||
public function getService (clazz :Class) :InvocationService
|
public function getService (clazz :Class) :InvocationService
|
||||||
{
|
{
|
||||||
if (_bstrap != null) {
|
if (_bstrap != null) {
|
||||||
for each (var service :InvocationService in _bstrap.services) {
|
for each (var isvc :InvocationService in _bstrap.services.source) {
|
||||||
if (service is clazz) {
|
if (isvc is clazz) {
|
||||||
return service;
|
return isvc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,6 +190,8 @@ public class Client extends EventDispatcher
|
|||||||
_cloid = data.clientOid;
|
_cloid = data.clientOid;
|
||||||
|
|
||||||
_invdir.init(omgr, _cloid, this);
|
_invdir.init(omgr, _cloid, this);
|
||||||
|
|
||||||
|
Log.debug("TimeBaseService: " + requireService(TimeBaseService));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -298,8 +298,7 @@ public class ClientDObjectMgr
|
|||||||
_ocache[oid] = obj;
|
_ocache[oid] = obj;
|
||||||
|
|
||||||
// let the penders know that the object is available
|
// let the penders know that the object is available
|
||||||
var req :PendingRequest = _penders[oid];
|
var req :PendingRequest = (_penders.remove(oid) as PendingRequest);
|
||||||
_penders[oid] = undefined;
|
|
||||||
if (req == null) {
|
if (req == null) {
|
||||||
Log.warning("Got object, but no one cares?! " +
|
Log.warning("Got object, but no one cares?! " +
|
||||||
"[oid=" + oid + ", obj=" + obj + "].");
|
"[oid=" + oid + ", obj=" + obj + "].");
|
||||||
@@ -368,7 +367,7 @@ public class ClientDObjectMgr
|
|||||||
// otherwise we need to create a new request
|
// otherwise we need to create a new request
|
||||||
req = new PendingRequest(oid);
|
req = new PendingRequest(oid);
|
||||||
req.addTarget(target);
|
req.addTarget(target);
|
||||||
_penders.put(oid, req);
|
_penders[oid] = req;
|
||||||
// Log.info("Registering pending request [oid=" + oid + "].");
|
// Log.info("Registering pending request [oid=" + oid + "].");
|
||||||
|
|
||||||
// and issue a request to get things rolling
|
// and issue a request to get things rolling
|
||||||
|
|||||||
@@ -50,9 +50,19 @@ public class Communicator
|
|||||||
inputFrameReceived);
|
inputFrameReceived);
|
||||||
_inStream = new ObjectInputStream();
|
_inStream = new ObjectInputStream();
|
||||||
|
|
||||||
|
addClassTranslations();
|
||||||
|
|
||||||
_socket.connect(_client.getHostname(), _client.getPort());
|
_socket.connect(_client.getHostname(), _client.getPort());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function addClassTranslations () :void
|
||||||
|
{
|
||||||
|
_inStream.addTranslation("com.threerings.presents.dobj.DSet$Entry",
|
||||||
|
"com.threerings.presents.dobj.DSetEntry");
|
||||||
|
_outStream.addTranslation("com.threerings.presents.dobj.DSetEntry",
|
||||||
|
"com.threerings.presents.dobj.DSet$Entry");
|
||||||
|
}
|
||||||
|
|
||||||
public function logoff () :void
|
public function logoff () :void
|
||||||
{
|
{
|
||||||
if (_socket == null) {
|
if (_socket == null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user