diff --git a/src/java/com/threerings/ezgame/server/EZGameManager.java b/src/java/com/threerings/ezgame/server/EZGameManager.java index 6dc9fd7c..eb339e0a 100644 --- a/src/java/com/threerings/ezgame/server/EZGameManager.java +++ b/src/java/com/threerings/ezgame/server/EZGameManager.java @@ -423,10 +423,8 @@ public class EZGameManager extends GameManager super.didStartup(); _gameObj = (EZGameObject) _plobj; - _gameObj.setEzGameService( - (EZGameMarshaller) CrowdServer.invmgr.registerDispatcher( - new EZGameDispatcher(this), false)); + (EZGameMarshaller) CrowdServer.invmgr.registerDispatcher(new EZGameDispatcher(this))); if (isPartyGame()) { startGame(); diff --git a/src/java/com/threerings/micasa/client/ClientController.java b/src/java/com/threerings/micasa/client/ClientController.java index 6b838ef7..3c50f083 100644 --- a/src/java/com/threerings/micasa/client/ClientController.java +++ b/src/java/com/threerings/micasa/client/ClientController.java @@ -72,6 +72,12 @@ public class ClientController extends Controller return false; } + // documentation inherited + public void clientWillLogon (Client client) + { + // nada + } + // documentation inherited public void clientDidLogon (Client client) { diff --git a/src/java/com/threerings/micasa/client/LogonPanel.java b/src/java/com/threerings/micasa/client/LogonPanel.java index b4a10768..98667d51 100644 --- a/src/java/com/threerings/micasa/client/LogonPanel.java +++ b/src/java/com/threerings/micasa/client/LogonPanel.java @@ -148,6 +148,12 @@ public class LogonPanel extends JPanel } } + // documentation inherited from interface + public void clientWillLogon (Client client) + { + // nada + } + // documentation inherited from interface public void clientDidLogon (Client client) { @@ -164,6 +170,7 @@ public class LogonPanel extends JPanel // documentation inherited from interface public void clientDidClear (Client client) { + // nada } // documentation inherited from interface diff --git a/src/java/com/threerings/micasa/lobby/LobbyRegistry.java b/src/java/com/threerings/micasa/lobby/LobbyRegistry.java index b00bebd4..7dfc842f 100644 --- a/src/java/com/threerings/micasa/lobby/LobbyRegistry.java +++ b/src/java/com/threerings/micasa/lobby/LobbyRegistry.java @@ -26,6 +26,7 @@ import com.samskivert.util.*; import com.threerings.util.StreamableArrayList; import com.threerings.presents.data.ClientObject; +import com.threerings.presents.data.InvocationCodes; import com.threerings.presents.server.InvocationManager; import com.threerings.crowd.data.BodyObject; @@ -37,13 +38,12 @@ import com.threerings.micasa.server.MiCasaConfig; import com.threerings.micasa.server.MiCasaServer; /** - * The lobby registry is the primary class that coordinates the lobby - * services on the client. It sets up the necessary invocation services - * and keeps track of the lobbies in operation on the server. Only one - * lobby registry should be created on a server. + * The lobby registry is the primary class that coordinates the lobby services on the client. It + * sets up the necessary invocation services and keeps track of the lobbies in operation on the + * server. Only one lobby registry should be created on a server. * - *

Presently, the lobby registry is configured with lobbies via the - * server configuration. An example configuration follows: + *

Presently, the lobby registry is configured with lobbies via the server configuration. An + * example configuration follows: * *

  * lobby_ids = foolobby, barlobby, bazlobby
@@ -60,16 +60,13 @@ import com.threerings.micasa.server.MiCasaServer;
  * ...
  * 
* - * This information will be loaded from the MiCasa server configuration - * which means that it should live in - * rsrc/config/micasa/server.properties somwhere in the - * classpath where it will override the default MiCasa server properties - * file. + * This information will be loaded from the MiCasa server configuration which means that it should + * live in rsrc/config/micasa/server.properties somwhere in the classpath where it + * will override the default MiCasa server properties file. * - *

The UGI or universal game identifier is a string that - * is used to uniquely identify every type of game and also to classify it - * according to meaningful keywords. It is best described with a few - * examples: + *

The UGI or universal game identifier is a string that is used to uniquely + * identify every type of game and also to classify it according to meaningful keywords. It is best + * described with a few examples: * *

  * backgammon,board,strategy
@@ -77,29 +74,28 @@ import com.threerings.micasa.server.MiCasaServer;
  * yahtzee,dice
  * 
* - * As you can see, a UGI should start with an identifier uniquely - * identifying the type of game and can be followed by a list of keywords - * that classify it as a member of a particular category of games - * (eg. board, card, dice, partner game, strategy game). A game can belong - * to multiple categories. + * As you can see, a UGI should start with an identifier uniquely identifying the type of game and + * can be followed by a list of keywords that classify it as a member of a particular category of + * games (eg. board, card, dice, partner game, strategy game). A game can belong to multiple + * categories. * - *

As long as the UGIs in use by a particular server make some kind of - * sense, the client will be able to use them to search for lobbies - * containing games of similar types using the provided facilities. + *

