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 () {