
// ChatWatcher.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Objekt typu ChatWatcher sleduje zprávy přicházející ze serveru.

   Formát zprávy:
      * "WHO$$ cliAddr1 & port1 & ... cliAddrN & portN & "
           -- reakce na zprávu "who"

      * "(cliAddr,port): msg"
           -- všesměrová zpráva, pocházející od klienta se 
              specifikovanou adresou a portem

   Zprávy se umísťují do textové oblasti uživatelského rozhraní 
   objektu typu ChatClient voláním jeho metody showMsg().
*/

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


public class ChatWatcher extends Thread
{
  private ChatClient client;   // odkazuje se na objekt klienta
  private BufferedReader in;   // proud přicházející ze serveru


  public ChatWatcher(ChatClient c, BufferedReader i)
  {  client = c; in = i;  }


  public void run()
  /* Přečte zprávu ze serveru, zobrazí sekvenci a proces opakuje.
     Zpráva může obsahovat:
			"WHO$$ n1 & p1 & .... nN & pN & "
     nebo    "(cliAddr,port): msg"

     "WHO$$"-zprávy jsou formátovány v metodě showWho(), zatímco
     ostatní se zobrazují ihned voláním metody klienta showMsg().
  */
  { String line;
    try {
      while ((line = in.readLine()) != null) {
        if ((line.length() >= 6) &&     // "WHO$$ "
            (line.substring(0,5).equals("WHO$$")))
          showWho( line.substring(5).trim() );    
		    // odeber klíčové slovo WHO$$ i s okolními mezerami
        else  // okamžitě zobraz
          client.showMsg(line + "\n");
      }
    }
    catch(Exception e)    // uzavření socketu způsobí přerušení cyklu while
    { // System.out.println( e );  
      JOptionPane.showMessageDialog( null, 
           "Spojení se serverem ztraceno!", "Connection Closed", 
			JOptionPane.ERROR_MESSAGE);
      System.exit( 0 );
    }
  } // konec metody: run()


  private void showWho(String line)
  /*  Parametr line má následující formát:
             "cliAddr1 & port1 & ... cliAddrN & portN & "
      Před předáním metodě showMsg() objektu klienta jej přeformátuje.
  */
  { StringTokenizer st = new StringTokenizer(line, "&");
    String addr;
    int port;
    int i = 1;
    try {
      while (st.hasMoreTokens()) {
        addr = st.nextToken().trim();
        port = Integer.parseInt( st.nextToken().trim() );
        client.showMsg("" + i + ". " + addr + " : " + port + "\n");
        i++;
      }
      // client.showMsg("\n");
    }
    catch(Exception e)
    { client.showMsg("Problem parsing who info.\n");
      System.out.println("Parsing error with who info: \n" + e);  
    }
  }  // konec metody: showWho()


}  // konec třídy: ChatWatcher class