diff --git a/src/as/com/threerings/bureau/Log.as b/src/as/com/threerings/bureau/Log.as
new file mode 100644
index 000000000..93c480cbf
--- /dev/null
+++ b/src/as/com/threerings/bureau/Log.as
@@ -0,0 +1,60 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau {
+
+import com.threerings.util.Log;
+
+/**
+ * Contains a reference to the log object used by the Bureau services.
+ */
+public class Log
+{
+ /** We dispatch our log messages through this log. */
+ public static const log :com.threerings.util.Log =
+ com.threerings.util.Log.getLog(com.threerings.bureau.Log);
+
+ /** Convenience function. */
+ public static function debug (message :String) :void
+ {
+ log.debug(message);
+ }
+
+ /** Convenience function. */
+ public static function info (message :String) :void
+ {
+ log.info(message);
+ }
+
+ /** Convenience function. */
+ public static function warning (message :String) :void
+ {
+ log.warning(message);
+ }
+
+ /** Convenience function. */
+ public static function logStackTrace (e :Error) :void
+ {
+ log.logStackTrace(e);
+ }
+}
+
+}
diff --git a/src/as/com/threerings/bureau/client/Agent.as b/src/as/com/threerings/bureau/client/Agent.as
new file mode 100644
index 000000000..87085ef46
--- /dev/null
+++ b/src/as/com/threerings/bureau/client/Agent.as
@@ -0,0 +1,61 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.client {
+
+import com.threerings.bureau.data.AgentObject;
+
+/**
+ * Represents an agent running within a bureau client.
+ */
+public class Agent
+{
+ /**
+ * Initializes the Agent with the distributed agent object.
+ */
+ public function init (agentObj :AgentObject) :void
+ {
+ _agentObj = agentObj;
+ }
+
+ /**
+ * Starts the code running in the agent.
+ */
+ public function start () :void
+ {
+ throw new Error("Abstract method");
+ }
+
+ /**
+ * Stops the code running in the agent.
+ */
+ public function stop () :void
+ {
+ throw new Error("Abstract method");
+ }
+
+ /**
+ * The shared agent object.
+ */
+ protected var _agentObj :AgentObject;
+}
+
+}
diff --git a/src/as/com/threerings/bureau/client/BureauClient.as b/src/as/com/threerings/bureau/client/BureauClient.as
new file mode 100644
index 000000000..9ec2d56d9
--- /dev/null
+++ b/src/as/com/threerings/bureau/client/BureauClient.as
@@ -0,0 +1,115 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.client {
+
+import com.threerings.presents.client.Client;
+import com.threerings.bureau.data.BureauCredentials;
+import com.threerings.bureau.util.BureauContext;
+import com.threerings.presents.dobj.DObjectManager;
+
+/**
+ * Represents a client embedded in a bureau.
+ */
+public class BureauClient extends Client
+{
+ /**
+ * Creates a new client.
+ * @param creds the credentials supplied during connection
+ * @param runQueue the place to post tasks required by clients
+ */
+ public function BureauClient (token :String, bureauId :String)
+ {
+ super(null);
+
+ _bureauId = bureauId;
+
+ var creds :BureauCredentials = new BureauCredentials(_bureauId);
+ creds.sessionToken = token;
+ _creds = creds;
+
+ _ctx = createContext();
+ _director = createDirector();
+ }
+
+ public function getBureauDirector () :BureauDirector
+ {
+ return _director;
+ }
+
+ public function getBureauId () :String
+ {
+ return _bureauId;
+ }
+
+ protected function createDirector () :BureauDirector
+ {
+ throw new Error("Abstract method");
+ }
+
+ protected function createContext () :BureauContext
+ {
+ return new Context(this);
+ }
+
+ protected var _ctx :BureauContext;
+ protected var _bureauId :String;
+ protected var _director :BureauDirector;
+}
+
+}
+
+import com.threerings.bureau.client.BureauClient;
+import com.threerings.bureau.client.BureauDirector;
+import com.threerings.presents.dobj.DObjectManager;
+import com.threerings.presents.client.Client;
+import com.threerings.bureau.util.BureauContext;
+
+class Context
+ implements BureauContext
+{
+ function Context (client :BureauClient)
+ {
+ _client = client;
+ }
+
+ public function getBureauDirector () :BureauDirector
+ {
+ return _client.getBureauDirector();
+ }
+
+ public function getDObjectManager () :DObjectManager
+ {
+ return _client.getDObjectManager();
+ }
+
+ public function getClient () :Client
+ {
+ return _client;
+ }
+
+ public function getBureauId () :String
+ {
+ return _client.getBureauId();
+ }
+
+ protected var _client :BureauClient;
+}
diff --git a/src/as/com/threerings/bureau/client/BureauDecoder.as b/src/as/com/threerings/bureau/client/BureauDecoder.as
new file mode 100644
index 000000000..258ffce15
--- /dev/null
+++ b/src/as/com/threerings/bureau/client/BureauDecoder.as
@@ -0,0 +1,80 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.client {
+
+import com.threerings.bureau.client.BureauReceiver;
+import com.threerings.presents.client.InvocationDecoder;
+
+/**
+ * Dispatches calls to a {@link BureauReceiver} instance.
+ */
+public class BureauDecoder extends InvocationDecoder
+{
+ /** The generated hash code used to identify this receiver class. */
+ public static const RECEIVER_CODE :String = "3e98f7a30deb5a8e25e05c71c6081bf4";
+
+ /** The method id used to dispatch {@link BureauReceiver#createAgent}
+ * notifications. */
+ public static const CREATE_AGENT :int = 1;
+
+ /** The method id used to dispatch {@link BureauReceiver#destroyAgent}
+ * notifications. */
+ public static const DESTROY_AGENT :int = 2;
+
+ /**
+ * Creates a decoder that may be registered to dispatch invocation
+ * service notifications to the specified receiver.
+ */
+ public function BureauDecoder (receiver :BureauReceiver)
+ {
+ this.receiver = receiver;
+ }
+
+ // documentation inherited
+ public override function getReceiverCode () :String
+ {
+ return RECEIVER_CODE;
+ }
+
+ // documentation inherited
+ public override function dispatchNotification (methodId :int, args :Array) :void
+ {
+ switch (methodId) {
+ case CREATE_AGENT:
+ BureauReceiver(receiver).createAgent(
+ args[0] as int
+ );
+ return;
+
+ case DESTROY_AGENT:
+ BureauReceiver(receiver).destroyAgent(
+ args[0] as int
+ );
+ return;
+
+ default:
+ super.dispatchNotification(methodId, args);
+ return;
+ }
+ }
+}
+}
diff --git a/src/as/com/threerings/bureau/client/BureauDirector.as b/src/as/com/threerings/bureau/client/BureauDirector.as
new file mode 100644
index 000000000..d7d7841f0
--- /dev/null
+++ b/src/as/com/threerings/bureau/client/BureauDirector.as
@@ -0,0 +1,186 @@
+package com.threerings.bureau.client {
+
+import com.threerings.presents.client.BasicDirector;
+import com.threerings.presents.data.ClientObject;
+import com.threerings.bureau.data.BureauCodes;
+import com.threerings.bureau.data.AgentObject;
+import com.threerings.bureau.Log;
+import com.threerings.bureau.util.BureauContext;
+import com.threerings.presents.client.Client;
+import com.threerings.presents.dobj.Subscriber;
+import com.threerings.presents.dobj.SubscriberAdapter;
+import com.threerings.presents.util.SafeSubscriber;
+import com.threerings.presents.dobj.ObjectAccessError;
+import com.threerings.util.HashMap;
+import com.threerings.presents.client.ClientEvent;
+
+/**
+ * Allows the server to create and destroy agents on a client.
+ * @see BureauRegistry
+ */
+public class BureauDirector extends BasicDirector
+{
+ /**
+ * Creates a new BureauDirector.
+ */
+ public function BureauDirector (ctx :BureauContext)
+ {
+ super(ctx);
+ }
+
+ // from BasicDirector
+ public override function clientDidLogon (event :ClientEvent) :void
+ {
+ super.clientDidLogon(event);
+ var id :String = BureauContext(_ctx).getBureauId();
+ _bureauService.bureauInitialized(_ctx.getClient(), id);
+ }
+
+ /**
+ * Creates a new agent when the server requests it.
+ */
+ protected function createAgentFromId (agentId :int) :void
+ {
+ var delegator :Subscriber =
+ new SubscriberAdapter(objectAvailable, requestFailed);
+
+ Log.info("Subscribing to object " + agentId);
+
+ var subscriber :SafeSubscriber =
+ new SafeSubscriber(agentId, delegator);
+ _subscribers.put(agentId, subscriber);
+ subscriber.subscribe(_ctx.getDObjectManager());
+ }
+
+ /**
+ * Destroys an agent at the server's request.
+ */
+ protected function destroyAgent (agentId :int) :void
+ {
+ var agent :Agent = null;
+ agent = _agents.remove(agentId);
+
+ if (agent == null) {
+ Log.warning("Lost an agent, id " + agentId);
+ }
+ else {
+ try {
+ agent.stop();
+ }
+ catch (e :Error) {
+ Log.warning("Stopping an agent caused an exception");
+ Log.logStackTrace(e);
+ }
+ var subscriber :SafeSubscriber = _subscribers.remove(agentId);
+ if (subscriber == null) {
+ Log.warning("Lost a subscriber for agent " + agent);
+ }
+ else {
+ subscriber.unsubscribe(_ctx.getDObjectManager());
+ }
+ _bureauService.agentDestroyed(_ctx.getClient(), agentId);
+ }
+ }
+
+ /**
+ * Callback for when the a request to subscribe to an object finishes and the object is available.
+ */
+ protected function objectAvailable (agentObject :AgentObject) :void
+ {
+ var oid :int = agentObject.getOid();
+
+ Log.info("Object " + oid + " now available");
+
+ var agent :Agent;
+ try {
+ agent = createAgent(agentObject);
+ agent.init(agentObject);
+ agent.start();
+ }
+ catch (e :Error) {
+ Log.warning("Could not create agent [obj=" + agentObject + "]");
+ Log.logStackTrace(e);
+ _bureauService.agentCreationFailed(_ctx.getClient(), oid);
+ return;
+ }
+
+ _agents.put(oid, agent);
+ _bureauService.agentCreated(_ctx.getClient(), oid);
+ }
+
+ /**
+ * Callback for when the a request to subscribe to an object fails.
+ */
+ protected function requestFailed (oid :int, cause :ObjectAccessError) :void
+ {
+ Log.warning("Could not subscribe to agent [oid=" + oid + "]");
+ Log.logStackTrace(cause);
+ }
+
+ // from BasicDirector
+ protected override function registerServices (client :Client) :void
+ {
+ super.registerServices(client);
+
+ // Require the bureau services
+ client.addServiceGroup(BureauCodes.BUREAU_GROUP);
+
+ // Set up our decoder so we can receive method calls
+ // from the server
+ var receiver :BureauReceiver =
+ new ReceiverDelegator(createAgentFromId, destroyAgent);
+
+ client.getInvocationDirector().
+ registerReceiver(new BureauDecoder(receiver));
+ }
+
+ // from BasicDirector
+ protected override function fetchServices (client :Client) :void
+ {
+ super.fetchServices(client);
+
+ _bureauService = client.getService(BureauService) as BureauService;
+ }
+
+ /**
+ * Called when it is time to create an Agent. Subclasses should read the
+ * agentObject's type and/or properties to determine what kind of Agent to
+ * create.
+ * @param agentObj the distributed and object
+ * @return a new Agent that will govern the distributed object
+ */
+ protected function createAgent (agentObj :AgentObject) :Agent
+ {
+ throw new Error("Abstract function");
+ }
+
+ protected var _bureauService :BureauService;
+ protected var _agents :HashMap = new HashMap();
+ protected var _subscribers :HashMap = new HashMap();
+}
+}
+
+import com.threerings.bureau.client.BureauReceiver;
+
+class ReceiverDelegator implements BureauReceiver
+{
+ public function ReceiverDelegator (createFn :Function, destroyFn :Function)
+ {
+ _createFn = createFn;
+ _destroyFn = destroyFn;
+ }
+
+ public function createAgent (agentId :int) :void
+ {
+ _createFn(agentId);
+ }
+
+ public function destroyAgent (agentId :int) :void
+ {
+ _destroyFn(agentId);
+ }
+
+ protected var _createFn :Function;
+ protected var _destroyFn :Function;
+}
+
diff --git a/src/as/com/threerings/bureau/client/BureauReceiver.as b/src/as/com/threerings/bureau/client/BureauReceiver.as
new file mode 100644
index 000000000..f2e915691
--- /dev/null
+++ b/src/as/com/threerings/bureau/client/BureauReceiver.as
@@ -0,0 +1,50 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.client {
+
+import com.threerings.presents.client.InvocationReceiver;
+
+/**
+ * Hooks for controlling a previously launched bureau client.
+ */
+public interface BureauReceiver extends InvocationReceiver
+{
+ /**
+ * Creates a new agent. Implementors should create a new {@link Agent} and give it access to
+ * the {@link AgentObject} referred to by the agentId parameter and must notify
+ * the service that the agent has been created using {@link BureauService#agentCreated}.
+ * @param client the client receiving the request
+ * @param agentId the id of the AgentObject that needs an Agent
+ */
+ function createAgent (agentId :int) :void;
+
+ /**
+ * Destroys a previously created agent. Implementors should destroy the agent that was created
+ * by the call to createAgent with the same agent id and must notify
+ * the service that the agent has been created using {@link BureauService#agentDestroyed}.
+ * @param client the client receiving the request
+ * @param agentId the id of the AgentObject whose Agent
+ * should be destroyed
+ */
+ function destroyAgent (agentId :int) :void;
+}
+}
diff --git a/src/as/com/threerings/bureau/client/BureauService.as b/src/as/com/threerings/bureau/client/BureauService.as
new file mode 100644
index 000000000..33160df6c
--- /dev/null
+++ b/src/as/com/threerings/bureau/client/BureauService.as
@@ -0,0 +1,44 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.client {
+
+import com.threerings.presents.client.Client;
+import com.threerings.presents.client.InvocationService;
+
+/**
+ * An ActionScript version of the Java BureauService interface.
+ */
+public interface BureauService extends InvocationService
+{
+ // from Java interface BureauService
+ function agentCreated (arg1 :Client, arg2 :int) :void;
+
+ // from Java interface BureauService
+ function agentCreationFailed (arg1 :Client, arg2 :int) :void;
+
+ // from Java interface BureauService
+ function agentDestroyed (arg1 :Client, arg2 :int) :void;
+
+ // from Java interface BureauService
+ function bureauInitialized (arg1 :Client, arg2 :String) :void;
+}
+}
diff --git a/src/as/com/threerings/bureau/data/AgentObject.as b/src/as/com/threerings/bureau/data/AgentObject.as
new file mode 100644
index 000000000..da6b846c2
--- /dev/null
+++ b/src/as/com/threerings/bureau/data/AgentObject.as
@@ -0,0 +1,102 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.data {
+
+import com.threerings.presents.dobj.DObject;
+
+public class AgentObject extends DObject
+{
+ // AUTO-GENERATED: FIELDS START
+ /** The field name of the bureauId field. */
+ public static const BUREAU_ID :String = "bureauId";
+
+ /** The field name of the bureauType field. */
+ public static const BUREAU_TYPE :String = "bureauType";
+
+ /** The field name of the agentCode field. */
+ public static const AGENT_CODE :String = "agentCode";
+ // AUTO-GENERATED: FIELDS END
+
+ /** The id of the bureau the agent is running in. This is normally a unique id corresponding
+ * to the game or item that requires some server-side processing. */
+ public var bureauId :String;
+
+ /** The type of bureau that the agent is running in. This is normally derived from the kind
+ * of media that the game or item has specified for its code and determines the method of
+ * launching the bureau when the first agent is requested. */
+ public var bureauType :String;
+
+ /** The location of the code for the agent. This could be a URL to an action script file or
+ * some other description that the bureau can use to load and execute the agent's code. */
+ public var agentCode :String;
+
+ // AUTO-GENERATED: METHODS START
+ /**
+ * Requests that the bureauId field be set to the
+ * specified value. The local value will be updated immediately and an
+ * event will be propagated through the system to notify all listeners
+ * that the attribute did change. Proxied copies of this object (on
+ * clients) will apply the value change when they received the
+ * attribute changed notification.
+ */
+ public function setBureauId (value :String) :void
+ {
+ var ovalue :String = this.bureauId;
+ requestAttributeChange(
+ BUREAU_ID, value, ovalue);
+ this.bureauId = value;
+ }
+
+ /**
+ * Requests that the bureauType field be set to the
+ * specified value. The local value will be updated immediately and an
+ * event will be propagated through the system to notify all listeners
+ * that the attribute did change. Proxied copies of this object (on
+ * clients) will apply the value change when they received the
+ * attribute changed notification.
+ */
+ public function setBureauType (value :String) :void
+ {
+ var ovalue :String = this.bureauType;
+ requestAttributeChange(
+ BUREAU_TYPE, value, ovalue);
+ this.bureauType = value;
+ }
+
+ /**
+ * Requests that the agentCode field be set to the
+ * specified value. The local value will be updated immediately and an
+ * event will be propagated through the system to notify all listeners
+ * that the attribute did change. Proxied copies of this object (on
+ * clients) will apply the value change when they received the
+ * attribute changed notification.
+ */
+ public function setAgentCode (value :String) :void
+ {
+ var ovalue :String = this.agentCode;
+ requestAttributeChange(
+ AGENT_CODE, value, ovalue);
+ this.agentCode = value;
+ }
+ // AUTO-GENERATED: METHODS END
+}
+}
diff --git a/src/as/com/threerings/bureau/data/BureauClientObject.as b/src/as/com/threerings/bureau/data/BureauClientObject.as
new file mode 100644
index 000000000..f82fb3cb1
--- /dev/null
+++ b/src/as/com/threerings/bureau/data/BureauClientObject.as
@@ -0,0 +1,33 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.data {
+
+import com.threerings.presents.dobj.DObject;
+
+/**
+ * Defines the fields available for the distributed part of a bureau.
+ */
+public class BureauClientObject extends DObject
+{
+ // TODO: add some fields
+}
+}
diff --git a/src/as/com/threerings/bureau/data/BureauCodes.as b/src/as/com/threerings/bureau/data/BureauCodes.as
new file mode 100644
index 000000000..ddf139996
--- /dev/null
+++ b/src/as/com/threerings/bureau/data/BureauCodes.as
@@ -0,0 +1,34 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.data {
+
+import com.threerings.presents.data.InvocationCodes;
+
+/**
+ * Codes and constants global to the Bureau services.
+ */
+public class BureauCodes extends InvocationCodes
+{
+ /** Defines our invocation services group. */
+ public static const BUREAU_GROUP :String = "bureau";
+}
+}
diff --git a/src/as/com/threerings/bureau/data/BureauCredentials.as b/src/as/com/threerings/bureau/data/BureauCredentials.as
new file mode 100644
index 000000000..95e4dcad3
--- /dev/null
+++ b/src/as/com/threerings/bureau/data/BureauCredentials.as
@@ -0,0 +1,71 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.data {
+
+import com.threerings.presents.net.Credentials;
+import com.threerings.util.Name;
+import com.threerings.io.ObjectInputStream;
+import com.threerings.io.ObjectOutputStream;
+import com.threerings.util.StringBuilder;
+
+/**
+ * Extends the basic credentials to provide bureau-specific fields.
+ */
+public class BureauCredentials extends Credentials
+{
+ /**
+ * The token to pass to the server when logging in. This is usually just passed to the bureau
+ * on the command line to guard against outside connections being established.
+ */
+ public var sessionToken :String;
+
+ /**
+ * Creates new credentials for a specific bureau.
+ */
+ public function BureauCredentials (token :String)
+ {
+ super(null);
+ sessionToken = token;
+ }
+
+ /** @inheritDoc */
+ override protected function toStringBuf (buf :StringBuilder) :void
+ {
+ super.toStringBuf(buf);
+ buf.append(" token=").append(sessionToken);
+ }
+
+ // from interface Streamable
+ override public function readObject (ins :ObjectInputStream) :void
+ {
+ super.readObject(ins);
+ sessionToken = (ins.readField(String) as String);
+ }
+
+ // from interface Streamable
+ override public function writeObject (out :ObjectOutputStream) :void
+ {
+ super.writeObject(out);
+ out.writeField(sessionToken);
+ }
+}
+}
diff --git a/src/as/com/threerings/bureau/data/BureauMarshaller.as b/src/as/com/threerings/bureau/data/BureauMarshaller.as
new file mode 100644
index 000000000..3e6da4d7f
--- /dev/null
+++ b/src/as/com/threerings/bureau/data/BureauMarshaller.as
@@ -0,0 +1,83 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2008 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.data {
+
+import com.threerings.bureau.client.BureauService;
+import com.threerings.presents.client.Client;
+import com.threerings.presents.data.InvocationMarshaller;
+import com.threerings.util.Integer;
+
+/**
+ * Provides the implementation of the {@link BureauService} interface
+ * that marshalls the arguments and delivers the request to the provider
+ * on the server. Also provides an implementation of the response listener
+ * interfaces that marshall the response arguments and deliver them back
+ * to the requesting client.
+ */
+public class BureauMarshaller extends InvocationMarshaller
+ implements BureauService
+{
+ /** The method id used to dispatch {@link #agentCreated} requests. */
+ public static const AGENT_CREATED :int = 1;
+
+ // from interface BureauService
+ public function agentCreated (arg1 :Client, arg2 :int) :void
+ {
+ sendRequest(arg1, AGENT_CREATED, [
+ Integer.valueOf(arg2)
+ ]);
+ }
+
+ /** The method id used to dispatch {@link #agentCreationFailed} requests. */
+ public static const AGENT_CREATION_FAILED :int = 2;
+
+ // from interface BureauService
+ public function agentCreationFailed (arg1 :Client, arg2 :int) :void
+ {
+ sendRequest(arg1, AGENT_CREATION_FAILED, [
+ Integer.valueOf(arg2)
+ ]);
+ }
+
+ /** The method id used to dispatch {@link #agentDestroyed} requests. */
+ public static const AGENT_DESTROYED :int = 3;
+
+ // from interface BureauService
+ public function agentDestroyed (arg1 :Client, arg2 :int) :void
+ {
+ sendRequest(arg1, AGENT_DESTROYED, [
+ Integer.valueOf(arg2)
+ ]);
+ }
+
+ /** The method id used to dispatch {@link #bureauInitialized} requests. */
+ public static const BUREAU_INITIALIZED :int = 4;
+
+ // from interface BureauService
+ public function bureauInitialized (arg1 :Client, arg2 :String) :void
+ {
+ sendRequest(arg1, BUREAU_INITIALIZED, [
+ arg2
+ ]);
+ }
+}
+}
diff --git a/src/as/com/threerings/bureau/util/BureauContext.as b/src/as/com/threerings/bureau/util/BureauContext.as
new file mode 100644
index 000000000..34ecd7b8a
--- /dev/null
+++ b/src/as/com/threerings/bureau/util/BureauContext.as
@@ -0,0 +1,44 @@
+//
+// $Id$
+//
+// Narya library - tools for developing networked games
+// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved
+// http://www.threerings.net/code/narya/
+//
+// This library is free software; you can redistribute it and/or modify it
+// under the terms of the GNU Lesser General Public License as published
+// by the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package com.threerings.bureau.util {
+
+import com.threerings.presents.util.PresentsContext;
+import com.threerings.bureau.client.BureauDirector;
+
+/**
+ * Defines the objects held on a bureau client. This includes usual set of objects found on a
+ * standard presents client.
+ */
+public interface BureauContext extends PresentsContext
+{
+ /**
+ * Access the director object.
+ */
+ function getBureauDirector () :BureauDirector;
+
+ /**
+ * Access the bureau id.
+ */
+ function getBureauId () :String;
+}
+
+}
diff --git a/src/java/com/threerings/bureau/client/BureauClient.java b/src/java/com/threerings/bureau/client/BureauClient.java
index f37f5bbe4..03e552ce1 100644
--- a/src/java/com/threerings/bureau/client/BureauClient.java
+++ b/src/java/com/threerings/bureau/client/BureauClient.java
@@ -22,7 +22,6 @@
package com.threerings.bureau.client;
import com.threerings.presents.client.Client;
-import com.threerings.presents.net.Credentials;
import com.samskivert.util.RunQueue;
import com.threerings.bureau.data.BureauCredentials;
import com.threerings.bureau.util.BureauContext;
diff --git a/src/java/com/threerings/bureau/client/BureauDirector.java b/src/java/com/threerings/bureau/client/BureauDirector.java
index 452ec194c..e098adc37 100644
--- a/src/java/com/threerings/bureau/client/BureauDirector.java
+++ b/src/java/com/threerings/bureau/client/BureauDirector.java
@@ -1,7 +1,6 @@
package com.threerings.bureau.client;
import com.threerings.presents.client.BasicDirector;
-import com.threerings.presents.data.ClientObject;
import com.threerings.bureau.data.BureauCodes;
import com.samskivert.util.IntMap;
import com.samskivert.util.IntMaps;
diff --git a/src/java/com/threerings/bureau/data/BureauCredentials.java b/src/java/com/threerings/bureau/data/BureauCredentials.java
index 2a6ddce55..a9bc5efa8 100644
--- a/src/java/com/threerings/bureau/data/BureauCredentials.java
+++ b/src/java/com/threerings/bureau/data/BureauCredentials.java
@@ -50,6 +50,13 @@ public class BureauCredentials extends Credentials
super(new Name("@@bureau:" + bureauId + "@@"));
}
+ @Override // inherit documentation
+ protected void toString (StringBuilder buf)
+ {
+ super.toString(buf);
+ buf.append(" token=").append(sessionToken);
+ }
+
// inherit documentation - from Object
public String toString ()
{