Files
narya/src/java/com/threerings/presents/server/TimeBaseProvider.java
T
Michael Bayne e54a4d41f4 The great invocation services rethink of 2002! Rearchitected the remote
method invocation services and converted everything to the new style.
Could this be my biggest checkin ever?


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@1642 542714f4-19e9-0310-aa3c-eee0fc999fb1
2002-08-14 19:08:01 +00:00

109 lines
3.6 KiB
Java

//
// $Id: TimeBaseProvider.java,v 1.2 2002/08/14 19:07:56 mdb Exp $
package com.threerings.presents.server;
import java.util.HashMap;
import com.samskivert.util.ResultListener;
import com.threerings.presents.Log;
import com.threerings.presents.client.TimeBaseService.GotTimeBaseListener;
import com.threerings.presents.data.ClientObject;
import com.threerings.presents.data.TimeBaseCodes;
import com.threerings.presents.data.TimeBaseObject;
import com.threerings.presents.dobj.DObject;
import com.threerings.presents.dobj.ObjectAccessException;
import com.threerings.presents.dobj.RootDObjectManager;
import com.threerings.presents.dobj.Subscriber;
/**
* Provides the server-side of the time base services. The time base
* services provide a means by which delta times can be sent over the
* network which are expanded based on a shared base time into full time
* stamps.
*/
public class TimeBaseProvider
implements InvocationProvider, TimeBaseCodes
{
/**
* Registers the time provider with the appropriate managers. Called
* by the presents server at startup.
*/
public static void init (InvocationManager invmgr, RootDObjectManager omgr)
{
// we'll need these later
_invmgr = invmgr;
_omgr = omgr;
// register a provider instance
invmgr.registerDispatcher(
new TimeBaseDispatcher(new TimeBaseProvider()), true);
}
/**
* Creates a time base object which can subsequently be fetched by the
* client and used to send delta times.
*
* @param timeBase the name of the time base to create.
* @param resl the result listener that will be informed when the time
* base object is created or if the creation fails.
*/
public static void createTimeBase (
final String timeBase, final ResultListener resl)
{
_omgr.createObject(TimeBaseObject.class, new Subscriber () {
public void objectAvailable (DObject object) {
// stuff it into our table
_timeBases.put(timeBase, object);
// and notify the listener
resl.requestCompleted(object);
}
public void requestFailed (int oid, ObjectAccessException cause) {
Log.warning("Ack. Unable to create time base object " +
"[timeBase=" + timeBase +
", cause=" + cause + "].");
// notify the listener that we're borked
resl.requestFailed(cause);
}
});
}
/**
* Returns the named timebase object, or null if no time base object
* has been created with that name.
*/
public static TimeBaseObject getTimeBase (String timeBase)
{
return (TimeBaseObject)_timeBases.get(timeBase);
}
/**
* Processes a request from a client to fetch the oid of the specified
* time object.
*/
public void getTimeOid (
ClientObject source, String timeBase, GotTimeBaseListener listener)
throws InvocationException
{
// look up the time base object in question
TimeBaseObject time = getTimeBase(timeBase);
if (time == null) {
throw new InvocationException(NO_SUCH_TIME_BASE);
}
// and send the response
listener.gotTimeOid(time.getOid());
}
/** Used to keep track of our time base objects. */
protected static HashMap _timeBases = new HashMap();
/** The invocation manager with which we interoperate. */
protected static InvocationManager _invmgr;
/** The distributed object manager with which we interoperate. */
protected static RootDObjectManager _omgr;
}