001    package net.minecraft.network.rcon;
002    
003    import java.io.IOException;
004    import java.net.DatagramSocket;
005    import java.net.ServerSocket;
006    import java.util.ArrayList;
007    import java.util.Iterator;
008    import java.util.List;
009    
010    public 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 var3 = false;
119    
120                if (!par1DatagramSocket.isClosed())
121                {
122                    par1DatagramSocket.close();
123                    var3 = true;
124                }
125    
126                if (par2)
127                {
128                    this.socketList.remove(par1DatagramSocket);
129                }
130    
131                return var3;
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 var3 = false;
157    
158                try
159                {
160                    if (!par1ServerSocket.isClosed())
161                    {
162                        par1ServerSocket.close();
163                        var3 = true;
164                    }
165                }
166                catch (IOException var5)
167                {
168                    this.logWarning("IO: " + var5.getMessage());
169                }
170    
171                if (par2)
172                {
173                    this.serverSocketList.remove(par1ServerSocket);
174                }
175    
176                return var3;
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 var2 = 0;
194            Iterator var3 = this.socketList.iterator();
195    
196            while (var3.hasNext())
197            {
198                DatagramSocket var4 = (DatagramSocket)var3.next();
199    
200                if (this.closeSocket(var4, false))
201                {
202                    ++var2;
203                }
204            }
205    
206            this.socketList.clear();
207            var3 = this.serverSocketList.iterator();
208    
209            while (var3.hasNext())
210            {
211                ServerSocket var5 = (ServerSocket)var3.next();
212    
213                if (this.closeServerSocket_do(var5, false))
214                {
215                    ++var2;
216                }
217            }
218    
219            this.serverSocketList.clear();
220    
221            if (par1 && 0 < var2)
222            {
223                this.logWarning("Force closed " + var2 + " sockets");
224            }
225        }
226    }