From 4894d1cfde967e5741175c571abcf61c1976605c Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Fri, 7 Jul 2006 04:02:42 +0000 Subject: [PATCH] Annoyingly, ClientObserver.clientDidLogoff() is called before the client's inner bits are all clear and ready to try logging on to a new server. We specifically wait to call clientLogonFailed() until after everything is cleared, but I don't want to change the behavior of clientDidLogoff() for fear that any one of the zillion directors depends on something being around during that call. Instead I added another callback clientDidClear() that is called when a successful session is fulled cleared out (basically when we're not calling clientLogonFailed()) so that entities that are waiting for a logoff to finish so that they can logon somewhere else have a clean way of doing so. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4255 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- src/java/com/threerings/presents/client/Client.java | 9 +++++++++ .../com/threerings/presents/client/ClientAdapter.java | 5 +++++ .../com/threerings/presents/client/ClientObserver.java | 9 +++++++++ .../com/threerings/presents/peer/server/PeerManager.java | 6 ++++++ .../src/java/com/threerings/crowd/client/TestClient.java | 4 ++++ 5 files changed, 33 insertions(+) diff --git a/src/java/com/threerings/presents/client/Client.java b/src/java/com/threerings/presents/client/Client.java index 0efac576f..26146b609 100644 --- a/src/java/com/threerings/presents/client/Client.java +++ b/src/java/com/threerings/presents/client/Client.java @@ -632,6 +632,8 @@ public class Client // changed like the server or port) if (logonError != null) { notifyObservers(CLIENT_FAILED_TO_LOGON, logonError); + } else { + notifyObservers(CLIENT_DID_CLEAR, null); } } }); @@ -712,6 +714,12 @@ public class Client obs.clientDidLogoff(Client.this); break; + case CLIENT_DID_CLEAR: + if (obs instanceof ClientObserver) { + ((ClientObserver)obs).clientDidClear(Client.this); + } + break; + default: throw new RuntimeException("Invalid code supplied to " + "notifyObservers: " + _code); @@ -797,4 +805,5 @@ public class Client static final int CLIENT_CONNECTION_FAILED = 3; static final int CLIENT_WILL_LOGOFF = 4; static final int CLIENT_DID_LOGOFF = 5; + static final int CLIENT_DID_CLEAR = 6; } diff --git a/src/java/com/threerings/presents/client/ClientAdapter.java b/src/java/com/threerings/presents/client/ClientAdapter.java index 2d6210a5f..d0cf7759c 100644 --- a/src/java/com/threerings/presents/client/ClientAdapter.java +++ b/src/java/com/threerings/presents/client/ClientAdapter.java @@ -62,4 +62,9 @@ public class ClientAdapter implements ClientObserver public void clientDidLogoff (Client client) { } + + // documentation inherited + public void clientDidClear (Client client) + { + } } diff --git a/src/java/com/threerings/presents/client/ClientObserver.java b/src/java/com/threerings/presents/client/ClientObserver.java index 7996fb17a..305b2c828 100644 --- a/src/java/com/threerings/presents/client/ClientObserver.java +++ b/src/java/com/threerings/presents/client/ClientObserver.java @@ -77,4 +77,13 @@ public interface ClientObserver extends SessionObserver * request. */ public boolean clientWillLogoff (Client client); + + /** + * Called after the client is completely logged off from a successful + * session and is ready to reconnect to a new server if desired. This will + * only be called after an active session was terminated, not after a logon + * attempt failed as that failure will be reported by {@link + * #clientFailedToLogon}. + */ + public void clientDidClear (Client client); } diff --git a/src/java/com/threerings/presents/peer/server/PeerManager.java b/src/java/com/threerings/presents/peer/server/PeerManager.java index 93b76b501..a9946bfc1 100644 --- a/src/java/com/threerings/presents/peer/server/PeerManager.java +++ b/src/java/com/threerings/presents/peer/server/PeerManager.java @@ -418,6 +418,12 @@ public class PeerManager // TODO: clean things up? } + // documentation inherited from interface ClientObserver + public void clientDidClear (Client client) + { + // nothing doing + } + // documentation inherited from interface Subscriber public void objectAvailable (NodeObject object) { diff --git a/tests/src/java/com/threerings/crowd/client/TestClient.java b/tests/src/java/com/threerings/crowd/client/TestClient.java index a8223ced8..9bdba5b04 100644 --- a/tests/src/java/com/threerings/crowd/client/TestClient.java +++ b/tests/src/java/com/threerings/crowd/client/TestClient.java @@ -120,6 +120,10 @@ public class TestClient System.exit(0); } + public void clientDidClear (Client client) + { + } + protected CrowdContext createContext () { return new CrowdContextImpl();