    001package net.minecraft.network.rcon;
    002
    003import java.io.IOException;
    004import java.net.DatagramSocket;
    005import java.net.ServerSocket;
    006import java.util.ArrayList;
    007import java.util.Iterator;
    008import java.util.List;
    009
    010public abstract class RConThreadBase implements Runnable
    011{
    012    /** True if the Thread is running, false otherwise */
    013    protected boolean running = false;
    014
    015    /** Reference to the IServer object. */
    016    protected IServer server;
    017
    018    /** Thread for this runnable class */
    019    protected Thread rconThread;
    020    protected int field_72615_d = 5;
    021
    022    /** A list of registered DatagramSockets */
    023    protected List socketList = new ArrayList();
    024
    025    /** A list of registered ServerSockets */
    026    protected List serverSocketList = new ArrayList();
    027
    028    RConThreadBase(IServer par1IServer)
    029    {
    030        this.server = par1IServer;
    031
    032        if (this.server.isDebuggingEnabled())
    033        {
    034            this.logWarning("Debugging is enabled, performance maybe reduced!");
    035        }
    036    }
    037
    038    /**
    039     * Creates a new Thread object from this class and starts running
    040     */
    041    public synchronized void startThread()
    042    {
    043        this.rconThread = new Thread(this);
    044        this.rconThread.start();
    045        this.running = true;
    046    }
    047
    048    /**
    049     * Returns true if the Thread is running, false otherwise
    050     */
    051    public boolean isRunning()
    052    {
    053        return this.running;
    054    }
    055
    056    /**
    057     * Log debug message
    058     */
    059    protected void logDebug(String par1Str)
    060    {
    061        this.server.logDebug(par1Str);
    062    }
    063
    064    /**
    065     * Log information message
    066     */
    067    protected void logInfo(String par1Str)
    068    {
    069        this.server.logInfo(par1Str);
    070    }
    071
    072    /**
    073     * Log warning message
    074     */
    075    protected void logWarning(String par1Str)
    076    {
    077        this.server.logWarning(par1Str);
    078    }
    079
    080    /**
    081     * Log severe error message
    082     */
    083    protected void logSevere(String par1Str)
    084    {
    085        this.server.logSevere(par1Str);
    086    }
    087
    088    /**
    089     * Returns the number of players on the server
    090     */
    091    protected int getNumberOfPlayers()
    092    {
    093        return this.server.getCurrentPlayerCount();
    094    }
    095
    096    /**
    097     * Registers a DatagramSocket with this thread
    098     */
    099    protected void registerSocket(DatagramSocket par1DatagramSocket)
    100    {
    101        this.logDebug("registerSocket: " + par1DatagramSocket);
    102        this.socketList.add(par1DatagramSocket);
    103    }
    104
    105    /**
    106     * Closes the specified DatagramSocket
    107     */
    108    protected boolean closeSocket(DatagramSocket par1DatagramSocket, boolean par2)
    109    {
    110        this.logDebug("closeSocket: " + par1DatagramSocket);
    111
    112        if (null == par1DatagramSocket)
    113        {
    114            return false;
    115        }
    116        else
    117        {
    118            boolean flag1 = false;
    119
    120            if (!par1DatagramSocket.isClosed())
    121            {
    122                par1DatagramSocket.close();
    123                flag1 = true;
    124            }
    125
    126            if (par2)
    127            {
    128                this.socketList.remove(par1DatagramSocket);
    129            }
    130
    131            return flag1;
    132        }
    133    }
    134
    135    /**
    136     * Closes the specified ServerSocket
    137     */
    138    protected boolean closeServerSocket(ServerSocket par1ServerSocket)
    139    {
    140        return this.closeServerSocket_do(par1ServerSocket, true);
    141    }
    142
    143    /**
    144     * Closes the specified ServerSocket
    145     */
    146    protected boolean closeServerSocket_do(ServerSocket par1ServerSocket, boolean par2)
    147    {
    148        this.logDebug("closeSocket: " + par1ServerSocket);
    149
    150        if (null == par1ServerSocket)
    151        {
    152            return false;
    153        }
    154        else
    155        {
    156            boolean flag1 = false;
    157
    158            try
    159            {
    160                if (!par1ServerSocket.isClosed())
    161                {
    162                    par1ServerSocket.close();
    163                    flag1 = true;
    164                }
    165            }
    166            catch (IOException ioexception)
    167            {
    168                this.logWarning("IO: " + ioexception.getMessage());
    169            }
    170
    171            if (par2)
    172            {
    173                this.serverSocketList.remove(par1ServerSocket);
    174            }
    175
    176            return flag1;
    177        }
    178    }
    179
    180    /**
    181     * Closes all of the opened sockets
    182     */
    183    protected void closeAllSockets()
    184    {
    185        this.closeAllSockets_do(false);
    186    }
    187
    188    /**
    189     * Closes all of the opened sockets
    190     */
    191    protected void closeAllSockets_do(boolean par1)
    192    {
    193        int i = 0;
    194        Iterator iterator = this.socketList.iterator();
    195
    196        while (iterator.hasNext())
    197        {
    198            DatagramSocket datagramsocket = (DatagramSocket)iterator.next();
    199
    200            if (this.closeSocket(datagramsocket, false))
    201            {
    202                ++i;
    203            }
    204        }
    205
    206        this.socketList.clear();
    207        iterator = this.serverSocketList.iterator();
    208
    209        while (iterator.hasNext())
    210        {
    211            ServerSocket serversocket = (ServerSocket)iterator.next();
    212
    213            if (this.closeServerSocket_do(serversocket, false))
    214            {
    215                ++i;
    216            }
    217        }
    218
    219        this.serverSocketList.clear();
    220
    221        if (par1 && 0 < i)
    222        {
    223            this.logWarning("Force closed " + i + " sockets");
    224        }
    225    }
    226}