From ebacf1ae7494abc3a80cf1ec242a6202d6438323 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 14 Jun 2011 04:55:24 +0200 Subject: Implement joining games git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@434 72836036-5685-4462-b002-a69064685172 --- .../control/network/ConnectionControl.java | 141 ++++++++++++++++++++- 1 file changed, 137 insertions(+), 4 deletions(-) (limited to 'src/jrummikub/control/network/ConnectionControl.java') diff --git a/src/jrummikub/control/network/ConnectionControl.java b/src/jrummikub/control/network/ConnectionControl.java index 7980c2d..d6bb5fe 100644 --- a/src/jrummikub/control/network/ConnectionControl.java +++ b/src/jrummikub/control/network/ConnectionControl.java @@ -7,9 +7,11 @@ import javax.swing.SwingUtilities; import jrummikub.model.GameSettings; import jrummikub.util.Event; import jrummikub.util.Event1; +import jrummikub.util.Event2; import jrummikub.util.GameData; import jrummikub.util.IEvent; import jrummikub.util.IEvent1; +import jrummikub.util.IEvent2; import jrummikub.util.LoginData; import org.jivesoftware.smack.Connection; @@ -43,6 +45,11 @@ class ConnectionControl { private Event1 gameOfferEvent = new Event1(); private Event1 gameWithdrawalEvent = new Event1(); + private Event2 gameJoinEvent = new Event2(); + private Event2 gameLeaveEvent = new Event2(); + + private Event2 gameJoinAckEvent = new Event2(); + private volatile GameData offeredGame; ConnectionControl(LoginData loginData) { @@ -80,6 +87,18 @@ class ConnectionControl { return gameWithdrawalEvent; } + IEvent2 getGameJoinEvent() { + return gameJoinEvent; + } + + IEvent2 getGameLeaveEvent() { + return gameLeaveEvent; + } + + IEvent2 getGameJoinAckEvent() { + return gameJoinAckEvent; + } + void offerGame(GameData data) { offeredGame = data; @@ -92,6 +111,18 @@ class ConnectionControl { new Thread(new SendGameWithdrawRunner(uuid)).start(); } + void joinGame(UUID uuid) { + new Thread(new SendGameJoinRunner(uuid)).start(); + } + + void leaveGame(UUID uuid) { + new Thread(new SendGameLeaveRunner(uuid)).start(); + } + + void ackJoinGame(UUID uuid, String recipient, boolean ack) { + new Thread(new SendGameJoinAckRunner(uuid, recipient, ack)).start(); + } + private void sendGameOffer() { new Thread(new SendGameOfferRunner(offeredGame)).start(); } @@ -119,17 +150,23 @@ class ConnectionControl { DefaultPacketExtension extension = (DefaultPacketExtension) packet .getExtension(ELEMENT_NAME, NAMESPACE); + if (((Message) packet).getType() == Message.Type.error) { + System.err.println("Received error message from '" + packet.getFrom() + + "'"); + return; + } + + String sender = packet.getFrom(); + sender = sender.substring(sender.indexOf('/') + 1); + String messageType = extension.getValue("messageType"); if (messageType.equals("game_offer")) { - String host = packet.getFrom(); - host = host.substring(host.indexOf('/') + 1); - UUID uuid = UUID.fromString(extension.getValue("uuid")); GameSettings settings = (GameSettings) Base64.decodeToObject(extension .getValue("gameSettings")); - GameData gameData = new GameData(uuid, settings, host); + GameData gameData = new GameData(uuid, settings, sender); gameOfferEvent.emit(gameData); } else if (messageType.equals("game_withdrawal")) { gameWithdrawalEvent.emit(UUID.fromString(extension.getValue("uuid"))); @@ -137,6 +174,16 @@ class ConnectionControl { if (offeredGame != null) { sendGameOffer(); } + } else if (messageType.equals("game_join")) { + gameJoinEvent.emit(UUID.fromString(extension.getValue("uuid")), sender); + } else if (messageType.equals("game_leave")) { + gameLeaveEvent.emit(UUID.fromString(extension.getValue("uuid")), sender); + } else if (messageType.equals("game_join_ack")) { + gameJoinAckEvent.emit(UUID.fromString(extension.getValue("uuid")), + Boolean.valueOf(extension.getValue("ack"))); + } else { + System.err.println("Received unrecognized message of type '" + + messageType + "'"); } } @@ -160,6 +207,37 @@ class ConnectionControl { return createMessage(extension); } + private Message createGameJoinMessage(UUID uuid) { + DefaultPacketExtension extension = createJRummikubExtension(); + + extension.setValue("messageType", "game_join"); + extension.setValue("uuid", uuid.toString()); + + return createMessage(extension); + } + + private Message createGameLeaveMessage(UUID uuid) { + DefaultPacketExtension extension = createJRummikubExtension(); + + extension.setValue("messageType", "game_leave"); + extension.setValue("uuid", uuid.toString()); + + return createMessage(extension); + } + + private Message createGameAckMessage(UUID uuid, String recipient, boolean ack) { + DefaultPacketExtension extension = createJRummikubExtension(); + + extension.setValue("messageType", "game_join_ack"); + extension.setValue("uuid", uuid.toString()); + extension.setValue("ack", Boolean.toString(ack)); + + Message message = createMessage(extension); + message.setType(Message.Type.normal); + message.setTo(muc.getRoom() + "/" + recipient); + return message; + } + private Message createGameRequestMessage() { DefaultPacketExtension extension = createJRummikubExtension(); @@ -281,6 +359,61 @@ class ConnectionControl { } } + private class SendGameJoinRunner implements Runnable { + private UUID uuid; + + public SendGameJoinRunner(UUID uuid) { + this.uuid = uuid; + } + + @Override + public void run() { + synchronized (ConnectionControl.this) { + if (connection != null) { + connection.sendPacket(createGameJoinMessage(uuid)); + } + } + } + } + + private class SendGameLeaveRunner implements Runnable { + private UUID uuid; + + public SendGameLeaveRunner(UUID uuid) { + this.uuid = uuid; + } + + @Override + public void run() { + synchronized (ConnectionControl.this) { + if (connection != null) { + connection.sendPacket(createGameLeaveMessage(uuid)); + } + } + } + } + + private class SendGameJoinAckRunner implements Runnable { + private UUID uuid; + private String recipient; + private boolean ack; + + public SendGameJoinAckRunner(UUID uuid, String recipient, boolean ack) { + this.uuid = uuid; + this.recipient = recipient; + this.ack = ack; + } + + @Override + public void run() { + synchronized (ConnectionControl.this) { + if (connection != null) { + connection.sendPacket(createGameAckMessage(uuid, recipient, ack)); + } + } + } + } + private class DisconnectRunner implements Runnable { @Override public void run() { -- cgit v1.2.3