package pl.helion.j2mepp.klientczata;

import javax.microedition.io.*;
import java.io.*;
public class WatekKlienta extends Thread
{
	 public WatekKlienta(String _host, String _login, KlientCzataMIDlet _klient)
	 {
	  host = _host;
	  login = _login;
	  klient = _klient;
	 }
	 public void wyslij(String tekst)
	 {
	  out.println(tekst);
	 }
	 public String odbierz() throws IOException
	 {
	  StringBuffer bufor = new StringBuffer();
	  int b = 0;
	  while ((b!=-1)&&(b!=10))
	  {
	   b = in.read();
	   if (b!=-1)
	   bufor.append((char)b);
	  }
	  return this.obetnij(bufor.toString());
	 }
	 public void run()
	 {
	  try
	  {
	   pol = (SocketConnection)Connector.open("socket://"+host+":"+PORT);
	   out = new PrintStream(pol.openOutputStream());
	   in = pol.openInputStream();
	   wyslij("hello"+ZNAK+login);
	   String komenda = "";
	   while (!komenda.equals("koniec") && czyodbierac)
	   {
	    komenda = odbierz();
	    String[] tablica = this.podziel(komenda,ZNAK);
	    if (tablica[0].equals("zlylogin"))
	    {
	     klient.zaloguj(false);
	     break;
	    }
	    if (tablica[0].equals("loginok"))
	    {
	     klient.zaloguj(true);
	    }
	    if (tablica[0].equals("msg") && tablica[1]!=null)
	     klient.dodajTekst(tablica[1]);
	   }
	  }
	  catch (Exception e)
	  {
	   if (czyodbierac)
	   {
	    this.zatrzymajWatek();
	    klient.pokazKomunikat("Serwer zakonczyl dzialanie");
	    try
	    {
	     Thread.sleep(3000);
	    } catch (InterruptedException ie){}
	   }
	   klient.notifyDestroyed();
	  }
	 }
	 public void zatrzymajWatek()
	 {
	  czyodbierac = false;
	  try
	  {
	   if (in != null)
	    in.close();
	   if (out != null)
	    out.close();
	   if (pol != null) 
	    pol.close(); 
	  }
	  catch (Exception e) {}
	 }
	 private String obetnij(String s)
	 {
	  String wynik = s;
	  int k = wynik.indexOf((char)10);
	  if (k!=-1) wynik = wynik.substring(0,k-1);
	  k = wynik.indexOf((char)13);
	  if (k!=-1) wynik = wynik.substring(0,k-1);
	  return wynik;
	 }
	 private String[] podziel(String s, String sep)
	 {
	  if (s.length()>0)
	  {
	   String[] wyniki = new String[liczbaZnakow(s,sep)+1];
	   int i = 0, poczatek = 0, koniec = s.indexOf(ZNAK, 0);
	   while (i<wyniki.length)
	   {
	    if (koniec == -1) koniec = s.length();
	    wyniki[i] = s.substring(poczatek, koniec);
	    poczatek = koniec + 1;
	    koniec = s.indexOf(ZNAK,poczatek);
	    i += 1;
	   }
	   return wyniki;
	  } else return new String[] { "" };
	 }
	 private int liczbaZnakow(String s, String sep)
	 {
	  int ilosc = 0;
	  for (int i=0;i<s.length();i++)
	  {
	   if (s.startsWith(sep,i)) ilosc += 1;
	  }
	  return ilosc;
	 }
	 private String login;
	 private KlientCzataMIDlet klient;
	 private SocketConnection pol;
	 private InputStream in;
	 private PrintStream out;
	 private boolean czyodbierac = true;
	 private String host;
	 private final int PORT = 34567;
	 private final String ZNAK = "~";
}
