summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub/control')
-rw-r--r--src/jrummikub/control/ApplicationControl.java28
-rw-r--r--src/jrummikub/control/network/NetworkControl.java87
2 files changed, 108 insertions, 7 deletions
diff --git a/src/jrummikub/control/ApplicationControl.java b/src/jrummikub/control/ApplicationControl.java
index b42bc4f..29114a1 100644
--- a/src/jrummikub/control/ApplicationControl.java
+++ b/src/jrummikub/control/ApplicationControl.java
@@ -1,5 +1,6 @@
package jrummikub.control;
+import jrummikub.control.network.NetworkControl;
import jrummikub.model.GameSettings;
import jrummikub.model.GameState;
import jrummikub.model.IRoundState;
@@ -17,6 +18,7 @@ import jrummikub.view.IView.BottomPanelType;
public class ApplicationControl {
private SettingsControl settingsControl;
private LoginControl loginControl;
+ private NetworkControl networkControl;
private SaveControl saveControl;
private GameControl gameControl;
@@ -76,13 +78,12 @@ public class ApplicationControl {
}
loginControl = new LoginControl(view);
- loginControl.getLoginEvent().add(
- new IListener1<LoginData>() {
- @Override
- public void handle(LoginData loginData) {
- // TODO Auto-generated method stub
- }
- });
+ loginControl.getLoginEvent().add(new IListener1<LoginData>() {
+ @Override
+ public void handle(LoginData loginData) {
+ createNetworkControl(loginData);
+ }
+ });
loginControl.getCancelEvent().add(new IListener() {
@Override
public void handle() {
@@ -109,6 +110,11 @@ public class ApplicationControl {
loginControl.abort();
loginControl = null;
}
+
+ if (networkControl != null) {
+ networkControl.abort();
+ networkControl = null;
+ }
}
/**
@@ -146,4 +152,12 @@ public class ApplicationControl {
}
});
}
+
+ private void createNetworkControl(LoginData loginData) {
+ networkControl = new NetworkControl(loginData);
+
+ // TODO Add listeners
+
+ networkControl.connect();
+ }
}
diff --git a/src/jrummikub/control/network/NetworkControl.java b/src/jrummikub/control/network/NetworkControl.java
new file mode 100644
index 0000000..4494cb6
--- /dev/null
+++ b/src/jrummikub/control/network/NetworkControl.java
@@ -0,0 +1,87 @@
+package jrummikub.control.network;
+
+import javax.swing.SwingUtilities;
+
+import jrummikub.util.Event;
+import jrummikub.util.LoginData;
+
+import org.jivesoftware.smack.Connection;
+import org.jivesoftware.smack.XMPPConnection;
+import org.jivesoftware.smack.XMPPException;
+import org.jivesoftware.smack.packet.XMPPError;
+import org.jivesoftware.smack.packet.XMPPError.Type;
+import org.jivesoftware.smackx.muc.MultiUserChat;
+
+public class NetworkControl {
+ private final LoginData loginData;
+ private Connection connection;
+ private MultiUserChat muc;
+ private Thread networkThread;
+
+ private Event connectedEvent = new Event();
+ private Event connectionFailedEvent = new Event();
+
+ public NetworkControl(LoginData loginData) {
+ this.loginData = loginData;
+ }
+
+ public void connect() {
+ new Thread(new ConnectRunner()).run();
+ }
+
+ public void abort() {
+ // TODO Implement this
+ }
+
+ private static void emitLater(final Event event) {
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+ event.emit();
+ }
+ });
+ }
+
+ private class ConnectRunner implements Runnable {
+ @Override
+ public void run() {
+ connection = new XMPPConnection(loginData.getServerName());
+ try {
+ connection.connect();
+ connection.login(loginData.getUserName(), loginData.getPassword(),
+ "JRummikub");
+ muc = new MultiUserChat(connection, loginData.getChannelName());
+
+ String nickname = loginData.getUserName();
+ // Loop until a unused nickname is found
+ while (true) {
+ try {
+ muc.join(nickname);
+ break; // Join was successful, break the loop
+ } catch (XMPPException e) {
+ XMPPError error = e.getXMPPError();
+ if (error.getType() == Type.CANCEL && error.getCode() == 409) {
+ // There was a conflict, try again with another nickname
+ nickname += "_";
+ continue;
+ } else {
+ // An unknown error has occurred, cancel connect
+ throw e;
+ }
+ }
+ }
+
+ emitLater(connectedEvent);
+ } catch (XMPPException e) {
+ connection.disconnect();
+ connection = null;
+
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+
+ emitLater(connectionFailedEvent);
+ }
+ }
+ }
+}