/*********************************************************************
 *
 * File        :  $Source: /ds6/cvs/privoxy/src/java/org/privoxy/activityconsole/ServerThread.java,v $
 *
 * Purpose     :  Listen on a specified port for status updates from
 *                Privoxy.  If we get a suitable update, pass it along
 *                to the GUI for processing.  We need to handle getting
 *                shut down and restarting on another port gracefully.
 *
 * Copyright   :  Written by and Copyright (C) 2003 the SourceForge
 *                Privoxy team. http://www.privoxy.org/
 *
 *                Based on the Internet Junkbuster originally written
 *                by and Copyright (C) 1997 Anonymous Coders and
 *                Junkbusters Corporation.  http://www.junkbusters.com
 *
 *                This program is free software; you can redistribute it
 *                and/or modify it under the terms of the GNU General
 *                Public License as published by the Free Software
 *                Foundation; either version 2 of the License, or (at
 *                your option) any later version.
 *
 *                This program is distributed in the hope that it will
 *                be useful, but WITHOUT ANY WARRANTY; without even the
 *                implied warranty of MERCHANTABILITY or FITNESS FOR A
 *                PARTICULAR PURPOSE.  See the GNU General Public
 *                License for more details.
 *
 *                The GNU General Public License should be included with
 *                this file.  If not, you can view it at
 *                http://www.gnu.org/copyleft/gpl.html
 *                or write to the Free Software Foundation, Inc., 59
 *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * Revisions   :
 *    $Log: ServerThread.java,v $
 *    Revision 1.1.1.1  2003/05/23 11:19:34  lionel
 *    Initial import of upstream 13 Feb 2003 CVS
 *
 *    Revision 1.1  2003/01/18 14:37:24  david__schmidt
 *    Initial checkin of directory structure and source code of the java Activity
 *    Console
 *
 *********************************************************************/

package org.privoxy.activityconsole;

import java.net.*;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.swing.*;

/** 
 * Listens on a specified port for status updates from Privoxy. 
 * @author Last Modified By: $Author: lionel $
 * @version $Rev$-$Date: 2003/05/23 11:19:34 $$State: Exp $
 */
public class ServerThread extends Thread
{
  private static final String
    COPYRIGHT = org.privoxy.activityconsole.Copyright.COPYRIGHT;

  static ActivityConsoleGui _parent;
  static int _port;
  static ServerSocket _serverSocket;

  public ServerThread(ActivityConsoleGui parent, int thePort)
  {
    _parent = parent;
    _port = thePort;
  }

  public void run()
  {
    try
    {
      _serverSocket = new ServerSocket(_port);        
      try
      {
        // System.out.println( "ServerThread serving port "+_port+"." );
        boolean shouldRun = true;
        while (shouldRun)
        {
          Socket theSocket = _serverSocket.accept();
          if (!Thread.currentThread().interrupted())
          {
            BufferedReader in = 
            new BufferedReader(new InputStreamReader(theSocket.getInputStream()));
            String line = in.readLine();
            /* Ensure the line isn't null and it's not way, way too long... */
            if ((line != null) && (line.length() < 65536))
            {
              _parent.updateStats(line,theSocket.getInetAddress().getHostName());
            }
            in.close();
            theSocket.close();
          }
          else
          {
            shouldRun = false;
          }
        }
        _serverSocket.close();
        _serverSocket = null;
      }
      catch (IOException io)
      {
        try
        {
          _serverSocket.close();
          _serverSocket = null;
        }
        catch (IOException fred)
        {
          _serverSocket = null;
        }
      }
    }
    catch (IOException io)
    {
      System.err.println(io);
      JOptionPane.showMessageDialog(null, io, "Alert: port "+_port, JOptionPane.ERROR_MESSAGE);
    }
  }

  public void doClose()
  {
    try
    {
      _serverSocket.close();
    }
    catch (IOException fred)
    {
    }
  }
}
