summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2011-06-22 07:04:15 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2011-06-22 07:04:15 +0200
commitada8c1869c5b2b007e690e4c028fd20b34a41706 (patch)
tree894a27b7f4f7ae874c53882690c45805d5780a44 /src
parentd2df76cae49bf31b28d422b5ddfbfb5b1e7651d0 (diff)
downloadJRummikub-ada8c1869c5b2b007e690e4c028fd20b34a41706.tar
JRummikub-ada8c1869c5b2b007e690e4c028fd20b34a41706.zip
Add proper handling for lost server connections
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@581 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src')
-rw-r--r--src/jrummikub/control/network/ConnectionControl.java33
-rw-r--r--src/jrummikub/control/network/IConnectionControl.java2
-rw-r--r--src/jrummikub/control/network/NetworkControl.java25
-rw-r--r--src/jrummikub/view/IView.java6
-rw-r--r--src/jrummikub/view/impl/StartTurnPanel.java12
-rw-r--r--src/jrummikub/view/impl/View.java8
6 files changed, 82 insertions, 4 deletions
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<String> participantLeftEvent = new Event1<String>();
+ private Event connectionLostEvent = new Event();
private GameData currentGame;
@@ -262,6 +264,11 @@ public class ConnectionControl implements IConnectionControl {
}
@Override
+ public IEvent getConnectionLostEvent() {
+ return connectionLostEvent;
+ }
+
+ @Override
public void offerGame(GameData data) {
offeredGame = data;
currentGame = 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<String> 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
@@ -605,6 +605,11 @@ public class View extends JFrame implements IView {
}
@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);