001    package net.minecraft.network;
002    
003    import java.io.IOException;
004    import java.util.ArrayList;
005    import java.util.Collections;
006    import java.util.List;
007    import java.util.logging.Level;
008    import java.util.logging.Logger;
009    
010    import cpw.mods.fml.common.FMLLog;
011    import net.minecraft.crash.CrashReport;
012    import net.minecraft.server.MinecraftServer;
013    import net.minecraft.util.ReportedException;
014    
015    public abstract class NetworkListenThread
016    {
017        /** Reference to the logger. */
018        public static Logger logger = Logger.getLogger("Minecraft");
019    
020        /** Reference to the MinecraftServer object. */
021        private final MinecraftServer mcServer;
022        private final List connections = Collections.synchronizedList(new ArrayList());
023    
024        /** Whether the network listener object is listening. */
025        public volatile boolean isListening = false;
026    
027        public NetworkListenThread(MinecraftServer par1MinecraftServer) throws IOException
028        {
029            this.mcServer = par1MinecraftServer;
030            this.isListening = true;
031        }
032    
033        /**
034         * adds this connection to the list of currently connected players
035         */
036        public void addPlayer(NetServerHandler par1NetServerHandler)
037        {
038            this.connections.add(par1NetServerHandler);
039        }
040    
041        public void stopListening()
042        {
043            this.isListening = false;
044        }
045    
046        /**
047         * processes packets and pending connections
048         */
049        public void networkTick()
050        {
051            for (int var1 = 0; var1 < this.connections.size(); ++var1)
052            {
053                NetServerHandler var2 = (NetServerHandler)this.connections.get(var1);
054    
055                try
056                {
057                    var2.networkTick();
058                }
059                catch (Exception var5)
060                {
061                    if (var2.netManager instanceof MemoryConnection)
062                    {
063                        CrashReport var4 = CrashReport.func_85055_a(var5, "Ticking memory connection");
064                        throw new ReportedException(var4);
065                    }
066    
067                    FMLLog.log(Level.SEVERE, var5, "A critical server error occured handling a packet, kicking %s", var2.getPlayer().entityId);
068                    logger.log(Level.WARNING, "Failed to handle packet for " + var2.playerEntity.getEntityName() + "/" + var2.playerEntity.func_71114_r() + ": " + var5, var5);
069                    var2.kickPlayerFromServer("Internal server error");
070                }
071    
072                if (var2.connectionClosed)
073                {
074                    this.connections.remove(var1--);
075                }
076    
077                var2.netManager.wakeThreads();
078            }
079        }
080    
081        public MinecraftServer getServer()
082        {
083            return this.mcServer;
084        }
085    }