Whirled actionscript code, transferred from narya.

git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@5 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
Ray Greenwell
2006-06-23 19:21:10 +00:00
parent 88ba927cb5
commit 01866933eb
38 changed files with 3654 additions and 0 deletions
@@ -0,0 +1,92 @@
//
// $Id: SceneController.java 3099 2004-08-27 02:21:06Z mdb $
//
// 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.whirled.client {
import com.threerings.presents.dobj.MessageEvent;
import com.threerings.presents.dobj.MessageListener;
import com.threerings.crowd.client.PlaceController;
import com.threerings.crowd.data.PlaceConfig;
import com.threerings.crowd.data.PlaceObject;
import com.threerings.crowd.util.CrowdContext;
import com.threerings.whirled.data.SceneCodes;
import com.threerings.whirled.data.SceneUpdate;
import com.threerings.whirled.util.WhirledContext;
/**
* The base scene controller class. It is expected that users of the
* Whirled services will extend this controller class when creating
* specialized controllers for their scenes.
*/
public /*abstract*/ class SceneController extends PlaceController
{
// documentation inherited
override public function init (ctx :CrowdContext, config :PlaceConfig) :void
{
super.init(ctx, config);
_wctx = WhirledContext(ctx);
}
// documentation inherited
override public function willEnterPlace (plobj :PlaceObject) :void
{
super.willEnterPlace(plobj);
plobj.addListener(_updateListener);
}
// documentation inherited
override public function didLeavePlace (plobj :PlaceObject) :void
{
super.didLeavePlace(plobj);
plobj.removeListener(_updateListener);
}
/**
* This method is called if a scene update is recorded while we
* currently occupy a scene. The default implementation will update
* our local scene and scene model, but derived classes will likely
* want to ensure that the update is properly displayed.
*/
protected function sceneUpdated (update :SceneUpdate) :void
{
// apply the update to the scene
_wctx.getSceneDirector().getScene().updateReceived(update);
// we don't persistify these updates in this circumstance, but
// next time we come to this scene we'll redownload the update and
// apply it to the repository; as the updates are meant to be very
// small, this shouldn't be horribly less efficient
}
/** Used to listen for scene updates. */
protected var _updateListener :MessageListener = new MessageAdapter(
function (event :MessageEvent) :void {
if (event.getName() == SceneCodes.SCENE_UPDATE) {
sceneUpdated(event.getArgs()[0] as SceneUpdate);
}
}
);
protected var _wctx :WhirledContext;
}
}
@@ -0,0 +1,68 @@
//
// $Id: SceneDecoder.java 3914 2006-03-06 21:51:59Z mdb $
//
// Narya library - tools for developing networked games
// Copyright (C) 2002-2006 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.whirled.client {
import com.threerings.presents.client.InvocationDecoder;
import com.threerings.whirled.client.SceneReceiver;
/**
* Dispatches calls to a {@link SceneReceiver} instance.
*/
public class SceneDecoder extends InvocationDecoder
{
/** The generated hash code used to identify this receiver class. */
public static const RECEIVER_CODE :String =
"c4d0cf66b81a6e83d119b2d607725651";
/** The method id used to dispatch {@link SceneReceiver#forcedMove}
* notifications. */
public static const FORCED_MOVE :int = 1;
/**
* Creates a decoder that may be registered to dispatch invocation
* service notifications to the specified receiver.
*/
public function SceneDecoder (receiver :SceneReceiver)
{
this.receiver = receiver;
}
// documentation inherited
override public function getReceiverCode () :String
{
return RECEIVER_CODE;
}
// documentation inherited
override public function dispatchNotification (methodId :int, args :Array) :void
{
switch (methodId) {
case FORCED_MOVE:
(receiver as SceneReceiver).forcedMove(args[0] as int);
return;
default:
super.dispatchNotification(methodId, args);
}
}
}
}
@@ -0,0 +1,527 @@
//
// $Id: SceneDirector.java 4088 2006-05-04 00:39:46Z mjohnson $
//
// 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.whirled.client {
import flash.errors.IOError;
import flash.errors.IllegalOperationError;
import com.threerings.util.HashMap;
import com.threerings.util.ResultListener;
import com.threerings.io.TypedArray;
import com.threerings.presents.client.BasicDirector;
import com.threerings.presents.client.Client;
import com.threerings.presents.client.ClientEvent;
import com.threerings.presents.data.InvocationCodes;
import com.threerings.crowd.client.LocationDirector;
import com.threerings.crowd.client.LocationDirector_FailureHandler;
import com.threerings.crowd.client.LocationObserver;
import com.threerings.crowd.data.PlaceConfig;
import com.threerings.whirled.client.persist.SceneRepository;
import com.threerings.whirled.data.Scene;
import com.threerings.whirled.data.SceneCodes;
import com.threerings.whirled.data.SceneModel;
import com.threerings.whirled.util.NoSuchSceneError;
import com.threerings.whirled.util.SceneFactory;
import com.threerings.whirled.util.WhirledContext;
import com.threerings.whirled.data.SceneUpdate;
/**
* The scene director is the client's interface to all things scene
* related. It interfaces with the scene repository to ensure that scene
* objects are available when the client enters a particular scene. It
* handles moving from scene to scene (it coordinates with the {@link
* LocationDirector} in order to do this).
*
* <p> Note that when the scene director is in use instead of the location
* director, scene ids instead of place oids will be supplied to {@link
* LocationObserver#locationMayChange} and {@link
* LocationObserver#locationChangeFailed}.
*/
public class SceneDirector extends BasicDirector
implements LocationDirector_FailureHandler,
SceneReceiver, SceneService_SceneMoveListener
{
private static const log :Log = Log.getLog(SceneDirector);
/**
* Creates a new scene director with the specified context.
*
* @param ctx the active client context.
* @param locdir the location director in use on the client, with
* which the scene director will coordinate when changing location.
* @param screp the entity from which the scene director will load
* scene data from the local client scene storage. This may be null
* when the SceneDirector is constructed, but it should be
* supplied via {@link #setSceneRepository} prior to really using
* this director.
* @param fact the factory that knows which derivation of {@link
* Scene} to create for the current system.
*/
public function SceneDirector (
ctx :WhirledContext, locdir :LocationDirector,
screp :SceneRepository, fact :SceneFactory)
{
super(ctx);
// we'll need these for later
_wctx = ctx;
_locdir = locdir;
setSceneRepository(screp);
_fact = fact;
// set ourselves up as a failure handler with the location
// director because we need to do special processing
_locdir.setFailureHandler(this);
// register for scene notifications
_wctx.getClient().getInvocationDirector().registerReceiver(
new SceneDecoder(this));
}
/**
* Set the scene repository.
*/
public function setSceneRepository (screp :SceneRepository) :void
{
_screp = screp;
_scache.clear();
}
/**
* Returns the display scene object associated with the scene we
* currently occupy or null if we currently occupy no scene.
*/
public function getScene () :Scene
{
return _scene;
}
/**
* Requests that this client move the specified scene. A request will
* be made and when the response is received, the location observers
* will be notified of success or failure.
*
* @return true if the move to request was issued, false if it was
* rejected by a location observer or because we have another request
* outstanding.
*/
public function moveTo (sceneId :int) :Boolean
{
// make sure the sceneId is valid
if (sceneId < 0) {
log.warning("Refusing moveTo(): invalid sceneId " + sceneId + ".");
return false;
}
// sanity-check the destination scene id
if (sceneId == _sceneId) {
log.warning("Refusing request to move to the same scene " +
"[sceneId=" + sceneId + "].");
return false;
}
// prepare to move to this scene (sets up pending data)
if (!prepareMoveTo(sceneId, null)) {
return false;
}
// check the version of our cached copy of the scene to which
// we're requesting to move; if we were unable to load it, assume
// a cached version of zero
var sceneVers :int = 0;
if (_pendingModel != null) {
sceneVers = _pendingModel.version;
}
// issue a moveTo request
log.info("Issuing moveTo(" + sceneId + ", " + sceneVers + ").");
_sservice.moveTo(_wctx.getClient(), sceneId, sceneVers, this);
return true;
}
/**
* Prepares to move to the requested scene. The location observers are
* asked to ratify the move and our pending scene mode is loaded from
* the scene repository. This can be called by cooperating directors
* that need to coopt the moveTo process.
*/
public function prepareMoveTo (sceneId :int, rl :ResultListener) :Boolean
{
// first check to see if our observers are happy with this move
// request
if (!_locdir.mayMoveTo(sceneId, rl)) {
return false;
}
// we need to call this both to mark that we're issuing a move
// request and to check to see if the last issued request should
// be considered stale
var refuse :Boolean = _locdir.checkRepeatMove();
// complain if we're over-writing a pending request
if (_pendingSceneId != -1) {
if (refuse) {
log.warning("Refusing moveTo; We have a request outstanding " +
"[psid=" + _pendingSceneId +
", nsid=" + sceneId + "].");
return false;
} else {
log.warning("Overriding stale moveTo request " +
"[psid=" + _pendingSceneId +
", nsid=" + sceneId + "].");
}
}
// load up the pending scene so that we can communicate it's most
// recent version to the server
_pendingModel = loadSceneModel(sceneId);
// make a note of our pending scene id
_pendingSceneId = sceneId;
// all systems go
return true;
}
/**
* Returns the model loaded in preparation for a scene
* transition. This is made available only for cooperating directors
* which may need to coopt the scene transition process. The pending
* model is only valid immediately following a call to {@link
* #prepareMoveTo}.
*/
public function getPendingModel () :SceneModel
{
return _pendingModel;
}
// documentation inherited from interface SceneService_SceneMoveListener
public function moveSucceeded (placeId :int, config :PlaceConfig) :void
{
// our move request was successful, deal with subscribing to our
// new place object
_locdir.didMoveTo(placeId, config);
// since we're committed to moving to the new scene, we'll
// parallelize and go ahead and load up the new scene now rather
// than wait until subscription to our place object succeeds
// keep track of our previous scene info
_previousSceneId = _sceneId;
// clear out the old info
clearScene();
// make the pending scene the active scene
_sceneId = _pendingSceneId;
_pendingSceneId = -1;
// load the new scene model
_model = loadSceneModel(_sceneId);
// complain if we didn't find a scene
if (_model == null) {
log.warning("Aiya! Unable to load scene [sid=" + _sceneId +
", plid=" + placeId + "].");
return;
}
// and finally create a display scene instance with the model and
// the place config
_scene = _fact.createScene(_model, config);
}
// documentation inherited from interface SceneService_SceneMoveListener
public function moveSucceededWithUpdates (
placeId :int, config :PlaceConfig, updates :TypedArray) :void
{
log.info("Got updates [placeId=" + placeId + ", config=" + config +
", updates=" + updates + "].");
// apply the updates to our cached scene
var model :SceneModel = loadSceneModel(_pendingSceneId);
var failure :Boolean = false;
for each (var update :SceneUpdate in updates) {
try {
update.validate(model);
} catch (ise :IllegalOperationError) {
log.warning("Scene update failed validation [model=" + model +
", update=" + update +
", error=" + ise.getMessage() + "].");
failure = true;
break;
}
try {
update.apply(model);
} catch (e :Error) {
log.warning("Failure applying scene update [model=" + model +
", update=" + update + "].");
log.logStackTrace(e);
failure = true;
break;
}
}
if (failure) {
// delete the now half-booched scene model from the repository
try {
_screp.deleteSceneModel(_pendingSceneId);
} catch (ioe :IOError) {
log.warning("Failure removing booched scene model " +
"[sceneId=" + _pendingSceneId + "].");
log.logStackTrace(ioe);
}
// act as if the scene move failed, though we'll be in a funny
// state because the server thinks we've changed scenes, but
// the client can try again without its booched scene model
requestFailed(InvocationCodes.INTERNAL_ERROR);
return;
}
// store the updated scene in the repository
try {
_screp.storeSceneModel(model);
} catch (ioe :IOError) {
log.warning("Failed to update repository with updated scene " +
"[sceneId=" + model.sceneId + "].");
log.logStackTrace(ioe);
}
// finally pass through to the normal success handler
moveSucceeded(placeId, config);
}
// documentation inherited from interface SceneService-SceneMoveListener
public function moveSucceededWithScene (
placeId :int, config :PlaceConfig, model :SceneModel) :void
{
log.info("Got updated scene model [placeId=" + placeId +
", config=" + config + ", scene=" + model.sceneId + "/" +
model.name + "/" + model.version + "].");
// update the model in the repository
try {
_screp.storeSceneModel(model);
} catch (ioe :IOError) {
log.warning("Failed to update repository with new version " +
"[sceneId=" + model.sceneId +
", nvers=" + model.version + "].");
log.logStackTrace(ioe);
}
// update our scene cache
_scache.put(model.sceneId, model);
// and pass through to the normal move succeeded handler
moveSucceeded(placeId, config);
}
// documentation inherited from interface
public function requestFailed (reason :String) :void
{
// clear out our pending request oid
var sceneId :int = _pendingSceneId;
_pendingSceneId = -1;
// let our observers know that something has gone horribly awry
_locdir.failedToMoveTo(sceneId, reason);
}
/**
* Called to clean up our place and scene state information when we
* leave a scene.
*/
public function didLeaveScene () :void
{
// let the location director know what's up
_locdir.didLeavePlace();
// clear out our own scene state
clearScene();
}
// documentation inherited from interface
public function forcedMove (sceneId :int) :void
{
log.info("Moving at request of server [sceneId=" + sceneId + "].");
// clear out our old scene and place data
didLeaveScene();
// move to the new scene
moveTo(sceneId);
}
/**
* Sets the moveHandler for use in recoverFailedMove.
*/
public function setMoveHandler (handler :SceneDirector_MoveHandler) :void
{
if (_moveHandler != null) {
log.warning("Requested to set move handler, but we've " +
"already got one. The conflicting entities will " +
"likely need to perform more sophisticated " +
"coordination to deal with failures. " +
"[old=" + _moveHandler + ", new=" + handler + "].");
} else {
_moveHandler = handler;
}
}
/**
* Called when something breaks down in the process of performing a
* <code>moveTo</code> request.
*/
public function recoverFailedMove (placeId :int) :void
{
// we'll need this momentarily
var sceneId :int = _sceneId;
// clear out our now bogus scene tracking info
clearScene();
// if we were previously somewhere (and that somewhere isn't where
// we just tried to go), try going back to that happy place
if (_previousSceneId != -1 && _previousSceneId != sceneId) {
// if we have a move handler use that
if (_moveHandler != null) {
_moveHandler.recoverMoveTo(_previousSceneId);
} else {
moveTo(_previousSceneId);
}
}
}
/**
* Clears out our current scene information and releases the scene
* model for the loaded scene back to the cache.
*/
protected function clearScene () :void
{
// clear out our scene id info
_sceneId = -1;
// clear out our references
_model = null;
_scene = null;
}
/**
* Loads a scene from the repository. If the scene is cached, it will
* be returned from the cache instead.
*/
protected function loadSceneModel (sceneId :int) :SceneModel
{
// first look in the model cache
var model :SceneModel = (_scache.get(sceneId) as SceneModel);
// load from the repository if it's not cached
if (model == null) {
try {
model = _screp.loadSceneModel(sceneId);
_scache.put(sceneId, model);
} catch (nsse :NoSuchSceneError) {
// nothing special here, just fall through and return null
} catch (ioe :IOError) {
// complain first, then return null
log.warning("Error loading scene [scid=" + sceneId +
", error=" + ioe + "].");
}
}
return model;
}
// documentation inherited
override public function clientDidLogoff (event :ClientEvent) :void
{
super.clientDidLogoff(event);
// clear out our business
clearScene();
_scache.clear();
_pendingSceneId = -1;
_pendingModel = null;
_previousSceneId = -1;
_sservice = null;
}
// documentation inherited
override protected function fetchServices (client :Client) :void
{
// get a handle on our scene service
_sservice = (client.requireService(SceneService) as SceneService);
}
/** Access to general client services. */
protected var _wctx :WhirledContext;
/** Access to our scene services. */
protected var _sservice :SceneService;
/** The client's active location director. */
protected var _locdir :LocationDirector;
/** The entity via which we load scene data. */
protected var _screp :SceneRepository;
/** The entity we use to create scenes from scene models. */
protected var _fact :SceneFactory;
/** A cache of scene model information. */
protected var _scache :HashMap = new HashMap(); // TODO: LRUHashMap(5)
/** The display scene object for the scene we currently occupy. */
protected var _scene :Scene;
/** The scene model for the scene we currently occupy. */
protected var _model :SceneModel;
/** The id of the scene we currently occupy. */
protected var _sceneId :int = -1;
/** Our most recent copy of the scene model for the scene we're about
* to enter. */
protected var _pendingModel :SceneModel;
/** The id of the scene for which we have an outstanding moveTo
* request, or -1 if we have no outstanding request. */
protected var _pendingSceneId :int = -1;
/** The id of the scene we previously occupied. */
protected var _previousSceneId :int = -1;
/** Reference to our move handler. */
protected var _moveHandler :SceneDirector_MoveHandler = null;
}
}
@@ -0,0 +1,14 @@
package com.threerings.whirled.client {
/**
* Used to recover from a problem after a completed moveTo.
*/
public interface SceneDirector_MoveHandler
{
/**
* Should instruct the client to move the last known working
* location (as well as clean up after the failed moveTo request).
*/
function recoverMoveTo (sceneId :int) :void;
}
}
@@ -0,0 +1,40 @@
//
// $Id: SceneReceiver.java 3099 2004-08-27 02:21:06Z mdb $
//
// 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.whirled.client {
import com.threerings.presents.client.InvocationReceiver;
/**
* Defines, for the scene services, a set of notifications delivered
* asynchronously by the server to the client.
*/
public interface SceneReceiver extends InvocationReceiver
{
/**
* Used to communicate a required move notification to the client. The
* server will have removed the client from their existing scene
* and the client is then responsible for generating a {@link
* SceneService#moveTo} request to move to the new scene.
*/
function forcedMove (sceneId :int) :void
}
}
@@ -0,0 +1,50 @@
//
// $Id: SceneService.java 3099 2004-08-27 02:21:06Z mdb $
//
// 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.whirled.client {
import com.threerings.presents.client.Client;
import com.threerings.presents.client.InvocationService;
import com.threerings.crowd.data.PlaceConfig;
import com.threerings.whirled.data.SceneModel;
import com.threerings.whirled.data.SceneUpdate;
/**
* The scene service class provides the client interface to the scene
* related invocation services (e.g. moving from scene to scene).
*/
public interface SceneService extends InvocationService
{
/**
* Requests that that this client's body be moved to the specified
* scene.
*
* @param sceneId the scene id to which we want to move.
* @param version the version number of the scene object that we have
* in our local repository.
*/
function moveTo (
client :Client, sceneId :int, version :int,
listener :SceneService_SceneMoveListener) :void;
}
}
@@ -0,0 +1,50 @@
package com.threerings.whirled.client {
import com.threerings.presents.client.InvocationListener;
import com.threerings.io.TypedArray;
import com.threerings.crowd.data.PlaceConfig;
import com.threerings.whirled.data.SceneModel;
import com.threerings.whirled.data.SceneUpdate;
/**
* Used to communicate the response to a {@link #moveTo} request.
*/
public interface SceneService_SceneMoveListener extends InvocationListener
{
/**
* Indicates that a move succeeded.
*
* @param placeId the place object id of the newly occupied scene.
* @param config metadata related to the newly occupied scene.
*/
function moveSucceeded (placeId :int, config :PlaceConfig) :void;
/**
* Indicates that a move succeeded and that the client's cached
* scene information should be updated with the supplied data.
*
* @param placeId the place object id of the newly occupied scene.
* @param config metadata related to the newly occupied scene.
* @param updates updates that must be applied to the client's
* copy of a scene model to bring it up to date.
*/
function moveSucceededWithUpdates (
placeId :int, config :PlaceConfig,
updates :TypedArray /*of SceneUpdate*/) :void;
/**
* Indicates that a move succeeded and that the client's cached
* scene information should be updated with the supplied data.
*
* @param placeId the place object id of the newly occupied scene.
* @param config metadata related to the newly occupied scene.
* @param model a fresh copy of the most recent scene data for the
* newly occupied scene.
*/
function moveSucceededWithScene (
placeId :int, config :PlaceConfig, model :SceneModel) :void;
}
}
@@ -0,0 +1,66 @@
//
// $Id: SceneRepository.java 3099 2004-08-27 02:21:06Z mdb $
//
// 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.whirled.client.persist {
import flash.errors.IOError;
import com.threerings.whirled.data.SceneModel;
import com.threerings.whirled.util.NoSuchSceneError;
/**
* The scene repository provides access to a persistent repository of
* scene information.
*
* @see SceneModel
*/
public interface SceneRepository
{
/**
* Fetches the model for the scene with the specified id.
*
* @exception IOException thrown if an error occurs attempting to load
* the scene data.
* @exception NoSuchSceneException thrown if no scene exists with the
* specified scene id.
*/
function loadSceneModel (sceneId :int) :SceneModel;
//throws IOException, NoSuchSceneException;
/**
* Updates or inserts this scene model as appropriate.
*
* @exception IOException thrown if an error occurs attempting to
* access the repository.
*/
function storeSceneModel (model :SceneModel) :void;
//throws IOException;
/**
* Deletes the specified scene model from the repository.
*
* @exception IOException thrown if an error occurs attempting to
* access the repository.
*/
function deleteSceneModel (sceneId :int) :void;
//throws IOException;
}
}