From ada8c1869c5b2b007e690e4c028fd20b34a41706 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 22 Jun 2011 07:04:15 +0200 Subject: Add proper handling for lost server connections git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@581 72836036-5685-4462-b002-a69064685172 --- .../control/network/MockConnectionControl.java | 7 +++++ mock/jrummikub/view/MockView.java | 11 ++++++-- .../control/network/ConnectionControl.java | 33 ++++++++++++++++++++++ .../control/network/IConnectionControl.java | 2 ++ src/jrummikub/control/network/NetworkControl.java | 25 +++++++++++++++- src/jrummikub/view/IView.java | 6 ++-- src/jrummikub/view/impl/StartTurnPanel.java | 12 ++++++++ src/jrummikub/view/impl/View.java | 8 +++++- 8 files changed, 98 insertions(+), 6 deletions(-) diff --git a/mock/jrummikub/control/network/MockConnectionControl.java b/mock/jrummikub/control/network/MockConnectionControl.java index ce8c4e3..faa1303 100644 --- a/mock/jrummikub/control/network/MockConnectionControl.java +++ b/mock/jrummikub/control/network/MockConnectionControl.java @@ -54,6 +54,8 @@ public class MockConnectionControl implements IConnectionControl { /** */ public MockEvent1 participantLeftEvent = new MockEvent1(); /** */ + public MockEvent connectionLostEvent = new MockEvent(); + /** */ public GameData currentGame; /** */ public GameData offeredGame; @@ -177,6 +179,11 @@ public class MockConnectionControl implements IConnectionControl { return participantLeftEvent; } + @Override + public IEvent getConnectionLostEvent() { + return connectionLostEvent; + } + @Override public void offerGame(GameData data) { offeredGame = data; diff --git a/mock/jrummikub/view/MockView.java b/mock/jrummikub/view/MockView.java index d26432a..1472742 100644 --- a/mock/jrummikub/view/MockView.java +++ b/mock/jrummikub/view/MockView.java @@ -79,6 +79,8 @@ public class MockView implements IView { /** */ public MockEvent acknowledgeInvalidEvent = new MockEvent(); /** */ + public MockEvent acknowledgeConnectionLostEvent = new MockEvent(); + /** */ public MockEvent1 loadFileEvent = new MockEvent1(); @Override @@ -116,6 +118,11 @@ public class MockView implements IView { return acknowledgeInvalidEvent; } + @Override + public IEvent getAcknowledgeConnectionLostEvent() { + return acknowledgeConnectionLostEvent; + } + @Override public IEvent getEndProgramEvent() { return quitEvent; @@ -173,7 +180,7 @@ public class MockView implements IView { @Override public void showSidePanel(boolean show) { - isSidePanelVisible=show; + isSidePanelVisible = show; } public void showQuitWarningPanel(boolean show) { @@ -192,7 +199,7 @@ public class MockView implements IView { @Override public void showConnectPanel(boolean show) { - isConnectPanelVisible=show; + isConnectPanelVisible = show; } diff --git a/src/jrummikub/control/network/ConnectionControl.java b/src/jrummikub/control/network/ConnectionControl.java index 7491938..0de8776 100644 --- a/src/jrummikub/control/network/ConnectionControl.java +++ b/src/jrummikub/control/network/ConnectionControl.java @@ -25,6 +25,7 @@ import jrummikub.view.LoginError; import org.jivesoftware.smack.Connection; import org.jivesoftware.smack.ConnectionConfiguration; +import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; @@ -117,6 +118,7 @@ public class ConnectionControl implements IConnectionControl { private Event turnStartEvent = new Event(); private Event1 participantLeftEvent = new Event1(); + private Event connectionLostEvent = new Event(); private GameData currentGame; @@ -261,6 +263,11 @@ public class ConnectionControl implements IConnectionControl { return participantLeftEvent; } + @Override + public IEvent getConnectionLostEvent() { + return connectionLostEvent; + } + @Override public void offerGame(GameData data) { offeredGame = data; @@ -612,6 +619,7 @@ public class ConnectionControl implements IConnectionControl { config.setSendPresence(false); config.setRosterLoadedAtLogin(false); config.setCompressionEnabled(true); + config.setReconnectionAllowed(false); connection = new XMPPConnection(config); @@ -651,6 +659,7 @@ public class ConnectionControl implements IConnectionControl { private LoginError doConnect() { try { connection.connect(); + connection.addConnectionListener(new DisconnectListener()); return null; } catch (XMPPException e) { XMPPError xmppError = e.getXMPPError(); @@ -714,6 +723,30 @@ public class ConnectionControl implements IConnectionControl { return null; } + private class DisconnectListener implements ConnectionListener { + @Override + public void connectionClosed() { + emitLater(connectionLostEvent); + } + + @Override + public void connectionClosedOnError(Exception arg0) { + connectionClosed(); + } + + @Override + public void reconnectingIn(int arg0) { + } + + @Override + public void reconnectionFailed(Exception arg0) { + } + + @Override + public void reconnectionSuccessful() { + } + } + private class LeaveListener implements ParticipantStatusListener { @Override public void voiceRevoked(String arg0) { diff --git a/src/jrummikub/control/network/IConnectionControl.java b/src/jrummikub/control/network/IConnectionControl.java index 9307ce0..f9f5edd 100644 --- a/src/jrummikub/control/network/IConnectionControl.java +++ b/src/jrummikub/control/network/IConnectionControl.java @@ -54,6 +54,8 @@ interface IConnectionControl { public IEvent1 getParticipantLeftEvent(); + public IEvent getConnectionLostEvent(); + public void offerGame(GameData data); public void withdrawGame(); diff --git a/src/jrummikub/control/network/NetworkControl.java b/src/jrummikub/control/network/NetworkControl.java index cd0f66f..5e38d1e 100644 --- a/src/jrummikub/control/network/NetworkControl.java +++ b/src/jrummikub/control/network/NetworkControl.java @@ -15,7 +15,6 @@ import jrummikub.util.IEvent; import jrummikub.util.IListener; import jrummikub.util.IListener1; import jrummikub.util.LoginData; -import jrummikub.view.IQuitWarningPanel.QuitMode; import jrummikub.view.IView; import jrummikub.view.IView.BottomPanelType; import jrummikub.view.LoginError; @@ -141,6 +140,23 @@ public class NetworkControl { } } })); + connections.add(connectionControl.getConnectionLostEvent().add( + new IListener() { + @Override + public void handle() { + abort(); + view.setBottomPanel(BottomPanelType.NETWORK_SERVER_CONNECTION_LOST_PANEL); + connections.add(view.getAcknowledgeConnectionLostEvent().add( + new IListener() { + @Override + public void handle() { + abort(); + view.setBottomPanel(BottomPanelType.START_GAME_PANEL); + backToLoginEvent.emit(); + } + })); + } + })); } private void addOfferUpdateListener() { @@ -342,6 +358,13 @@ public class NetworkControl { view.showGameListPanel(true); } }); + gameControl.getEndOfGameEvent().add(new IListener() { + @Override + public void handle() { + view.setBottomPanel(BottomPanelType.START_GAME_PANEL); + view.showGameListPanel(true); + } + }); gameControl.startGame(); } diff --git a/src/jrummikub/view/IView.java b/src/jrummikub/view/IView.java index c8f7ce0..72c3808 100644 --- a/src/jrummikub/view/IView.java +++ b/src/jrummikub/view/IView.java @@ -86,7 +86,9 @@ public interface IView { * * @return the event */ - IEvent getAcknowledgeInvalidEvent(); + public IEvent getAcknowledgeInvalidEvent(); + + public IEvent getAcknowledgeConnectionLostEvent(); /** * The quit event is emitted when the player wants to quit the game @@ -367,6 +369,6 @@ public interface IView { * Different types of bottom panels */ public enum BottomPanelType { - START_GAME_PANEL, START_TURN_PANEL, START_REDEAL_TURN_PANEL, START_LAST_TURN_PANEL, INVALID_TURN_PANEL, HUMAN_HAND_PANEL, NONHUMAN_HAND_PANEL, WIN_PANEL, NETWORK_WIN_PANEL, NETWORK_CONNECTION_LOST_PANEL + START_GAME_PANEL, START_TURN_PANEL, START_REDEAL_TURN_PANEL, START_LAST_TURN_PANEL, INVALID_TURN_PANEL, HUMAN_HAND_PANEL, NONHUMAN_HAND_PANEL, WIN_PANEL, NETWORK_WIN_PANEL, NETWORK_CONNECTION_LOST_PANEL, NETWORK_SERVER_CONNECTION_LOST_PANEL } } diff --git a/src/jrummikub/view/impl/StartTurnPanel.java b/src/jrummikub/view/impl/StartTurnPanel.java index d3f139d..4f1a8e4 100644 --- a/src/jrummikub/view/impl/StartTurnPanel.java +++ b/src/jrummikub/view/impl/StartTurnPanel.java @@ -33,6 +33,7 @@ class StartTurnPanel extends JPanel { private Event startTurnEvent = new Event(); private Event acknowledgeInvalidEvent = new Event(); + private Event acknowledgeConnectionLostEvent = new Event(); private Event buttonEvent = startTurnEvent; private BottomPanelType type; @@ -97,6 +98,10 @@ class StartTurnPanel extends JPanel { return acknowledgeInvalidEvent; } + IEvent getAcknowledgeConnectionLostEvent() { + return acknowledgeConnectionLostEvent; + } + private void rescale() { Insets insets = getInsets(); int x = insets.left, y = insets.top, width = getWidth() - insets.left @@ -184,6 +189,13 @@ class StartTurnPanel extends JPanel { startTurnButton.setText("N\u00E4chster Spieler"); buttonEvent = acknowledgeInvalidEvent; break; + + case NETWORK_SERVER_CONNECTION_LOST_PANEL: + startTurnLabel.setIcon(null); + startTurnLabel.setText("Die Verbindung zum Server wurde getrennt."); + startTurnButton.setText("OK"); + buttonEvent = acknowledgeConnectionLostEvent; + break; } rescale(); diff --git a/src/jrummikub/view/impl/View.java b/src/jrummikub/view/impl/View.java index 34ae800..06e2721 100644 --- a/src/jrummikub/view/impl/View.java +++ b/src/jrummikub/view/impl/View.java @@ -604,6 +604,11 @@ public class View extends JFrame implements IView { return startTurnPanel.getAcknowledgeInvalidEvent(); } + @Override + public IEvent getAcknowledgeConnectionLostEvent() { + return startTurnPanel.getAcknowledgeConnectionLostEvent(); + } + @Override public IEvent getNewRoundEvent() { return roundEndPanel.getNewRoundEvent(); @@ -667,7 +672,8 @@ public class View extends JFrame implements IView { private void doSetBottomPanel(BottomPanelType type) { boolean showStartTurnPanel = (type == BottomPanelType.START_TURN_PANEL || type == BottomPanelType.START_REDEAL_TURN_PANEL - || type == BottomPanelType.START_LAST_TURN_PANEL || type == BottomPanelType.INVALID_TURN_PANEL); + || type == BottomPanelType.START_LAST_TURN_PANEL + || type == BottomPanelType.INVALID_TURN_PANEL || type == BottomPanelType.NETWORK_SERVER_CONNECTION_LOST_PANEL); startTurnPanel.setType(type); startTurnPanel.setVisible(showStartTurnPanel); -- cgit v1.2.3