summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control/network/ConnectionControl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub/control/network/ConnectionControl.java')
-rw-r--r--src/jrummikub/control/network/ConnectionControl.java117
1 files changed, 93 insertions, 24 deletions
diff --git a/src/jrummikub/control/network/ConnectionControl.java b/src/jrummikub/control/network/ConnectionControl.java
index 39fabf7..2ae098b 100644
--- a/src/jrummikub/control/network/ConnectionControl.java
+++ b/src/jrummikub/control/network/ConnectionControl.java
@@ -2,8 +2,6 @@ package jrummikub.control.network;
import java.awt.Color;
import java.io.Serializable;
-import java.util.Collection;
-import java.util.Iterator;
import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
@@ -43,6 +41,7 @@ import org.jivesoftware.smack.util.Base64;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.muc.DiscussionHistory;
import org.jivesoftware.smackx.muc.MultiUserChat;
+import org.jivesoftware.smackx.muc.ParticipantStatusListener;
/**
* Connection control managing network connections, messages and events
@@ -117,6 +116,8 @@ public class ConnectionControl implements IConnectionControl {
private Event nextPlayerEvent = new Event();
private Event turnStartEvent = new Event();
+ private Event1<String> participantLeftEvent = new Event1<String>();
+
private GameData currentGame;
private BlockingQueue<Runnable> actionQueue = new LinkedBlockingQueue<Runnable>();
@@ -127,7 +128,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;
@@ -256,6 +257,11 @@ public class ConnectionControl implements IConnectionControl {
}
@Override
+ public IEvent1<String> getParticipantLeftEvent() {
+ return participantLeftEvent;
+ }
+
+ @Override
public void offerGame(GameData data) {
offeredGame = data;
currentGame = data;
@@ -348,8 +354,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));
}
});
}
@@ -412,8 +417,7 @@ public class ConnectionControl implements IConnectionControl {
protected void addData(DefaultPacketExtension extension) {
extension.setValue("messageType", "table_update");
extension.setValue("uuid", uuid.toString());
- extension.setValue("table",
- Base64.encodeObject(table, Base64.GZIP));
+ extension.setValue("table", Base64.encodeObject(table, Base64.GZIP));
}
});
}
@@ -427,8 +431,8 @@ public class ConnectionControl implements IConnectionControl {
protected void addData(DefaultPacketExtension extension) {
extension.setValue("messageType", "turn_end");
extension.setValue("uuid", uuid.toString());
- extension.setValue("data", Base64.encodeObject(new TurnEndData(
- state, invalidTurnInfo), Base64.GZIP));
+ extension.setValue("data", Base64.encodeObject(new TurnEndData(state,
+ invalidTurnInfo), Base64.GZIP));
}
});
}
@@ -464,8 +468,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));
}
});
}
@@ -516,8 +520,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;
}
@@ -533,15 +537,14 @@ 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"));
fixGameSettings(settings);
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();
@@ -654,8 +657,7 @@ public class ConnectionControl implements IConnectionControl {
XMPPError xmppError = e.getXMPPError();
if (xmppError != null) {
- if (xmppError.getType() == Type.WAIT
- && xmppError.getCode() == 504) {
+ if (xmppError.getType() == Type.WAIT && xmppError.getCode() == 504) {
return LoginError.UNKNOWN_HOST;
}
}
@@ -667,8 +669,7 @@ public class ConnectionControl implements IConnectionControl {
private LoginError doLogin() {
try {
- connection.login(loginData.getUserName(),
- loginData.getPassword(),
+ connection.login(loginData.getUserName(), loginData.getPassword(),
"JRummikub-" + StringUtils.randomString(8));
return null;
} catch (XMPPException e) {
@@ -686,7 +687,7 @@ public class ConnectionControl implements IConnectionControl {
while (true) {
try {
muc.join(nickname, null, history, 10000);
- return null; // Join was successful, break the loop
+ break; // Join was successful, break the loop
} catch (XMPPException e) {
XMPPError xmppError = e.getXMPPError();
@@ -698,8 +699,7 @@ public class ConnectionControl implements IConnectionControl {
continue;
} else {
// An unknown error has occurred, cancel connect
- if (xmppError != null
- && xmppError.getType() == Type.CANCEL
+ if (xmppError != null && xmppError.getType() == Type.CANCEL
&& xmppError.getCode() == 404) {
return LoginError.UNKNOWN_CHANNEL;
}
@@ -710,6 +710,75 @@ public class ConnectionControl implements IConnectionControl {
}
}
+ muc.addParticipantStatusListener(new LeaveListener());
+
+ return null;
+ }
+
+ private class LeaveListener implements ParticipantStatusListener {
+ @Override
+ public void voiceRevoked(String arg0) {
+ }
+
+ @Override
+ public void voiceGranted(String arg0) {
+ }
+
+ @Override
+ public void ownershipRevoked(String arg0) {
+ }
+
+ @Override
+ public void ownershipGranted(String arg0) {
+ }
+
+ @Override
+ public void nicknameChanged(String arg0, String arg1) {
+ }
+
+ @Override
+ public void moderatorRevoked(String arg0) {
+ }
+
+ @Override
+ public void moderatorGranted(String arg0) {
+ }
+
+ @Override
+ public void membershipRevoked(String arg0) {
+ }
+
+ @Override
+ public void membershipGranted(String arg0) {
+ }
+
+ @Override
+ public void left(String participant) {
+ participant = participant.substring(participant.indexOf('/') + 1);
+ emitLater(participantLeftEvent, participant);
+ }
+
+ @Override
+ public void kicked(String participant, String actor, String reason) {
+ left(participant);
+ }
+
+ @Override
+ public void joined(String arg0) {
+ }
+
+ @Override
+ public void banned(String participant, String arg1, String arg2) {
+ left(participant);
+ }
+
+ @Override
+ public void adminRevoked(String arg0) {
+ }
+
+ @Override
+ public void adminGranted(String arg0) {
+ }
}
}