package net.minecraft.network.rcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
@SideOnly(Side.SERVER)
public class RConThreadMain extends RConThreadBase
{
/** Port RCon is running on */
private int rconPort;
/** Port the server is running on */
private int serverPort;
/** Hostname RCon is running on */
private String hostname;
/** The RCon ServerSocket. */
private ServerSocket serverSocket;
/** The RCon password */
private String rconPassword;
/** A map of client addresses to their running Threads */
private Map clientThreads;
private static final String __OBFID = "CL_00001805";
public RConThreadMain(IServer p_i1538_1_)
{
super(p_i1538_1_, "RCON Listener");
this.rconPort = p_i1538_1_.getIntProperty("rcon.port", 0);
this.rconPassword = p_i1538_1_.getStringProperty("rcon.password", "");
this.hostname = p_i1538_1_.getHostname();
this.serverPort = p_i1538_1_.getPort();
if (0 == this.rconPort)
{
this.rconPort = this.serverPort + 10;
this.logInfo("Setting default rcon port to " + this.rconPort);
p_i1538_1_.setProperty("rcon.port", Integer.valueOf(this.rconPort));
if (0 == this.rconPassword.length())
{
p_i1538_1_.setProperty("rcon.password", "");
}
p_i1538_1_.saveProperties();
}
if (0 == this.hostname.length())
{
this.hostname = "0.0.0.0";
}
this.initClientThreadList();
this.serverSocket = null;
}
private void initClientThreadList()
{
this.clientThreads = new HashMap();
}
/**
* Cleans up the clientThreads map by removing client Threads that are not running
*/
private void cleanClientThreadsMap()
{
Iterator iterator = this.clientThreads.entrySet().iterator();
while (iterator.hasNext())
{
Entry entry = (Entry)iterator.next();
if (!((RConThreadClient)entry.getValue()).isRunning())
{
iterator.remove();
}
}
}
public void run()
{
this.logInfo("RCON running on " + this.hostname + ":" + this.rconPort);
try
{
while (this.running)
{
try
{
Socket socket = this.serverSocket.accept();
socket.setSoTimeout(500);
RConThreadClient rconthreadclient = new RConThreadClient(this.server, socket);
rconthreadclient.startThread();
this.clientThreads.put(socket.getRemoteSocketAddress(), rconthreadclient);
this.cleanClientThreadsMap();
}
catch (SocketTimeoutException sockettimeoutexception)
{
this.cleanClientThreadsMap();
}
catch (IOException ioexception)
{
if (this.running)
{
this.logInfo("IO: " + ioexception.getMessage());
}
}
}
}
finally
{
this.closeServerSocket(this.serverSocket);
}
}
/**
* Creates a new Thread object from this class and starts running
*/
public void startThread()
{
if (0 == this.rconPassword.length())
{
this.logWarning("No rcon password set in \'" + this.server.getSettingsFilename() + "\', rcon disabled!");
}
else if (0 < this.rconPort && 65535 >= this.rconPort)
{
if (!this.running)
{
try
{
this.serverSocket = new ServerSocket(this.rconPort, 0, InetAddress.getByName(this.hostname));
this.serverSocket.setSoTimeout(500);
super.startThread();
}
catch (IOException ioexception)
{
this.logWarning("Unable to initialise rcon on " + this.hostname + ":" + this.rconPort + " : " + ioexception.getMessage());
}
}
}
else
{
this.logWarning("Invalid rcon port " + this.rconPort + " found in \'" + this.server.getSettingsFilename() + "\', rcon disabled!");
}
}
}