Make XMPP login work
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@404 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
28e5462b08
commit
182d3b499b
3 changed files with 114 additions and 14 deletions
|
@ -1,5 +1,6 @@
|
||||||
package jrummikub.control;
|
package jrummikub.control;
|
||||||
|
|
||||||
|
import jrummikub.control.network.NetworkControl;
|
||||||
import jrummikub.model.GameSettings;
|
import jrummikub.model.GameSettings;
|
||||||
import jrummikub.model.GameState;
|
import jrummikub.model.GameState;
|
||||||
import jrummikub.model.IRoundState;
|
import jrummikub.model.IRoundState;
|
||||||
|
@ -17,6 +18,7 @@ import jrummikub.view.IView.BottomPanelType;
|
||||||
public class ApplicationControl {
|
public class ApplicationControl {
|
||||||
private SettingsControl settingsControl;
|
private SettingsControl settingsControl;
|
||||||
private LoginControl loginControl;
|
private LoginControl loginControl;
|
||||||
|
private NetworkControl networkControl;
|
||||||
private SaveControl saveControl;
|
private SaveControl saveControl;
|
||||||
private GameControl gameControl;
|
private GameControl gameControl;
|
||||||
|
|
||||||
|
@ -76,13 +78,12 @@ public class ApplicationControl {
|
||||||
}
|
}
|
||||||
|
|
||||||
loginControl = new LoginControl(view);
|
loginControl = new LoginControl(view);
|
||||||
loginControl.getLoginEvent().add(
|
loginControl.getLoginEvent().add(new IListener1<LoginData>() {
|
||||||
new IListener1<LoginData>() {
|
@Override
|
||||||
@Override
|
public void handle(LoginData loginData) {
|
||||||
public void handle(LoginData loginData) {
|
createNetworkControl(loginData);
|
||||||
// TODO Auto-generated method stub
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
loginControl.getCancelEvent().add(new IListener() {
|
loginControl.getCancelEvent().add(new IListener() {
|
||||||
@Override
|
@Override
|
||||||
public void handle() {
|
public void handle() {
|
||||||
|
@ -109,6 +110,11 @@ public class ApplicationControl {
|
||||||
loginControl.abort();
|
loginControl.abort();
|
||||||
loginControl = null;
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
87
src/jrummikub/control/network/NetworkControl.java
Normal file
87
src/jrummikub/control/network/NetworkControl.java
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import javax.swing.Box;
|
||||||
import javax.swing.JButton;
|
import javax.swing.JButton;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JPasswordField;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.border.CompoundBorder;
|
import javax.swing.border.CompoundBorder;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
|
@ -39,10 +40,10 @@ class LoginPanel extends JPanel implements ILoginPanel {
|
||||||
c.weightx = 1;
|
c.weightx = 1;
|
||||||
c.weighty = 1;
|
c.weighty = 1;
|
||||||
|
|
||||||
userNameField = addInputRow("Benutzername:");
|
userNameField = addInputRow("Benutzername:", new JTextField());
|
||||||
serverNameField = addInputRow("Server:");
|
serverNameField = addInputRow("Server:", new JTextField());
|
||||||
passwordField = addInputRow("Passwort:");
|
passwordField = addInputRow("Passwort:", new JPasswordField());
|
||||||
channelNameField = addInputRow("Channel:");
|
channelNameField = addInputRow("Channel:", new JTextField());
|
||||||
add(Box.createVerticalGlue(), c);
|
add(Box.createVerticalGlue(), c);
|
||||||
|
|
||||||
c.gridwidth = 1;
|
c.gridwidth = 1;
|
||||||
|
@ -85,7 +86,7 @@ class LoginPanel extends JPanel implements ILoginPanel {
|
||||||
return cancelEvent;
|
return cancelEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
private JTextField addInputRow(String label) {
|
private JTextField addInputRow(String label, JTextField textField) {
|
||||||
GridBagConstraints c = new GridBagConstraints();
|
GridBagConstraints c = new GridBagConstraints();
|
||||||
c.fill = GridBagConstraints.BOTH;
|
c.fill = GridBagConstraints.BOTH;
|
||||||
c.gridwidth = 1;
|
c.gridwidth = 1;
|
||||||
|
@ -94,8 +95,6 @@ class LoginPanel extends JPanel implements ILoginPanel {
|
||||||
|
|
||||||
add(new JLabel(label), c);
|
add(new JLabel(label), c);
|
||||||
|
|
||||||
JTextField textField = new JTextField();
|
|
||||||
|
|
||||||
c.gridwidth = GridBagConstraints.REMAINDER;
|
c.gridwidth = GridBagConstraints.REMAINDER;
|
||||||
add(textField, c);
|
add(textField, c);
|
||||||
return textField;
|
return textField;
|
||||||
|
|
Reference in a new issue