package Server;

import java.io.*;
import java.util.*;
import java.net.*;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.math.*;
import org.bouncycastle.openssl.*; 
import org.bouncycastle.util.encoders.*;
/*
* >--TCP--<
* Author: Someone
*/
public class TCP implements Runnable{
  private ServerSocket $ss	= null;
  protected List<TCPW> $conn = null;
  protected PrivateKey $prk = null;


public TCP(int $port)throws Exception{
  System.out.println(Main.$cfg.getString("key")+"SERVER TCP: "+$port);	
  PEMReader in = new PEMReader(new FileReader(Main.$cfg.getString("key")), new PasswordFinder() { 
  @Override 
  public char[] getPassword(){
    try{System.out.println("Enter pass phrase:"); return (new BufferedReader(new InputStreamReader(System.in)).readLine()).toCharArray();}catch(Exception $e){$e.printStackTrace();}return null;
  }}); 
  $prk = ((KeyPair) in.readObject()).getPrivate();
  $conn = Collections.synchronizedList(new ArrayList());
  $ss = new ServerSocket($port);
  new Thread(this).start();
}

public void run(){
  try{
    while($ss != null){
      new TCPW($ss.accept(),this);
    }
  }catch(Exception $e){$e.printStackTrace();}
}

public void sendAll(String $msg){
  for(int $i = 0; $i < $conn.size(); $i++){
    if($conn.get($i).isLoggedIn())$conn.get($i).send($msg);
  }
}

public TCPW getConnByName(String $name){
  for(int $i = 0; $i < $conn.size() ; $i++){
    TCPW $tmp = $conn.get($i);
    if($name.equalsIgnoreCase($tmp.getName()))return $tmp;
  }
  return null;
}

public void delConn(TCPW $delme){
  for(int $i = 0; $i < $conn.size() ; $i++){
    if($conn.get($i) == $delme){$conn.remove($i);return;}
  }
}

public void shutdown(){
  try{
    $ss.close();
  }catch(Exception $e){$e.printStackTrace();}
  for(int $i = 0; $i < $conn.size() ; $i++){
    $conn.get($i).shutdown();
  }
}

}