From ad1edd6e69c2e0e5811173c4a09114582945755c Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 10 Mar 2005 02:06:43 +0000 Subject: [PATCH] Added standalone flag and special standalone logoff method to Client, options to BasicDirector to hold off on initializing directors not needed for standalone mode. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@3393 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/client/BasicDirector.java | 62 +++++++++++++++++-- .../threerings/presents/client/Client.java | 32 +++++++++- .../presents/client/Communicator.java | 4 +- 3 files changed, 89 insertions(+), 9 deletions(-) diff --git a/src/java/com/threerings/presents/client/BasicDirector.java b/src/java/com/threerings/presents/client/BasicDirector.java index 9ecd85cac..701650058 100644 --- a/src/java/com/threerings/presents/client/BasicDirector.java +++ b/src/java/com/threerings/presents/client/BasicDirector.java @@ -1,5 +1,5 @@ // -// $Id: BasicDirector.java,v 1.4 2004/08/27 02:20:17 mdb Exp $ +// $Id$ // // Narya library - tools for developing networked games // Copyright (C) 2002-2004 Three Rings Design, Inc., All Rights Reserved @@ -40,13 +40,18 @@ public class BasicDirector */ protected BasicDirector (PresentsContext ctx) { + // save context + _ctx = ctx; + // listen for session start and end Client client = ctx.getClient(); client.addClientObserver(this); // if we're already logged on, fire off a call to fetch services if (client.isLoggedOn()) { - fetchServices(client); + if (isAvailable()) { + fetchServices(client); + } clientObjectUpdated(client); } } @@ -54,7 +59,9 @@ public class BasicDirector // documentation inherited from interface public void clientDidLogon (Client client) { - fetchServices(client); + if (isAvailable()) { + fetchServices(client); + } clientObjectUpdated(client); } @@ -69,6 +76,43 @@ public class BasicDirector { } + /** + * Sets whether or not this director is available in standalone mode. + */ + public void setAvailableInStandalone (boolean available) + { + _availableInStandalone = available; + } + + /** + * Checks whether or not this director is available in standalone mode + * (defaults to false). + */ + public boolean isAvailableInStandalone () + { + return _availableInStandalone; + } + + /** + * Checks whether this director is available in the current mode. + */ + protected boolean isAvailable () + { + return isAvailableInStandalone() || !_ctx.getClient().isStandalone(); + } + + /** + * If this director is not currently available, throws a + * {@link RuntimeException}. + */ + protected void assertAvailable () + { + if (!isAvailable()) { + throw new RuntimeException(getClass().getName() + + " not available in standalone mode!"); + } + } + /** * Called in three circumstances: when a director is created and we've * already logged on; when we first log on and when the client object @@ -81,11 +125,17 @@ public class BasicDirector /** * Derived directors can override this method and obtain any services * they'll need during their operation via calls to {@link - * Client#getService}. It will automatically be called when the client - * logs on or when the director is constructed if it is constructed - * after the client is already logged on. + * Client#getService}. If the director is available, it will automatically + * be called when the client logs on or when the director is constructed + * if it is constructed after the client is already logged on. */ protected void fetchServices (Client client) { } + + /** The application context. */ + protected PresentsContext _ctx; + + /** Whether or not this director is available in standalone mode. */ + protected boolean _availableInStandalone; } diff --git a/src/java/com/threerings/presents/client/Client.java b/src/java/com/threerings/presents/client/Client.java index 2df498329..34a0d0a40 100644 --- a/src/java/com/threerings/presents/client/Client.java +++ b/src/java/com/threerings/presents/client/Client.java @@ -98,6 +98,22 @@ public class Client } } + /** + * Sets whether or not this client is operating in standalone mode. + */ + public void setStandalone (boolean standalone) + { + _standalone = standalone; + } + + /** + * Checks whether or not this client is operating in a standalone mode. + */ + public boolean isStandalone () + { + return _standalone; + } + /** * Configures the client to communicate with the server on the * supplied hostname/port combination. @@ -408,6 +424,16 @@ public class Client return true; } + /** + * For standalone mode, this notifies observers that the client has logged + * off and cleans up. + */ + public void standaloneLogoff () + { + notifyObservers(CLIENT_DID_LOGOFF, null); + cleanup(); + } + /** * Called by the {@link ClientDObjectMgr} when our bootstrap * notification arrives. If the client and server are being run in @@ -556,7 +582,7 @@ public class Client } } - synchronized void communicatorDidExit () + synchronized void cleanup () { // we know that prior to the call to this method, the observers // were notified with CLIENT_DID_LOGOFF; that may not have been @@ -571,6 +597,7 @@ public class Client _omgr = null; _clobj = null; _cloid = -1; + _standalone = false; // and let our invocation director know we're logged off _invdir.cleanup(); } @@ -690,6 +717,9 @@ public class Client /** Our client distributed object. */ protected ClientObject _clobj; + /** Whether or not this client is operating in a standalone mode. */ + protected boolean _standalone; + /** The game server host. */ protected String _hostname; diff --git a/src/java/com/threerings/presents/client/Communicator.java b/src/java/com/threerings/presents/client/Communicator.java index 6fa44b111..1c08500e0 100644 --- a/src/java/com/threerings/presents/client/Communicator.java +++ b/src/java/com/threerings/presents/client/Communicator.java @@ -245,7 +245,7 @@ public class Communicator closeChannel(); // let the client know when we finally go away - _client.communicatorDidExit(); + _client.cleanup(); } Log.debug("Reader thread exited."); @@ -270,7 +270,7 @@ public class Communicator // let the client know when we finally go away if (_reader == null) { - _client.communicatorDidExit(); + _client.cleanup(); } }