package net.minecraft.network.rcon;
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public abstract class RConThreadBase implements Runnable
{
/** True if the Thread is running, false otherwise */
protected boolean running = false;
/** Reference to the IServer object. */
protected IServer server;
/** 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();
RConThreadBase(IServer par1IServer)
{
this.server = par1IServer;
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.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 par1Str)
{
this.server.logDebug(par1Str);
}
/**
* Log information message
*/
protected void logInfo(String par1Str)
{
this.server.logInfo(par1Str);
}
/**
* Log warning message
*/
protected void logWarning(String par1Str)
{
this.server.logWarning(par1Str);
}
/**
* Log severe error message
*/
protected void logSevere(String par1Str)
{
this.server.logSevere(par1Str);
}
/**
* 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 par1DatagramSocket)
{
this.logDebug("registerSocket: " + par1DatagramSocket);
this.socketList.add(par1DatagramSocket);
}
/**
* Closes the specified DatagramSocket
*/
protected boolean closeSocket(DatagramSocket par1DatagramSocket, boolean par2)
{
this.logDebug("closeSocket: " + par1DatagramSocket);
if (null == par1DatagramSocket)
{
return false;
}
else
{
boolean var3 = false;
if (!par1DatagramSocket.isClosed())
{
par1DatagramSocket.close();
var3 = true;
}
if (par2)
{
this.socketList.remove(par1DatagramSocket);
}
return var3;
}
}
/**
* Closes the specified ServerSocket
*/
protected boolean closeServerSocket(ServerSocket par1ServerSocket)
{
return this.closeServerSocket_do(par1ServerSocket, true);
}
/**
* Closes the specified ServerSocket
*/
protected boolean closeServerSocket_do(ServerSocket par1ServerSocket, boolean par2)
{
this.logDebug("closeSocket: " + par1ServerSocket);
if (null == par1ServerSocket)
{
return false;
}
else
{
boolean var3 = false;
try
{
if (!par1ServerSocket.isClosed())
{
par1ServerSocket.close();
var3 = true;
}
}
catch (IOException var5)
{
this.logWarning("IO: " + var5.getMessage());
}
if (par2)
{
this.serverSocketList.remove(par1ServerSocket);
}
return var3;
}
}
/**
* Closes all of the opened sockets
*/
protected void closeAllSockets()
{
this.closeAllSockets_do(false);
}
/**
* Closes all of the opened sockets
*/
protected void closeAllSockets_do(boolean par1)
{
int var2 = 0;
Iterator var3 = this.socketList.iterator();
while (var3.hasNext())
{
DatagramSocket var4 = (DatagramSocket)var3.next();
if (this.closeSocket(var4, false))
{
++var2;
}
}
this.socketList.clear();
var3 = this.serverSocketList.iterator();
while (var3.hasNext())
{
ServerSocket var5 = (ServerSocket)var3.next();
if (this.closeServerSocket_do(var5, false))
{
++var2;
}
}
this.serverSocketList.clear();
if (par1 && 0 < var2)
{
this.logWarning("Force closed " + var2 + " sockets");
}
}
}