package net.minecraft.network.rcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@SideOnly(Side.SERVER)
public abstract class RConThreadBase implements Runnable
{
private static final AtomicInteger THREAD_ID = new AtomicInteger(0);
/** True if the Thread is running, false otherwise */
protected boolean running;
/** Reference to the IServer object. */
protected IServer server;
protected final String threadName;
/** Thread for this runnable class */
protected Thread rconThread;
protected int field_72615_d = 5;
/** A list of registered DatagramSockets */
protected List socketList = new ArrayList();
/** A list of registered ServerSockets */
protected List serverSocketList = new ArrayList();
private static final String __OBFID = "CL_00001801";
protected RConThreadBase(IServer p_i45300_1_, String threadName)
{
this.server = p_i45300_1_;
this.threadName = threadName;
if (this.server.isDebuggingEnabled())
{
this.logWarning("Debugging is enabled, performance maybe reduced!");
}
}
/**
* Creates a new Thread object from this class and starts running
*/
public synchronized void startThread()
{
this.rconThread = new Thread(this, this.threadName + " #" + THREAD_ID.incrementAndGet());
this.rconThread.start();
this.running = true;
}
/**
* Returns true if the Thread is running, false otherwise
*/
public boolean isRunning()
{
return this.running;
}
/**
* Log debug message
*/
protected void logDebug(String msg)
{
this.server.logDebug(msg);
}
/**
* Log information message
*/
protected void logInfo(String msg)
{
this.server.logInfo(msg);
}
/**
* Log warning message
*/
protected void logWarning(String msg)
{
this.server.logWarning(msg);
}
/**
* Log severe error message
*/
protected void logSevere(String msg)
{
this.server.logSevere(msg);
}
/**
* Returns the number of players on the server
*/
protected int getNumberOfPlayers()
{
return this.server.getCurrentPlayerCount();
}
/**
* Registers a DatagramSocket with this thread
*/
protected void registerSocket(DatagramSocket socket)
{
this.logDebug("registerSocket: " + socket);
this.socketList.add(socket);
}
/**
* Closes the specified DatagramSocket
*/
protected boolean closeSocket(DatagramSocket socket, boolean removeFromList)
{
this.logDebug("closeSocket: " + socket);
if (null == socket)
{
return false;
}
else
{
boolean flag1 = false;
if (!socket.isClosed())
{
socket.close();
flag1 = true;
}
if (removeFromList)
{
this.socketList.remove(socket);
}
return flag1;
}
}
/**
* Closes the specified ServerSocket
*/
protected boolean closeServerSocket(ServerSocket socket)
{
return this.closeServerSocket_do(socket, true);
}
/**
* Closes the specified ServerSocket
*/
protected boolean closeServerSocket_do(ServerSocket socket, boolean removeFromList)
{
this.logDebug("closeSocket: " + socket);
if (null == socket)
{
return false;
}
else
{
boolean flag1 = false;
try
{
if (!socket.isClosed())
{
socket.close();
flag1 = true;
}
}
catch (IOException ioexception)
{
this.logWarning("IO: " + ioexception.getMessage());
}
if (removeFromList)
{
this.serverSocketList.remove(socket);
}
return flag1;
}
}
/**
* Closes all of the opened sockets
*/
protected void closeAllSockets()
{
this.closeAllSockets_do(false);
}
/**
* Closes all of the opened sockets
*/
protected void closeAllSockets_do(boolean logWarning)
{
int i = 0;
Iterator iterator = this.socketList.iterator();
while (iterator.hasNext())
{
DatagramSocket datagramsocket = (DatagramSocket)iterator.next();
if (this.closeSocket(datagramsocket, false))
{
++i;
}
}
this.socketList.clear();
iterator = this.serverSocketList.iterator();
while (iterator.hasNext())
{
ServerSocket serversocket = (ServerSocket)iterator.next();
if (this.closeServerSocket_do(serversocket, false))
{
++i;
}
}
this.serverSocketList.clear();
if (logWarning && 0 < i)
{
this.logWarning("Force closed " + i + " sockets");
}
}
}