diff --git a/src/java/com/threerings/presents/server/ClientResolver.java b/src/java/com/threerings/presents/server/ClientResolver.java index 010fbabf1..2cf983485 100644 --- a/src/java/com/threerings/presents/server/ClientResolver.java +++ b/src/java/com/threerings/presents/server/ClientResolver.java @@ -45,6 +45,13 @@ import static com.threerings.presents.Log.log; */ public class ClientResolver extends Invoker.Unit { + /** + * Thrown during resolution if the client disconnects. + */ + public static class ClientDisconnectedException extends Exception + { + } + /** * Initiailizes this instance. * @@ -191,6 +198,17 @@ public class ClientResolver extends Invoker.Unit } } + /** + * Throws an exception if the client being resolved is no longer connected. + */ + protected void enforceConnected () + throws ClientDisconnectedException + { + if (_clmgr.getClient(_username) == null) { + throw new ClientDisconnectedException(); + } + } + /** The name of the user whose client object is being resolved. */ protected Name _username; @@ -206,4 +224,5 @@ public class ClientResolver extends Invoker.Unit // dependencies protected @Inject @MainInvoker Invoker _invoker; protected @Inject RootDObjectManager _omgr; + protected @Inject ClientManager _clmgr; } diff --git a/src/java/com/threerings/presents/server/PresentsSession.java b/src/java/com/threerings/presents/server/PresentsSession.java index d7a3a94e0..3ed8bff78 100644 --- a/src/java/com/threerings/presents/server/PresentsSession.java +++ b/src/java/com/threerings/presents/server/PresentsSession.java @@ -388,8 +388,13 @@ public class PresentsSession // from interface ClientResolutionListener public void resolutionFailed (Name username, Exception reason) { - // urk; nothing to do but complain and get the f**k out of dodge - log.warning("Unable to resolve client", "username", username, reason); + if (reason instanceof ClientResolver.ClientDisconnectedException) { + log.info("Client disconnected during resolution", "username", username); + + } else { + // urk; nothing to do but complain and get the f**k out of dodge + log.warning("Unable to resolve client", "username", username, reason); + } // end the session now to prevent danglage endSession();