Files
narya/src/java/com/threerings/presents/client/BasicDirector.java
T
Michael Bayne 9ac3e86fe0 Being available in standalone mode should be the default. This will of course
make life harder for Yohoho, but making life easier for Yohoho should not come
at the expense of baffling default behavior.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4574 542714f4-19e9-0310-aa3c-eee0fc999fb1
2007-02-13 00:26:46 +00:00

154 lines
4.9 KiB
Java

//
// $Id$
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2004 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.presents.client;
import com.threerings.presents.util.PresentsContext;
/**
* Handles functionality common to nearly all client directors. They generally need to be session
* observers so that they can set themselves up when the client logs on (by overriding {@link
* #clientDidLogon}) and clean up after themselves when the client logs off (by overriding {@link
* #clientDidLogoff}).
*/
public class BasicDirector
implements SessionObserver
{
/**
* Derived directors will need to provide the basic director with a context that it can use to
* register itself with the necessary entities.
*/
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()) {
if (isAvailable()) {
// this is a sanity check: it will fail if this post-logon initialized director
// claims to need service groups (it must make that known prior to logon)
registerServices(client);
fetchServices(client);
}
clientObjectUpdated(client);
}
}
// documentation inherited from interface
public void clientWillLogon (Client client)
{
registerServices(client);
}
// documentation inherited from interface
public void clientDidLogon (Client client)
{
if (isAvailable()) {
fetchServices(client);
}
clientObjectUpdated(client);
}
// documentation inherited from interface
public void clientObjectDidChange (Client client)
{
clientObjectUpdated(client);
}
// documentation inherited from interface
public void clientDidLogoff (Client client)
{
}
/**
* 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 changes after we've already logged on.
*/
protected void clientObjectUpdated (Client client)
{
}
/**
* If a director makes use of bootstrap invocation services which are part of a bootstrap
* service group, it should register interest in that group here with a call to {@link
* Client#addServiceGroup}.
*/
protected void registerServices (Client client)
{
}
/**
* Derived directors can override this method and obtain any services they'll need during their
* operation via calls to {@link 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 = true;
}