Implemented login error messages

git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@500 72836036-5685-4462-b002-a69064685172
This commit is contained in:
Bennet Gerlach 2011-06-20 03:06:46 +02:00
parent ace7175f1a
commit 4df5c0e665
13 changed files with 330 additions and 121 deletions

View file

@ -32,7 +32,7 @@ public class ApplicationControl {
* Creates a new application control
*
* @param view
* the view to use
* the view to use
*/
public ApplicationControl(final IView view) {
this.view = view;
@ -43,15 +43,16 @@ public class ApplicationControl {
public void handle() {
view.getQuitWarningPanel().setMode(QuitMode.QUIT_GAME);
view.showQuitWarningPanel(true);
tempConnection = view.getQuitWarningPanel().getQuitEvent().add(new IListener() {
@Override
public void handle() {
abortControls();
startApplication();
view.showQuitWarningPanel(false);
tempConnection.remove();
}
});
tempConnection = view.getQuitWarningPanel().getQuitEvent()
.add(new IListener() {
@Override
public void handle() {
abortControls();
startApplication();
view.showQuitWarningPanel(false);
tempConnection.remove();
}
});
}
});
view.getMenuQuitEvent().add(new IListener() {
@ -89,7 +90,7 @@ public class ApplicationControl {
}
}
});
view.getQuitWarningPanel().getCancelEvent().add(new IListener() {
@Override
public void handle() {
@ -97,16 +98,22 @@ public class ApplicationControl {
}
});
addLoginControlListeners();
view.getNetworkGameEvent().add(new IListener() {
@Override
public void handle() {
abortControls();
createLoginControl();
}
});
saveControl.getLoadEvent().add(
new IListener3<GameSettings, GameState, IRoundState>() {
@Override
public void handle(GameSettings settings,
GameState gameState, IRoundState roundState) {
public void handle(GameSettings settings, GameState gameState,
IRoundState roundState) {
abortControls();
gameControl = new GameControl(settings, saveControl,
view);
gameControl = new GameControl(settings, saveControl, view);
addGameControlListeners(gameControl);
gameControl.continueGame(gameState, roundState);
}
@ -119,28 +126,21 @@ public class ApplicationControl {
});
}
private void addLoginControlListeners() {
view.getNetworkGameEvent().add(new IListener() {
private void createLoginControl() {
loginControl = new LoginControl(view);
loginControl.getLoginEvent().add(new IListener1<LoginData>() {
@Override
public void handle() {
abortControls();
loginControl = new LoginControl(view);
loginControl.getLoginEvent().add(new IListener1<LoginData>() {
@Override
public void handle(LoginData loginData) {
createNetworkControl(loginData);
}
});
loginControl.getCancelEvent().add(new IListener() {
@Override
public void handle() {
startApplication();
}
});
loginControl.startLogin();
public void handle(LoginData loginData) {
createNetworkControl(loginData);
}
});
loginControl.getCancelEvent().add(new IListener() {
@Override
public void handle() {
startApplication();
}
});
loginControl.startLogin();
}
private void abortControls() {
@ -215,6 +215,14 @@ public class ApplicationControl {
}
});
networkControl.getBackToLoginEvent().add(new IListener() {
@Override
public void handle() {
networkControl = null;
createLoginControl();
}
});
networkControl.startNetwork();
}
}

View file

@ -27,7 +27,7 @@ public class LoginControl {
* Constructor for login Control
*
* @param view
* for events which need handling
* for events which need handling
*/
public LoginControl(final IView view) {
this.view = view;
@ -36,18 +36,18 @@ public class LoginControl {
@Override
public void handle(LoginData loginData) {
abort();
// TODO connectPanel anzeigen
loginEvent.emit(loginData);
}
}));
connections.add(view.getLoginPanel().getCancelEvent()
.add(new IListener() {
@Override
public void handle() {
abort();
cancelEvent.emit();
}
}));
connections.add(view.getLoginPanel().getCancelEvent().add(new IListener() {
@Override
public void handle() {
abort();
cancelEvent.emit();
}
}));
}
/**

View file

@ -16,6 +16,7 @@ import jrummikub.util.IEvent;
import jrummikub.util.IEvent1;
import jrummikub.util.IEvent2;
import jrummikub.util.LoginData;
import jrummikub.view.LoginError;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.PacketListener;
@ -46,7 +47,7 @@ public class ConnectionControl implements IConnectionControl {
private volatile MultiUserChat muc;
private Event connectedEvent = new Event();
private Event connectionFailedEvent = new Event();
private Event1<LoginError> connectionFailedEvent = new Event1<LoginError>();
private Event1<GameData> gameOfferEvent = new Event1<GameData>();
private Event1<UUID> gameWithdrawalEvent = new Event1<UUID>();
@ -72,7 +73,7 @@ public class ConnectionControl implements IConnectionControl {
* Creates new connection control
*
* @param loginData
* player's login data
* player's login data
*/
public ConnectionControl(LoginData loginData) {
this.loginData = loginData;
@ -91,7 +92,7 @@ public class ConnectionControl implements IConnectionControl {
@Override
public void disconnect() {
connectedEvent = new Event();
connectionFailedEvent = new Event();
connectionFailedEvent = new Event1<LoginError>();
run(new Runnable() {
@Override
public void run() {
@ -111,7 +112,7 @@ public class ConnectionControl implements IConnectionControl {
}
@Override
public IEvent getConnectionFailedEvent() {
public IEvent1<LoginError> getConnectionFailedEvent() {
return connectionFailedEvent;
}
@ -252,8 +253,7 @@ public class ConnectionControl implements IConnectionControl {
protected void addData(DefaultPacketExtension extension) {
extension.setValue("messageType", "change_color");
extension.setValue("uuid", uuid.toString());
extension.setValue("color",
Base64.encodeObject(color, Base64.GZIP));
extension.setValue("color", Base64.encodeObject(color, Base64.GZIP));
}
});
}
@ -316,8 +316,8 @@ public class ConnectionControl implements IConnectionControl {
protected void addData(DefaultPacketExtension extension) {
extension.setValue("messageType", "game_offer");
extension.setValue("uuid", data.getGameID().toString());
extension.setValue("gameSettings", Base64.encodeObject(
data.getGameSettings(), Base64.GZIP));
extension.setValue("gameSettings",
Base64.encodeObject(data.getGameSettings(), Base64.GZIP));
}
});
}
@ -340,6 +340,15 @@ public class ConnectionControl implements IConnectionControl {
});
}
private static <T> void emitLater(final Event1<T> event, final T arg) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
event.emit(arg);
}
});
}
private Message createMessage(PacketExtension extension) {
Message message = muc.createMessage();
message.addExtension(extension);
@ -355,8 +364,8 @@ public class ConnectionControl implements IConnectionControl {
.getExtension(ELEMENT_NAME, NAMESPACE);
if (((Message) packet).getType() == Message.Type.error) {
System.err.println("Received error message from '"
+ packet.getFrom() + "'");
System.err.println("Received error message from '" + packet.getFrom()
+ "'");
return;
}
@ -372,14 +381,13 @@ public class ConnectionControl implements IConnectionControl {
String sender, String messageType) {
if (messageType.equals("game_offer")) {
UUID uuid = UUID.fromString(extension.getValue("uuid"));
GameSettings settings = (GameSettings) Base64
.decodeToObject(extension.getValue("gameSettings"));
GameSettings settings = (GameSettings) Base64.decodeToObject(extension
.getValue("gameSettings"));
GameData gameData = new GameData(uuid, settings, sender);
gameOfferEvent.emit(gameData);
} else if (messageType.equals("game_withdrawal")) {
gameWithdrawalEvent
.emit(UUID.fromString(extension.getValue("uuid")));
gameWithdrawalEvent.emit(UUID.fromString(extension.getValue("uuid")));
} else if (messageType.equals("game_request")) {
if (offeredGame != null) {
sendGameOffer();
@ -447,10 +455,26 @@ public class ConnectionControl implements IConnectionControl {
connection.disconnect();
connection = null;
// TODO Auto-generated catch block
e.printStackTrace();
XMPPError xmppError = e.getXMPPError();
emitLater(connectionFailedEvent);
if (xmppError != null) {
int code = xmppError.getCode();
if (code == 504) {
emitLater(connectionFailedEvent, LoginError.UNKNOWN_HOST);
return;
} else if (code == 404) {
emitLater(connectionFailedEvent, LoginError.UNKNOWN_CHANNEL);
return;
} else if (code == 503) {
emitLater(connectionFailedEvent, LoginError.RESOURCE_CONFLICT);
return;
} else if (code == 401 || code == 402 || code == 407) {
emitLater(connectionFailedEvent, LoginError.AUTHENTICATION_FAILED);
return;
}
}
e.printStackTrace();
emitLater(connectionFailedEvent, LoginError.UNKNOWN_ERROR);
}
}
}
@ -471,8 +495,7 @@ public class ConnectionControl implements IConnectionControl {
break; // Join was successful, break the loop
} catch (XMPPException e) {
XMPPError error = e.getXMPPError();
if (error.getType() == Type.CANCEL
&& error.getCode() == 409) {
if (error.getType() == Type.CANCEL && error.getCode() == 409) {
// There was a conflict, try again with another
// nickname
nickname += "_";

View file

@ -9,6 +9,7 @@ import jrummikub.util.GameData;
import jrummikub.util.IEvent;
import jrummikub.util.IEvent1;
import jrummikub.util.IEvent2;
import jrummikub.view.LoginError;
interface IConnectionControl {
@ -20,7 +21,7 @@ interface IConnectionControl {
public IEvent getConnectedEvent();
public IEvent getConnectionFailedEvent();
public IEvent1<LoginError> getConnectionFailedEvent();
public IEvent1<GameData> getGameOfferEvent();
@ -65,5 +66,4 @@ interface IConnectionControl {
public void endTurn(ITable table);
public void startTurn(IRoundState state);
}

View file

@ -15,6 +15,7 @@ import jrummikub.util.IListener;
import jrummikub.util.IListener1;
import jrummikub.util.LoginData;
import jrummikub.view.IView;
import jrummikub.view.LoginError;
/**
* Class dealing with network connection, offering and choice of network games
@ -24,6 +25,7 @@ public class NetworkControl {
private IView view;
private List<Connection> connections = new ArrayList<Connection>();
private Event stopNetworkEvent = new Event();
private Event backToLoginEvent = new Event();
private NetworkSettingsControl settingsControl;
private GameOfferControl gameOfferControl;
@ -36,11 +38,11 @@ public class NetworkControl {
* Creates a new network control
*
* @param loginData
* user's login data
* user's login data
* @param connectionControl
* current connection for events and messages
* current connection for events and messages
* @param view
* for events and handlers
* for events and handlers
*/
public NetworkControl(final LoginData loginData,
IConnectionControl connectionControl, final IView view) {
@ -85,7 +87,7 @@ public class NetworkControl {
* Adds the listeners for connection control events
*
* @param view
* view for events
* view for events
*/
public void addConnectionControlListeners(final IView view) {
connections.add(connectionControl.getGameOfferEvent().add(
@ -133,22 +135,29 @@ public class NetworkControl {
private void addConnectionSetupListeners(final LoginData loginData,
final IView view) {
connections.add(connectionControl.getConnectedEvent().add(
new IListener() {
connections.add(connectionControl.getConnectedEvent().add(new IListener() {
@Override
public void handle() {
view.getGameListPanel().setChannelName(loginData.getChannelName());
view.showGameListPanel(true);
}
}));
connections.add(connectionControl.getConnectionFailedEvent().add(
new IListener1<LoginError>() {
@Override
public void handle() {
view.getGameListPanel().setChannelName(
loginData.getChannelName());
view.showGameListPanel(true);
public void handle(LoginError error) {
view.getConnectPanel().setMode(error);
view.showConnectPanel(true);
}
}));
connections.add(connectionControl.getConnectionFailedEvent().add(
new IListener() {
connections.add(view.getConnectPanel().getCancelEvent()
.add(new IListener() {
@Override
public void handle() {
// TODO Auto-generated method stub
abort();
backToLoginEvent.emit();
}
}));
}
@ -181,9 +190,11 @@ public class NetworkControl {
}
/**
* Starts a new network connection with the sepcified data
* Starts a new network connection with the specified data
*/
public void startNetwork() {
view.showConnectPanel(true);
view.getConnectPanel().setMode(null);
connectionControl.connect();
}
@ -195,6 +206,7 @@ public class NetworkControl {
c.remove();
}
view.showGameListPanel(false);
view.showConnectPanel(false);
if (settingsControl != null) {
settingsControl.abort();
@ -218,6 +230,10 @@ public class NetworkControl {
return stopNetworkEvent;
}
public IEvent getBackToLoginEvent() {
return backToLoginEvent;
}
private void createSettingsControl() {
if (settingsControl != null) {
return;
@ -247,8 +263,7 @@ public class NetworkControl {
if (gameOfferControl != null) {
return;
}
gameOfferControl = new GameOfferControl(connectionControl, settings,
view);
gameOfferControl = new GameOfferControl(connectionControl, settings, view);
gameOfferControl.getBackEvent().add(new IListener() {
@Override
public void handle() {