package com.planet_ink.coffee_mud.core.intermud.i3.net;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.CMSecurity.DbgFlag;
import com.planet_ink.coffee_mud.core.CMSecurity.DisFlag;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

/**
 * Copyright (c) 1996 George Reese
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  	  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

public class ListenThread extends Thread
{
	private final ServerSocket listen;
	private final Vector<Socket> clients;

	public ListenThread(final int port) throws java.io.IOException
	{
		super("I3Listener@"+port);
		clients = new Vector<Socket>(10, 2);
		listen = new ServerSocket(port);
		setDaemon(true);
		start();
	}

	@Override
	public void run()
	{
		while( listen!=null && !listen.isClosed() )
		{
			Socket client;
			if(CMSecurity.isDisabled(DisFlag.I3))
			{
				clients.clear();
				CMLib.s_sleep(100);
				continue;
			}
			try
			{
				client = listen.accept();
				synchronized( clients )
				{
					clients.addElement(client);
				}
				if(CMSecurity.isDebugging(DbgFlag.I3))
					Log.debugOut("I3Connection: "+client.getRemoteSocketAddress());
				else
				if(clients.size()>100)
					Log.errOut("Excessive I3 connections: "+client.getRemoteSocketAddress());
			}
			catch( final java.io.IOException e )
			{
			}
		}
	}

	public void close()
	{
		try
		{
			if(listen!=null)
				listen.close();
			clients.clear();
			this.interrupt();
		}
		catch(final Exception e)
		{
		}
	}

	public Socket nextSocket()
	{
		Socket client;

		synchronized( clients )
		{
			if( clients.size() > 0 )
			{
				client = clients.elementAt(0);
				clients.removeElementAt(0);
			}
			else
			{
				client = null;
			}
		}
		return client;
	}
}
