001package net.minecraft.network;
002
003import java.io.IOException;
004import java.util.ArrayList;
005import java.util.Collections;
006import java.util.List;
007import java.util.logging.Level;
008import java.util.logging.Logger;
009
010import cpw.mods.fml.common.FMLLog;
011import net.minecraft.crash.CrashReport;
012import net.minecraft.server.MinecraftServer;
013import net.minecraft.util.ReportedException;
014
015public 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.makeCrashReport(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}