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:
Matthias Schiffer 2011-06-10 19:06:52 +02:00
parent 28e5462b08
commit 182d3b499b
3 changed files with 114 additions and 14 deletions

View file

@ -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();
}
}

View 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);
}
}
}
}

View file

@ -10,6 +10,7 @@ import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
@ -39,10 +40,10 @@ class LoginPanel extends JPanel implements ILoginPanel {
c.weightx = 1;
c.weighty = 1;
userNameField = addInputRow("Benutzername:");
serverNameField = addInputRow("Server:");
passwordField = addInputRow("Passwort:");
channelNameField = addInputRow("Channel:");
userNameField = addInputRow("Benutzername:", new JTextField());
serverNameField = addInputRow("Server:", new JTextField());
passwordField = addInputRow("Passwort:", new JPasswordField());
channelNameField = addInputRow("Channel:", new JTextField());
add(Box.createVerticalGlue(), c);
c.gridwidth = 1;
@ -85,7 +86,7 @@ class LoginPanel extends JPanel implements ILoginPanel {
return cancelEvent;
}
private JTextField addInputRow(String label) {
private JTextField addInputRow(String label, JTextField textField) {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.gridwidth = 1;
@ -94,8 +95,6 @@ class LoginPanel extends JPanel implements ILoginPanel {
add(new JLabel(label), c);
JTextField textField = new JTextField();
c.gridwidth = GridBagConstraints.REMAINDER;
add(textField, c);
return textField;