/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.networking;
import java.io.IOException;
import java.net.Socket;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Logger;
import com.t3.clientserver.connection.ClientConnection;
import com.t3.clientserver.connection.ServerConnection;
import com.t3.clientserver.connection.ServerObserver;
import com.t3.model.Player;
/**
* @author trevor
*/
public class T3ServerConnection extends ServerConnection implements ServerObserver {
private static final Logger log = Logger.getLogger(T3ServerConnection.class);
private final Map<String, Player> playerMap = new ConcurrentHashMap<String, Player>();
private final T3Server server;
public T3ServerConnection(T3Server server, int port) throws IOException {
super(port);
this.server = server;
addObserver(this);
}
/*
* (non-Javadoc)
*
* @see com.t3.clientserver.simple.server.ServerConnection#handleConnectionHandshake(java.net.Socket)
*/
@Override
public boolean handleConnectionHandshake(String id, Socket socket) {
try {
Player player = Handshake.receiveHandshake(server, socket);
if (player != null) {
playerMap.put(id.toUpperCase(), player);
return true;
}
} catch (IOException ioe) {
log.error("Handshake failure: " + ioe, ioe);
}
return false;
}
public Player getPlayer(String id) {
for (Player player : playerMap.values()) {
if (player.getName().equalsIgnoreCase(id)) {
return player;
}
}
return null;
}
public String getConnectionId(String playerId) {
for (Map.Entry<String, Player> entry : playerMap.entrySet()) {
if (entry.getValue().getName().equalsIgnoreCase(playerId)) {
return entry.getKey();
}
}
return null;
}
////
// SERVER OBSERVER
/**
* Handle late connections
*/
@Override
public void connectionAdded(ClientConnection conn) {
server.configureClientConnection(conn);
Player player = playerMap.get(conn.getId().toUpperCase());
for (String id : playerMap.keySet()) {
server.getConnection().callMethod(conn.getId(), NetworkCommand.playerConnected, playerMap.get(id));
}
server.getConnection().broadcastCallMethod(NetworkCommand.playerConnected, player);
// if (!server.isHostId(player.getName())) {
// Don't bother sending the campaign file if we're hosting it ourselves
server.getConnection().callMethod(conn.getId(), NetworkCommand.setCampaign, server.getCampaign());
// }
}
@Override
public void connectionRemoved(ClientConnection conn) {
server.releaseClientConnection(conn.getId());
server.getConnection().broadcastCallMethod(new String[] { conn.getId() }, NetworkCommand.playerDisconnected, playerMap.get(conn.getId().toUpperCase()));
playerMap.remove(conn.getId().toUpperCase());
}
}