As long as the UGIs in use by a particular server make some kind of sense, the client will + * be able to use them to search for lobbies containing games of similar types using the provided + * facilities. */ public class LobbyRegistry implements LobbyProvider { /** - * Initializes the registry. It will use the supplied configuration - * instance to determine which lobbies to load, etc. + * Initializes the registry. It will use the supplied configuration instance to determine which + * lobbies to load, etc. * * @param invmgr a reference to the server's invocation manager. */ public void init (InvocationManager invmgr) { // register ourselves as an invocation service handler - invmgr.registerDispatcher(new LobbyDispatcher(this), true); + invmgr.registerDispatcher(new LobbyDispatcher(this), InvocationCodes.GLOBAL_GROUP); // create our lobby managers String[] lmgrs = null; @@ -124,8 +120,8 @@ public class LobbyRegistry } /** - * Extracts the properties for a lobby from the server config and - * creates and initializes the lobby manager. + * Extracts the properties for a lobby from the server config and creates and initializes the + * lobby manager. */ protected void loadLobby (String lobbyId) { @@ -136,42 +132,33 @@ public class LobbyRegistry // get the lobby manager class and UGI String cfgClass = props.getProperty("config"); if (StringUtil.isBlank(cfgClass)) { - throw new Exception("Missing 'config' definition in " + - "lobby configuration."); + throw new Exception("Missing 'config' definition in lobby configuration."); } // create and initialize the lobby config object - LobbyConfig config = (LobbyConfig) - Class.forName(cfgClass).newInstance(); + LobbyConfig config = (LobbyConfig)Class.forName(cfgClass).newInstance(); config.init(props); - // create and initialize the lobby manager. it will call - // lobbyReady() when it has obtained a reference to its lobby - // object and is ready to roll - LobbyManager lobmgr = (LobbyManager) - MiCasaServer.plreg.createPlace(config); + // create and initialize the lobby manager. it will call lobbyReady() when it has + // obtained a reference to its lobby object and is ready to roll + LobbyManager lobmgr = (LobbyManager)MiCasaServer.plreg.createPlace(config); lobmgr.init(this, props); } catch (Exception e) { - Log.warning("Unable to create lobby manager " + - "[lobbyId=" + lobbyId + ", error=" + e + "]."); + Log.warning("Unable to create lobby manager [lobbyId=" + lobbyId + + ", error=" + e + "]."); } } /** - * Returns information about all lobbies hosting games in the - * specified category. + * Returns information about all lobbies hosting games in the specified category. * - * @param requester the body object of the client requesting the lobby - * list (which can be used to filter the list based on their - * capabilities). - * @param category the category of game for which the lobbies are - * desired. - * @param target the list into which the matching lobbies will be - * deposited. + * @param requester the body object of the client requesting the lobby list (which can be used + * to filter the list based on their capabilities). + * @param category the category of game for which the lobbies are desired. + * @param target the list into which the matching lobbies will be deposited. */ - public void getLobbies (BodyObject requester, String category, - List target) + public void getLobbies (BodyObject requester, String category, List target) { ArrayList list = (ArrayList)_lobbies.get(category); if (list != null) { @@ -180,18 +167,16 @@ public class LobbyRegistry } /** - * Returns an array containing the category identifiers of all the - * categories in which lobbies have been registered with the registry. + * Returns an array containing the category identifiers of all the categories in which lobbies + * have been registered with the registry. * - * @param requester the body object of the client requesting the - * cateogory list (which can be used to filter the list based on their - * capabilities). + * @param requester the body object of the client requesting the cateogory list (which can be + * used to filter the list based on their capabilities). */ public String[] getCategories (BodyObject requester) { - // might want to cache this some day so that we don't recreate it - // every time someone wants it. we can cache the array until the - // category count changes + // might want to cache this some day so that we don't recreate it every time someone wants + // it. we can cache the array until the category count changes String[] cats = new String[_lobbies.size()]; Iterator iter = _lobbies.keySet().iterator(); for (int i = 0; iter.hasNext(); i++) { @@ -201,8 +186,8 @@ public class LobbyRegistry } /** - * Processes a request by the client to obtain a list of the lobby - * categories available on this server. + * Processes a request by the client to obtain a list of the lobby categories available on this + * server. */ public void getCategories (ClientObject caller, CategoriesListener listener) { @@ -210,11 +195,10 @@ public class LobbyRegistry } /** - * Processes a request by the client to obtain a list of lobbies - * matching the supplied category string. + * Processes a request by the client to obtain a list of lobbies matching the supplied category + * string. */ - public void getLobbies (ClientObject caller, String category, - LobbiesListener listener) + public void getLobbies (ClientObject caller, String category, LobbiesListener listener) { StreamableArrayList target = new StreamableArrayList(); ArrayList list = (ArrayList)_lobbies.get(category); @@ -225,16 +209,15 @@ public class LobbyRegistry } /** - * Called by our lobby managers once they have started up and are - * ready to do their lobby duties. + * Called by our lobby managers once they have started up and are ready to do their lobby + * duties. */ protected void lobbyReady (int placeOid, String gameIdent, String name) { // create a lobby record Lobby record = new Lobby(placeOid, gameIdent, name); - // if we don't already have a default lobby, this one is the big - // winner + // if we don't already have a default lobby, this one is the big winner if (_defLobbyOid == -1) { _defLobbyOid = placeOid; } @@ -256,12 +239,11 @@ public class LobbyRegistry _lobbies.put(category, catlist); } catlist.add(record); - Log.info("Registered lobby [cat=" + category + - ", record=" + record + "]."); + Log.info("Registered lobby [cat=" + category + ", record=" + record + "]."); } - /** A table containing references to all of our lobby records (in the - * form of category lists. */ + /** A table containing references to all of our lobby records (in the form of category + * lists. */ protected HashMap _lobbies = new HashMap(); /** The oid of the default lobby. */ diff --git a/src/java/com/threerings/micasa/simulator/client/SimulatorController.java b/src/java/com/threerings/micasa/simulator/client/SimulatorController.java index 39745c6e..b27ea926 100644 --- a/src/java/com/threerings/micasa/simulator/client/SimulatorController.java +++ b/src/java/com/threerings/micasa/simulator/client/SimulatorController.java @@ -77,6 +77,12 @@ public class SimulatorController extends Controller return false; } + // documentation inherited + public void clientWillLogon (Client client) + { + // nada + } + // documentation inherited public void clientDidLogon (Client client) { diff --git a/src/java/com/threerings/micasa/simulator/server/SimulatorManager.java b/src/java/com/threerings/micasa/simulator/server/SimulatorManager.java index 15f4670b..983b32c1 100644 --- a/src/java/com/threerings/micasa/simulator/server/SimulatorManager.java +++ b/src/java/com/threerings/micasa/simulator/server/SimulatorManager.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import com.threerings.util.Name; import com.threerings.presents.data.ClientObject; +import com.threerings.presents.data.InvocationCodes; import com.threerings.presents.dobj.RootDObjectManager; import com.threerings.presents.server.ClientManager; import com.threerings.presents.server.ClientResolutionListener; @@ -44,26 +45,23 @@ import com.threerings.parlor.game.server.GameManager; import com.threerings.micasa.Log; /** - * The simulator manager is responsible for handling the simulator - * services on the server side. + * The simulator manager is responsible for handling the simulator services on the server side. */ public class SimulatorManager { /** - * Initializes the simulator manager manager. This should be called by - * the server that is making use of the simulator services on the - * single instance of simulator manager that it has created. + * Initializes the simulator manager manager. This should be called by the server that is + * making use of the simulator services on the single instance of simulator manager that it has + * created. * - * @param invmgr a reference to the invocation manager in use by this - * server. + * @param invmgr a reference to the invocation manager in use by this server. */ - public void init (InvocationManager invmgr, PlaceRegistry plreg, - ClientManager clmgr, RootDObjectManager omgr, - SimulatorServer simserv) + public void init (InvocationManager invmgr, PlaceRegistry plreg, ClientManager clmgr, + RootDObjectManager omgr, SimulatorServer simserv) { // register our simulator provider SimulatorProvider sprov = new SimulatorProvider(this); - invmgr.registerDispatcher(new SimulatorDispatcher(sprov), true); + invmgr.registerDispatcher(new SimulatorDispatcher(sprov), InvocationCodes.GLOBAL_GROUP); // keep these for later _plreg = plreg; @@ -73,20 +71,18 @@ public class SimulatorManager } /** - * Creates a game along with the specified number of simulant players - * and forcibly moves all players into the game room. + * Creates a game along with the specified number of simulant players and forcibly moves all + * players into the game room. */ - public void createGame ( - BodyObject source, GameConfig config, String simClass, int playerCount) + public void createGame (BodyObject source, GameConfig config, String simClass, int playerCount) { new CreateGameTask(source, config, simClass, playerCount); } public class CreateGameTask { - public CreateGameTask ( - BodyObject source, GameConfig config, String simClass, - int playerCount) + public CreateGameTask (BodyObject source, GameConfig config, String simClass, + int playerCount) { // save off game request info _source = source; @@ -95,9 +91,8 @@ public class SimulatorManager _playerCount = playerCount; try { - // create the game manager and begin its initialization - // process. the game manager will take care of notifying the - // players that the game has been created + // create the game manager and begin its initialization process. the game manager + // will take care of notifying the players that the game has been created // configure the game config with the player names config.players = new Name[_playerCount]; @@ -141,8 +136,7 @@ public class SimulatorManager } } public void resolutionFailed (Name username, Exception cause) { - Log.warning("Unable to create simulant body object " + - "[error=" + cause + "]."); + Log.warning("Unable to create simulant body object [error=" + cause + "]."); } }; @@ -154,8 +148,8 @@ public class SimulatorManager } /** - * Called when all simulant body objects are present and the - * simulants are ready to be created. + * Called when all simulant body objects are present and the simulants are ready to be + * created. */ protected void createSimulants () { @@ -178,8 +172,8 @@ public class SimulatorManager // give the simulant a chance to engage in place antics sim.willEnterPlace(_gobj); - // move the simulant into the game room since they have no - // location director to move them automagically + // move the simulant into the game room since they have no location director to + // move them automagically try { _plreg.locprov.moveTo(bobj, _gobj.getOid()); } catch (Exception e) { diff --git a/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java b/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java index 7e3e1e77..6ed0eaee 100644 --- a/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java +++ b/src/java/com/threerings/parlor/card/trick/server/TrickCardGameManagerDelegate.java @@ -81,7 +81,7 @@ public class TrickCardGameManagerDelegate extends TurnGameManagerDelegate _trickCardGame.setTrickCardGameService( (TrickCardGameMarshaller)PresentsServer.invmgr.registerDispatcher( - new TrickCardGameDispatcher(this), false)); + new TrickCardGameDispatcher(this))); } // Documentation inherited. diff --git a/src/java/com/threerings/parlor/client/ParlorDirector.java b/src/java/com/threerings/parlor/client/ParlorDirector.java index e43c07a3..06bd0e24 100644 --- a/src/java/com/threerings/parlor/client/ParlorDirector.java +++ b/src/java/com/threerings/parlor/client/ParlorDirector.java @@ -36,21 +36,19 @@ import com.threerings.parlor.game.data.GameConfig; import com.threerings.parlor.util.ParlorContext; /** - * The parlor director manages the client side of the game configuration - * and matchmaking processes. It is also the entity that is listening for - * game start notifications which it then dispatches the client entity - * that will actually create and display the user interface for the game - * that started. + * The parlor director manages the client side of the game configuration and matchmaking + * processes. It is also the entity that is listening for game start notifications which it then + * dispatches the client entity that will actually create and display the user interface for the + * game that started. */ public class ParlorDirector extends BasicDirector implements ParlorCodes, ParlorReceiver { /** - * Constructs a parlor director and provides it with the parlor - * context that it can use to access the client services that it needs - * to provide its own services. Only one parlor director should be - * active in the client at one time and it should be made available - * via the parlor context. + * Constructs a parlor director and provides it with the parlor context that it can use to + * access the client services that it needs to provide its own services. Only one parlor + * director should be active in the client at one time and it should be made available via the + * parlor context. * * @param ctx the parlor context in use by the client. */ @@ -59,16 +57,13 @@ public class ParlorDirector extends BasicDirector super(ctx); _ctx = ctx; - // register ourselves with the invocation director as a parlor - // notification receiver - _ctx.getClient().getInvocationDirector().registerReceiver( - new ParlorDecoder(this)); + // register ourselves with the invocation director as a parlor notification receiver + _ctx.getClient().getInvocationDirector().registerReceiver(new ParlorDecoder(this)); } /** - * Sets the invitation handler, which is the entity that will be - * notified when we receive incoming invitation notifications and when - * invitations have been cancelled. + * Sets the invitation handler, which is the entity that will be notified when we receive + * incoming invitation notifications and when invitations have been cancelled. * * @param handler our new invitation handler. */ @@ -78,8 +73,8 @@ public class ParlorDirector extends BasicDirector } /** - * Adds the specified observer to the list of entities that are - * notified when we receive a game ready notification. + * Adds the specified observer to the list of entities that are notified when we receive a game + * ready notification. */ public void addGameReadyObserver (GameReadyObserver observer) { @@ -87,8 +82,8 @@ public class ParlorDirector extends BasicDirector } /** - * Removes the specified observer from the list of entities that are - * notified when we receive a game ready notification. + * Removes the specified observer from the list of entities that are notified when we receive a + * game ready notification. */ public void removeGameReadyObserver (GameReadyObserver observer) { @@ -96,24 +91,19 @@ public class ParlorDirector extends BasicDirector } /** - * Requests that the named user be invited to a game described by the - * supplied game config. + * Requests that the named user be invited to a game described by the supplied game config. * * @param invitee the user to invite. - * @param config the configuration of the game to which the user is - * being invited. - * @param observer the entity that will be notified if this invitation - * is accepted, refused or countered. + * @param config the configuration of the game to which the user is being invited. + * @param observer the entity that will be notified if this invitation is accepted, refused or + * countered. * - * @return an invitation object that can be used to manage the - * outstanding invitation. + * @return an invitation object that can be used to manage the outstanding invitation. */ - public Invitation invite (Name invitee, GameConfig config, - InvitationResponseObserver observer) + public Invitation invite (Name invitee, GameConfig config, InvitationResponseObserver observer) { // create the invitation record - Invitation invite = new Invitation( - _ctx, _pservice, invitee, config, observer); + Invitation invite = new Invitation(_ctx, _pservice, invitee, config, observer); // submit the invitation request to the server _pservice.invite(_ctx.getClient(), invitee, config, invite); // and return the invitation to the caller @@ -123,13 +113,10 @@ public class ParlorDirector extends BasicDirector /** * Requests that the specified single player game be started. * - * @param config the configuration of the single player game to be - * started. - * @param listener a listener to be informed of failure if the game - * cannot be started. + * @param config the configuration of the single player game to be started. + * @param listener a listener to be informed of failure if the game cannot be started. */ - public void startSolitaire ( - GameConfig config, InvocationService.ConfirmListener listener) + public void startSolitaire (GameConfig config, InvocationService.ConfirmListener listener) { _pservice.startSolitaire(_ctx.getClient(), config, listener); } @@ -142,13 +129,6 @@ public class ParlorDirector extends BasicDirector _pendingInvites.clear(); } - // documentation inherited - protected void fetchServices (Client client) - { - // get a handle on our parlor services - _pservice = (ParlorService)client.requireService(ParlorService.class); - } - // documentation inherited from interface public void gameIsReady (int gameOid) { @@ -161,8 +141,8 @@ public class ParlorDirector extends BasicDirector handled = grob.receivedGameReady(gameOid) || handled; } - // if none of the observers took matters into their own hands, - // then we'll head on over to the game room ourselves + // if none of the observers took matters into their own hands, then we'll head on over to + // the game room ourselves if (!handled) { _ctx.getLocationDirector().moveTo(gameOid); } @@ -172,8 +152,7 @@ public class ParlorDirector extends BasicDirector public void receivedInvite (int remoteId, Name inviter, GameConfig config) { // create an invitation record for this invitation - Invitation invite = new Invitation( - _ctx, _pservice, inviter, config, null); + Invitation invite = new Invitation(_ctx, _pservice, inviter, config, null); invite.inviteId = remoteId; // put it in the pending invitations table @@ -184,22 +163,19 @@ public class ParlorDirector extends BasicDirector _handler.invitationReceived(invite); } catch (Exception e) { - Log.warning("Invitation handler choked on invite " + - "notification " + invite + "."); + Log.warning("Invitation handler choked on invite notification " + invite + "."); Log.logStackTrace(e); } } // documentation inherited from interface - public void receivedInviteResponse ( - int remoteId, int code, Object arg) + public void receivedInviteResponse (int remoteId, int code, Object arg) { // look up the invitation record for this invitation Invitation invite = (Invitation)_pendingInvites.get(remoteId); if (invite == null) { - Log.warning("Have no record of invitation for which we " + - "received a response?! [remoteId=" + remoteId + - ", code=" + code + ", arg=" + arg + "]."); + Log.warning("Have no record of invitation for which we received a response?! " + + "[remoteId=" + remoteId + ", code=" + code + ", arg=" + arg + "]."); } else { invite.receivedResponse(code, arg); @@ -212,9 +188,22 @@ public class ParlorDirector extends BasicDirector // TBD } + @Override // from BasicDirector + protected void registerServices (Client client) + { + client.addServiceGroup(PARLOR_GROUP); + } + + @Override // from BasicDirector + protected void fetchServices (Client client) + { + // get a handle on our parlor services + _pservice = (ParlorService)client.requireService(ParlorService.class); + } + /** - * Register a new invitation in our pending invitations table. The - * invitation will call this when it knows its invitation id. + * Register a new invitation in our pending invitations table. The invitation will call this + * when it knows its invitation id. */ protected void registerInvitation (Invitation invite) { @@ -222,8 +211,8 @@ public class ParlorDirector extends BasicDirector } /** - * Called by an invitation when it knows it is no longer and can be - * cleared from the pending invitations table. + * Called by an invitation when it knows it is no longer and can be cleared from the pending + * invitations table. */ protected void clearInvitation (Invitation invite) { @@ -236,15 +225,13 @@ public class ParlorDirector extends BasicDirector /** Provides access to parlor server side services. */ protected ParlorService _pservice; - /** The entity that has registered itself to handle incoming - * invitation notifications. */ + /** The entity that has registered itself to handle incoming invitation notifications. */ protected InvitationHandler _handler; - /** A table of acknowledged (but not yet accepted or refused) - * invitation requests, keyed on invitation id. */ + /** A table of acknowledged (but not yet accepted or refused) invitation requests, keyed on + * invitation id. */ protected HashIntMap _pendingInvites = new HashIntMap(); - /** We notify the entities on this list when we get a game ready - * notification. */ + /** We notify the entities on this list when we get a game ready notification. */ protected ArrayList _grobs = new ArrayList(); } diff --git a/src/java/com/threerings/parlor/data/ParlorCodes.java b/src/java/com/threerings/parlor/data/ParlorCodes.java index 405e0cc7..2acc3167 100644 --- a/src/java/com/threerings/parlor/data/ParlorCodes.java +++ b/src/java/com/threerings/parlor/data/ParlorCodes.java @@ -28,6 +28,9 @@ import com.threerings.presents.data.InvocationCodes; */ public interface ParlorCodes extends InvocationCodes { + /** Defines our invocation services group. */ + public static final String PARLOR_GROUP = "parlor"; + /** The response code for an accepted invitation. */ public static final int INVITATION_ACCEPTED = 0; diff --git a/src/java/com/threerings/parlor/server/ParlorManager.java b/src/java/com/threerings/parlor/server/ParlorManager.java index 9ac4abeb..2b1ba852 100644 --- a/src/java/com/threerings/parlor/server/ParlorManager.java +++ b/src/java/com/threerings/parlor/server/ParlorManager.java @@ -36,10 +36,9 @@ import com.threerings.parlor.game.data.GameConfig; import com.threerings.parlor.game.server.GameManager; /** - * The parlor manager is responsible for the parlor services in - * aggregate. This includes maintaining the registry of active games, - * handling the necessary coordination for the matchmaking services and - * anything else that falls outside the scope of an actual in-progress + * The parlor manager is responsible for the parlor services in aggregate. This includes + * maintaining the registry of active games, handling the necessary coordination for the + * matchmaking services and anything else that falls outside the scope of an actual in-progress * game. */ public class ParlorManager @@ -49,41 +48,36 @@ public class ParlorManager public ParlorProvider parprov; /** - * Initializes the parlor manager. This should be called by the server - * that is making use of the parlor services on the single instance of - * parlor manager that it has created. + * Initializes the parlor manager. This should be called by the server that is making use of + * the parlor services on the single instance of parlor manager that it has created. * - * @param invmgr a reference to the invocation manager in use by this - * server. - * @param plreg a reference to the place registry to be used by the - * parlor manager when creating game places. + * @param invmgr a reference to the invocation manager in use by this server. + * @param plreg a reference to the place registry to be used by the parlor manager when + * creating game places. */ public void init (InvocationManager invmgr, PlaceRegistry plreg) { // create and register our invocation provider parprov = new ParlorProvider(this); - invmgr.registerDispatcher(new ParlorDispatcher(parprov), true); + invmgr.registerDispatcher(new ParlorDispatcher(parprov), PARLOR_GROUP); // keep this for later _plreg = plreg; } /** - * Issues an invitation from the inviter to the - * invitee for a game as described by the supplied config - * object. + * Issues an invitation from the inviter to the invitee for a game as + * described by the supplied config object. * * @param inviter the player initiating the invitation. * @param invitee the player being invited. * @param config the configuration of the game being proposed. * - * @return the invitation identifier for the newly created invitation - * record. + * @return the invitation identifier for the newly created invitation record. * - * @exception InvocationException thrown if the invitation was not - * able to be processed for some reason (like the invited player has - * requested not to be disturbed). The explanation will be provided in - * the message data of the exception. + * @exception InvocationException thrown if the invitation was not able to be processed for + * some reason (like the invited player has requested not to be disturbed). The explanation + * will be provided in the message data of the exception. */ public int invite (BodyObject inviter, BodyObject invitee, GameConfig config) @@ -92,9 +86,8 @@ public class ParlorManager // Log.info("Received invitation request [inviter=" + inviter + // ", invitee=" + invitee + ", config=" + config + "]."); - // here we should check to make sure the invitee hasn't muted the - // inviter, and that the inviter isn't shunned and all that other - // access control type stuff + // here we should check to make sure the invitee hasn't muted the inviter, and that the + // inviter isn't shunned and all that other access control type stuff // create a new invitation record for this invitation Invitation invite = new Invitation(inviter, invitee, config); @@ -103,31 +96,25 @@ public class ParlorManager _invites.put(invite.inviteId, invite); // deliver an invite notification to the invitee - ParlorSender.sendInvite( - invitee, invite.inviteId, inviter.getVisibleName(), config); + ParlorSender.sendInvite(invitee, invite.inviteId, inviter.getVisibleName(), config); // and let the caller know the invite id we assigned return invite.inviteId; } /** - * Effects a response to an invitation (accept, refuse or counter), - * made by the specified source user with the specified arguments. + * Effects a response to an invitation (accept, refuse or counter), made by the specified + * source user with the specified arguments. * - * @param source the body object of the user that is issuing this - * response. - * @param inviteId the identifier of the invitation to which we are - * responding. - * @param code the response code (either {@link - * #INVITATION_ACCEPTED}, {@link #INVITATION_REFUSED} or {@link - * #INVITATION_COUNTERED}). - * @param arg the argument that goes along with the response: an - * explanatory message in the case of a refusal (the empty string, not - * null, if no message was provided) or the new game configuration in - * the case of a counter-invitation. + * @param source the body object of the user that is issuing this response. + * @param inviteId the identifier of the invitation to which we are responding. + * @param code the response code (either {@link #INVITATION_ACCEPTED}, {@link + * #INVITATION_REFUSED} or {@link #INVITATION_COUNTERED}). + * @param arg the argument that goes along with the response: an explanatory message in the + * case of a refusal (the empty string, not null, if no message was provided) or the new game + * configuration in the case of a counter-invitation. */ - public void respondToInvite (BodyObject source, int inviteId, int code, - Object arg) + public void respondToInvite (BodyObject source, int inviteId, int code, Object arg) { // look up the invitation Invitation invite = (Invitation)_invites.get(inviteId); @@ -146,23 +133,21 @@ public class ParlorManager return; } - // let the other user know that a response was made to this - // invitation + // let the other user know that a response was made to this invitation ParlorSender.sendInviteResponse( invite.inviter, invite.inviteId, code, arg); switch (code) { case INVITATION_ACCEPTED: - // the invitation was accepted, so we'll need to start up the - // game and get the necessary balls rolling + // the invitation was accepted, so we'll need to start up the game and get the + // necessary balls rolling processAcceptedInvitation(invite); // and remove the invitation from the pending table _invites.remove(inviteId); break; case INVITATION_REFUSED: - // remove the invitation record from the pending table as it - // is no longer pending + // remove the invitation record from the pending table as it is no longer pending _invites.remove(inviteId); break; @@ -172,9 +157,8 @@ public class ParlorManager break; default: - Log.warning("Requested to respond to invitation with " + - "unknown response code [source=" + source + - ", invite=" + invite + ", code=" + code + + Log.warning("Requested to respond to invitation with unknown response code " + + "[source=" + source + ", invite=" + invite + ", code=" + code + ", arg=" + arg + "]."); break; } @@ -183,8 +167,7 @@ public class ParlorManager /** * Requests that an outstanding invitation be cancelled. * - * @param source the body object of the user that is making the - * request. + * @param source the body object of the user that is making the request. * @param inviteId the unique id of the invitation to be cancelled. */ public void cancelInvite (BodyObject source, int inviteId) @@ -193,8 +176,7 @@ public class ParlorManager } /** - * Starts up and configures the game manager for an accepted - * invitation. + * Starts up and configures the game manager for an accepted invitation. */ protected void processAcceptedInvitation (Invitation invite) { @@ -202,25 +184,21 @@ public class ParlorManager Log.info("Creating game manager [invite=" + invite + "]."); // configure the game config with the player info - invite.config.players = new Name[] { - invite.invitee.getVisibleName(), - invite.inviter.getVisibleName() }; + invite.config.players = new Name[] { invite.invitee.getVisibleName(), + invite.inviter.getVisibleName() }; - // create the game manager and begin it's initialization process; - // the game manager will take care of notifying the players that - // the game has been created + // create the game manager and begin it's initialization process; the game manager will + // take care of notifying the players that the game has been created _plreg.createPlace(invite.config); } catch (Exception e) { - Log.warning("Unable to create game manager [invite=" + invite + - ", error=" + e + "]."); + Log.warning("Unable to create game manager [invite=" + invite + ", error=" + e + "]."); Log.logStackTrace(e); } } /** - * The invitation record is used by the parlor manager to keep track - * of pending invitations. + * The invitation record is used by the parlor manager to keep track of pending invitations. */ protected static class Invitation { @@ -237,11 +215,9 @@ public class ParlorManager public GameConfig config; /** - * Constructs a new invitation with the specified participants and - * configuration. + * Constructs a new invitation with the specified participants and configuration. */ - public Invitation (BodyObject inviter, BodyObject invitee, - GameConfig config) + public Invitation (BodyObject inviter, BodyObject invitee, GameConfig config) { this.inviter = inviter; this.invitee = invitee; @@ -249,8 +225,8 @@ public class ParlorManager } /** - * Swaps the inviter and invitee which is necessary when the - * invitee responds with a counter-invitation. + * Swaps the inviter and invitee which is necessary when the invitee responds with a + * counter-invitation. */ public void swapControl () { @@ -266,7 +242,6 @@ public class ParlorManager /** The table of pending invitations. */ protected HashIntMap _invites = new HashIntMap(); - /** A counter used to generate unique identifiers for invitation - * records. */ + /** A counter used to generate unique identifiers for invitation records. */ protected static int _nextInviteId = 0; } diff --git a/src/java/com/threerings/puzzle/server/PuzzleManager.java b/src/java/com/threerings/puzzle/server/PuzzleManager.java index 5e843bc0..4e207302 100644 --- a/src/java/com/threerings/puzzle/server/PuzzleManager.java +++ b/src/java/com/threerings/puzzle/server/PuzzleManager.java @@ -188,7 +188,7 @@ public abstract class PuzzleManager extends GameManager // create and fill in our game service object PuzzleGameMarshaller service = (PuzzleGameMarshaller) - _invmgr.registerDispatcher(new PuzzleGameDispatcher(this), false); + _invmgr.registerDispatcher(new PuzzleGameDispatcher(this)); _puzobj.setPuzzleGameService(service); } diff --git a/src/java/com/threerings/stage/server/StageSceneManager.java b/src/java/com/threerings/stage/server/StageSceneManager.java index 88e25933..abb6384d 100644 --- a/src/java/com/threerings/stage/server/StageSceneManager.java +++ b/src/java/com/threerings/stage/server/StageSceneManager.java @@ -248,8 +248,7 @@ public class StageSceneManager extends SpotSceneManager // register and fill in our stage scene service StageSceneMarshaller service = (StageSceneMarshaller) - StageServer.invmgr.registerDispatcher( - new StageSceneDispatcher(this), false); + StageServer.invmgr.registerDispatcher(new StageSceneDispatcher(this)); _ssobj.setStageSceneService(service); } diff --git a/src/java/com/threerings/whirled/client/SceneDirector.java b/src/java/com/threerings/whirled/client/SceneDirector.java index 46918d10..67b75635 100644 --- a/src/java/com/threerings/whirled/client/SceneDirector.java +++ b/src/java/com/threerings/whirled/client/SceneDirector.java @@ -495,6 +495,12 @@ public class SceneDirector extends BasicDirector _sservice = null; } + // documentation inherited from interface + protected void registerServices (Client client) + { + client.addServiceGroup(WHIRLED_GROUP); + } + // documentation inherited from interface protected void fetchServices (Client client) { diff --git a/src/java/com/threerings/whirled/data/SceneCodes.java b/src/java/com/threerings/whirled/data/SceneCodes.java index 77c5d160..781e2bd3 100644 --- a/src/java/com/threerings/whirled/data/SceneCodes.java +++ b/src/java/com/threerings/whirled/data/SceneCodes.java @@ -28,6 +28,9 @@ import com.threerings.crowd.data.LocationCodes; */ public interface SceneCodes extends LocationCodes { + /** Defines our invocation services group. */ + public static final String WHIRLED_GROUP = "whirled"; + /** The message identifier for scene update messages. */ public static final String SCENE_UPDATE = "scene_update"; } diff --git a/src/java/com/threerings/whirled/server/SceneRegistry.java b/src/java/com/threerings/whirled/server/SceneRegistry.java index 0c046726..a79f3f61 100644 --- a/src/java/com/threerings/whirled/server/SceneRegistry.java +++ b/src/java/com/threerings/whirled/server/SceneRegistry.java @@ -35,26 +35,23 @@ import com.threerings.crowd.server.PlaceRegistry; import com.threerings.whirled.Log; import com.threerings.whirled.data.Scene; +import com.threerings.whirled.data.SceneCodes; import com.threerings.whirled.data.SceneModel; import com.threerings.whirled.server.persist.SceneRepository; import com.threerings.whirled.util.SceneFactory; import com.threerings.whirled.util.UpdateList; /** - * The scene registry is responsible for the management of all scenes. It - * handles interaction with the scene repository and ensures that scenes - * are loaded into memory when needed and flushed from memory when not - * needed. + * The scene registry is responsible for the management of all scenes. It handles interaction with + * the scene repository and ensures that scenes are loaded into memory when needed and flushed from + * memory when not needed. * - *

The scene repository also takes care of bridging from the blocking, - * synchronous world of the scene repository to the non-blocking - * asynchronous world of the distributed object event queue. Thus its - * interfaces for accessing scenes are structured so as to not block the - * dobjmgr thread while waiting for scenes to be read from or written to - * the repository. + *

The scene repository also takes care of bridging from the blocking, synchronous world of the + * scene repository to the non-blocking asynchronous world of the distributed object event + * queue. Thus its interfaces for accessing scenes are structured so as to not block the dobjmgr + * thread while waiting for scenes to be read from or written to the repository. * - *

Note: All access to the scene registry should take place - * from the dobjmgr thread. + *

Note: All access to the scene registry should take place from the dobjmgr thread. */ public class SceneRegistry { @@ -64,8 +61,7 @@ public class SceneRegistry public static interface ConfigFactory { /** - * Creates the place config instance appropriate to the specified - * scene. + * Creates the place config instance appropriate to the specified scene. */ PlaceConfig createPlaceConfig (SceneModel model); } @@ -74,8 +70,8 @@ public class SceneRegistry public SceneProvider sceneprov; /** - * Constructs a scene registry, instructing it to load and store - * scenes using the supplied scene repository. + * Constructs a scene registry, instructing it to load and store scenes using the supplied + * scene repository. */ public SceneRegistry (InvocationManager invmgr, SceneRepository screp, SceneFactory scfact, ConfigFactory confact) @@ -86,14 +82,14 @@ public class SceneRegistry // create/register a scene provider with the invocation services sceneprov = new SceneProvider(CrowdServer.plreg.locprov, this); - invmgr.registerDispatcher(new SceneDispatcher(sceneprov), true); + invmgr.registerDispatcher(new SceneDispatcher(sceneprov), SceneCodes.WHIRLED_GROUP); } /** * Fetches the scene manager assosciated with the specified scene. * - * @return the scene manager for the specified scene or null if no - * scene manager is loaded for that scene. + * @return the scene manager for the specified scene or null if no scene manager is loaded for + * that scene. */ public SceneManager getSceneManager (int sceneId) { @@ -101,8 +97,7 @@ public class SceneRegistry } /** - * Returns a reference to the scene repository in use by this - * registry. + * Returns a reference to the scene repository in use by this registry. */ public SceneRepository getSceneRepository () { @@ -110,9 +105,8 @@ public class SceneRegistry } /** - * Returns {@link SceneManager#where} for the specified scene or - * null:sceneId if no scene manager exists for that - * scene. + * Returns {@link SceneManager#where} for the specified scene or null:sceneId if + * no scene manager exists for that scene. */ public String where (int sceneId) { @@ -121,39 +115,35 @@ public class SceneRegistry } /** - * Because scenes must be loaded from the scene repository and this - * must not be done on the dobjmgr thread, the interface for resolving - * scenes requires that the entity that wishes for a scene to be - * resolved implement this callback interface so that it can be - * notified when a scene has been loaded and initialized. + * Because scenes must be loaded from the scene repository and this must not be done on the + * dobjmgr thread, the interface for resolving scenes requires that the entity that wishes for + * a scene to be resolved implement this callback interface so that it can be notified when a + * scene has been loaded and initialized. */ public static interface ResolutionListener { /** - * Called when the scene has been successfully resolved. The scene - * manager instance provided can be used to obtain a reference to - * the scene, or the scene distributed object. + * Called when the scene has been successfully resolved. The scene manager instance + * provided can be used to obtain a reference to the scene, or the scene distributed + * object. */ public void sceneWasResolved (SceneManager scmgr); /** - * Called if some failure occurred in the scene resolution - * process. + * Called if some failure occurred in the scene resolution process. */ public void sceneFailedToResolve (int sceneId, Exception reason); } /** - * Requests that the specified scene be resolved, which means loaded into - * the server and initialized if the scene is not currently active. The - * supplied callback instance will be notified, on the dobjmgr thread, when - * the scene has been resolved. If the scene is already active, it will be - * notified immediately (before the call to {@link #resolveScene} returns). + * Requests that the specified scene be resolved, which means loaded into the server and + * initialized if the scene is not currently active. The supplied callback instance will be + * notified, on the dobjmgr thread, when the scene has been resolved. If the scene is already + * active, it will be notified immediately (before the call to {@link #resolveScene} returns). * * @param sceneId the id of the scene to resolve. - * @param target a reference to a callback instance that will be notified - * when the scene has been resolved (which may be immediately if the scene - * is already active). + * @param target a reference to a callback instance that will be notified when the scene has + * been resolved (which may be immediately if the scene is already active). */ public void resolveScene (int sceneId, ResolutionListener target) { @@ -168,37 +158,31 @@ public class SceneRegistry Log.debug("Resolving scene [id=" + sceneId + "]."); } - // otherwise we've got to resolve the scene and call them back - // later; we can manipulate the penders table with impunity here - // because we only do so on the dobjmgr thread + // otherwise we've got to resolve the scene and call them back later; we can manipulate the + // penders table with impunity here because we only do so on the dobjmgr thread ArrayList penders = (ArrayList)_penders.get(sceneId); - // if we're already in the process of resolving this scene, just - // add these guys to the list to be notified when it finally is - // resolved + // if we're already in the process of resolving this scene, just add these guys to the list + // to be notified when it finally is resolved if (penders != null) { penders.add(target); } else { - // otherwise we've got to initiate the resolution process. - // first we create the penders list + // otherwise we've got to initiate the resolution process, create the penders list _penders.put(sceneId, penders = new ArrayList()); penders.add(target); - // i don't like cluttering up method declarations with final - // keywords... + // i don't like cluttering up method declarations with final keywords... final int fsceneId = sceneId; if (Log.debug()) { Log.debug("Invoking scene lookup [id=" + sceneId + "]."); } - // then we queue up an execution unit that'll load the scene - // and initialize it and all that + // then we queue up an execution unit that'll load the scene and initialize it etc. WhirledServer.invoker.postUnit(new Invoker.Unit() { // this is run on the invoker thread - public boolean invoke () - { + public boolean invoke () { try { _model = _screp.loadSceneModel(fsceneId); _updates = _screp.loadUpdates(fsceneId); @@ -209,23 +193,19 @@ public class SceneRegistry } // this is run on the dobjmgr thread - public void handleResult () - { + public void handleResult () { if (_cause != null) { processFailedResolution(fsceneId, _cause); } else if (_model != null) { processSuccessfulResolution(_model, _updates); } else { - Log.warning("Scene loading unit finished with " + - "neither a scene nor a reason for " + - "failure!?"); + Log.warning("Scene loading unit finished with neither a scene nor a " + + "reason for failure!?"); } } - public String toString () - { - return "SceneRegistry.SceneLoader " + - (_model == null ? "" : _model.name) + + public String toString () { + return "SceneRegistry.SceneLoader " + (_model == null ? "" : _model.name) + "(" + fsceneId + ")"; } @@ -242,28 +222,24 @@ public class SceneRegistry protected void processSuccessfulResolution ( SceneModel model, final UpdateList updates) { - // now that the scene is loaded, we can create a scene manager for - // it. that will be initialized by the place registry and when - // that is finally complete, then we can let our penders know - // what's up + // now that the scene is loaded, we can create a scene manager for it. that will be + // initialized by the place registry and when that is finally complete, then we can let our + // penders know what's up try { // first create our scene instance - final Scene scene = _scfact.createScene( - model, _confact.createPlaceConfig(model)); + final Scene scene = _scfact.createScene(model, _confact.createPlaceConfig(model)); // now create our scene manager - CrowdServer.plreg.createPlace(scene.getPlaceConfig(), - new PlaceRegistry.PreStartupHook() { - public void invoke (PlaceManager pmgr) { - ((SceneManager)pmgr).setSceneData( - scene, updates, SceneRegistry.this); - } - }); + CrowdServer.plreg.createPlace( + scene.getPlaceConfig(), new PlaceRegistry.PreStartupHook() { + public void invoke (PlaceManager pmgr) { + ((SceneManager)pmgr).setSceneData(scene, updates, SceneRegistry.this); + } + }); - // when the scene manager completes its startup procedings, it will - // call back to the scene registry and let us know that we can turn - // the penders loose + // when the scene manager completes its startup procedings, it will call back to the + // scene registry and let us know that we can turn the penders loose } catch (Exception e) { // so close, but no cigar @@ -276,8 +252,7 @@ public class SceneRegistry */ protected void processFailedResolution (int sceneId, Exception cause) { - Log.info("Failed to resolve scene [sceneId=" + sceneId + - ", cause=" + cause + "]."); + Log.info("Failed to resolve scene [sceneId=" + sceneId + ", cause=" + cause + "]."); Log.logStackTrace(cause); // alas things didn't work out, notify our penders @@ -296,8 +271,8 @@ public class SceneRegistry } /** - * Called by the scene manager once it has started up (meaning that it - * has its place object and is ready to roll). + * Called by the scene manager once it has started up (meaning that it has its place object and + * is ready to roll). */ protected void sceneManagerDidStart (SceneManager scmgr) { @@ -306,8 +281,7 @@ public class SceneRegistry _scenemgrs.put(sceneId, scmgr); if (Log.debug()) { - Log.debug("Registering scene manager [scid=" + sceneId + - ", scmgr=" + scmgr + "]."); + Log.debug("Registering scene manager [scid=" + sceneId + ", scmgr=" + scmgr + "]."); } // now notify any penders @@ -331,8 +305,7 @@ public class SceneRegistry protected void unmapSceneManager (SceneManager scmgr) { if (_scenemgrs.remove(scmgr.getScene().getId()) == null) { - Log.warning("Requested to unmap unmapped scene manager " + - "[scmgr=" + scmgr + "]."); + Log.warning("Requested to unmap unmapped scene manager [scmgr=" + scmgr + "]."); return; } @@ -347,8 +320,7 @@ public class SceneRegistry /** Used to generate place configs for our scenes. */ protected ConfigFactory _confact; - /** The entity via which we create scene instances from scene - * models. */ + /** The entity via which we create scene instances from scene models. */ protected SceneFactory _scfact; /** A mapping from scene ids to scene managers. */ diff --git a/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java b/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java index 5015762d..4dd3b8e8 100644 --- a/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java +++ b/src/java/com/threerings/whirled/zone/server/ZoneRegistry.java @@ -29,11 +29,12 @@ import com.threerings.crowd.server.PlaceRegistry; import com.threerings.whirled.server.SceneRegistry; import com.threerings.whirled.zone.Log; +import com.threerings.whirled.zone.data.ZoneCodes; import com.threerings.whirled.zone.util.ZoneUtil; /** - * The zone registry takes care of mapping zone requests to the - * appropriate registered zone manager. + * The zone registry takes care of mapping zone requests to the appropriate registered zone + * manager. */ public class ZoneRegistry { @@ -43,29 +44,25 @@ public class ZoneRegistry /** * Creates a zone manager with the supplied configuration. */ - public ZoneRegistry (InvocationManager invmgr, PlaceRegistry plreg, - SceneRegistry screg) + public ZoneRegistry (InvocationManager invmgr, PlaceRegistry plreg, SceneRegistry screg) { - // create a zone provider and register it with the invocation - // services + // create a zone provider and register it with the invocation services zoneprov = new ZoneProvider(plreg.locprov, this, screg); - invmgr.registerDispatcher(new ZoneDispatcher(zoneprov), true); + invmgr.registerDispatcher(new ZoneDispatcher(zoneprov), ZoneCodes.WHIRLED_GROUP); } /** - * Registers the supplied zone manager as the manager for the - * specified zone type. Zone types are 7 bits and managers are - * responsible for making sure they don't use a zone type that - * collides with another manager (given that we have only three zone - * types at present, this doesn't seem unreasonable). + * Registers the supplied zone manager as the manager for the specified zone type. Zone types + * are 7 bits and managers are responsible for making sure they don't use a zone type that + * collides with another manager (given that we have only three zone types at present, this + * doesn't seem unreasonable). */ public void registerZoneManager (byte zoneType, ZoneManager manager) { ZoneManager old = (ZoneManager)_managers.get(zoneType); if (old != null) { - Log.warning("Zone manager already registered with requested " + - "type [type=" + zoneType + ", old=" + old + - ", new=" + manager + "]."); + Log.warning("Zone manager already registered with requested type [type=" + zoneType + + ", old=" + old + ", new=" + manager + "]."); } else { _managers.put(zoneType, manager); } @@ -74,8 +71,7 @@ public class ZoneRegistry /** * Returns the zone manager that handles the specified zone id. * - * @param qualifiedZoneId the qualified zone id for which the manager - * should be looked up. + * @param qualifiedZoneId the qualified zone id for which the manager should be looked up. */ public ZoneManager getZoneManager (int qualifiedZoneId) {