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

/* Vláknový objekt typu URLChatWatcher posílá zprávu "read"
   objektu typu ChatServlet:
      ChatServlet?cmd=read&name=??  + uid cookie

  Reakcí jsou všechny veřejné zprávy, které dosud nevyly
  přečteny, nebo zpráva "no".

  Zprávy se zobrazí v textové oblasti klienta voláním
  metody showMsg().


  ---- Změny: 30. dubna 2004
  Port serveru změněn z 8080 na 8100

*/

import java.io.*;
import java.net.*;


public class URLChatWatcher extends Thread
{
  private static final int SLEEP_TIME = 2000;    // 2 sekundy mezi dotazy
  private static final String SERVER = "http://localhost:8100/servlet/ChatServlet";

  private URLChat client;
  private String userName;
  private String cookieStr = null;


  public URLChatWatcher(URLChat c, String nm, String cs)
  {  client = c; 
     userName = nm;
     cookieStr = cs;
  }


  public void run()
  // dotazuj se bez ustání
  { URL url;
    URLConnection conn;
    BufferedReader br;
    String line, response;
    StringBuffer resp;

    try {
      String readRequest = SERVER + "?cmd=read&name=" +  
							URLEncoder.encode(userName, "UTF-8") ;
      while(true) {
        Thread.sleep(SLEEP_TIME);    
 
        url  = new URL(readRequest);   // odešli zprávu "read"
        conn = url.openConnection();
    
        // nastav hodnotu cookie určenou k odeslání
        conn.setRequestProperty("Cookie", cookieStr);
    
	    br = new BufferedReader(
              new InputStreamReader( conn.getInputStream() ));	
        resp = new StringBuffer();    // sestav odpověď
        while ((line = br.readLine()) != null) {
          if (!fromClient(line))   // není-li od klienta
            resp.append(line+"\n"); 
        }
        br.close();

        response = resp.toString();
        if ((response != null) && !response.equals("\n"))
          client.showMsg(response);    // zobraz odpoveď
      }
    }
    catch(Exception e)
    { client.showMsg("Chyba serveru: sledování ukončeno\n");
      System.out.println(e);  
    }
  } // konec metody: run()


  private boolean fromClient(String line)
  // Řádek (zpráva) je od klienta, pokud začíná jménem
  {
    if (line.startsWith("("+userName))
      return true;
    return false;
  }  // konec metody: fromClient()


}  // konec třídy: URLChatWatcher