Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > by-pkgid > 466dcd1251ce46bdc084d7478aa6d6c0 > files > 5

webcam_server-0.40-3mdk.ppc.rpm

/*
 * ImageDownloader.java
 *
 * Created on February 24, 2002, 12:25 AM
 */

import java.net.*;
import java.io.*;
import java.awt.*;
import java.lang.Thread;
import java.awt.image.*;
import java.util.Vector;
/**
 *
 * @author  mike morrison
 */
public class ImageDownloader extends Thread {
    private Socket socket;
    private ImageCanvas imageCanvas = null;
    private String host;
    private int port;
    private boolean done;
    private String len_hdr = "content-length: ";
    private final String request = "GET / WCS/0.40";
    private double maxFPS = 1; // maximum frames per second, defaults to 10
    private int timeToWait = 0; //time to wait between image downloads
	private Vector chatQueue = new Vector();



    /** Creates a new instance of ImageDownloader */
    public ImageDownloader(String host, int port, double maxFPS, ImageCanvas ic) {
        this.host = host;
        this.port = port;
        imageCanvas = ic;
        setMaxFPS(maxFPS);
    }
	public void queueChatText(String message)
	{
		chatQueue.addElement(message);	
	}

    public void setMaxFPS(double maxFPS){
        if (maxFPS > 0){
            this.maxFPS = maxFPS;
            timeToWait = (int)(1000.0/maxFPS);
        }
    }
    public double getMaxFPS(){
        return maxFPS;
    }
    public boolean connect(){
        try{
            socket = new Socket(host,port);
        }catch (IOException e){
            e.printStackTrace();
            return false;
        }
        return true;
    }
    public boolean disconnect(){
        done = true;
        return true;
    }
    public boolean isConnected(){
        return (!done);
    }
    public void run(){
        
        done = false;
        if(!connect())
	{
		imageCanvas.couldNotConnect();
		imageCanvas.setConnected(ImageCanvas.DISCONNECTED);
		imageCanvas.setStartStopText("Start");
	}
	else
	{
		imageCanvas.setConnected(ImageCanvas.CONNECTED);
        	try{
        	    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        	    InputStream input = socket.getInputStream();
        	    BufferedInputStream bufferedInput = new BufferedInputStream(input);
        	    //socket.setKeepAlive(true);
        	    //socket.setSoTimeout(1000);
        	    //socket.setReceiveBufferSize(10000);
        	    byte imgSize[] = new byte[4];
		    byte header[] = new byte[1024];

        	    //int count = 0;
        	    long startTime = System.currentTimeMillis();
        	    long stopTime  = startTime, decodeStop, downloadStop,prepareStop=0;

        	    Image img;
        	    while (!done){
                	//time the image started being downloaded
                	startTime = System.currentTimeMillis();
                	printWriter.println(request);
			if(chatQueue.size() > 0)
			{
				System.out.println((String)chatQueue.elementAt(0));
				printWriter.println((String)chatQueue.elementAt(0));
				chatQueue.removeElementAt(0);
			}	
                	printWriter.flush();
			int i=0;
			while((header[i] = (byte)bufferedInput.read()) != -1)
			{
				//System.out.print((char)header[i]);
				if(i>0)
				if(header[i] == '\n' && header[i-1] == '\n')
					break;
				i++;
			}
			String s = new String(header).toLowerCase();

			int start = s.indexOf(len_hdr) + len_hdr.length();
			int end = s.indexOf("\n", start);
			s = s.substring(start, end);

	 		int size = Integer.parseInt(s);
                	if (size < 0) break;
                	byte imageBytes[] = new byte[size];

                	int newSize = 0;
                	int totalSize = 0;

                	while ((newSize = bufferedInput.read(imageBytes,totalSize,size- totalSize)) != -1){
                	    totalSize += newSize;
                	    if (totalSize == size) break;
                	    wait(10);
                	}
                	if (totalSize != size){
                	    System.out.println("Did not read everything!");
                	    break;
                	}
                	//System.out.println("Download Time: " + (System.currentTimeMillis() - startTime) + "ms");

                	img = Toolkit.getDefaultToolkit().createImage(imageBytes);                

                	//create and draw the image
                	if (imageCanvas !=null) imageCanvas.setImage(img);

                	stopTime = System.currentTimeMillis();
                	// wait before reqesting another image.
                	// to maintain maxFPS

                	if ((timeToWait - (stopTime - startTime)) > 0){
                	     wait((int) (timeToWait - (stopTime - startTime)));
                	}

        	    }
        	}catch(IOException e){
        	    e.printStackTrace();
		    imageCanvas.setConnected(ImageCanvas.DISCONNECTED);
                    imageCanvas.setStartStopText("Start");
        	}finally{
        	    disconnect();
		    imageCanvas.setConnected(ImageCanvas.STOPPED);
		    imageCanvas.setStartStopText("Start");
		    try{
                	socket.close();
        	    }catch (IOException ioe){
                	ioe.printStackTrace();
        	    }
        	}
	}
    }

    public int FourBytesToInt(byte buf[])
    {
        int i = 0;
        int pos = 0;
        i += unsignedByteToInt(buf[pos++]) << 0;
        i += unsignedByteToInt(buf[pos++]) << 8;
        i += unsignedByteToInt(buf[pos++]) << 16;
        i += unsignedByteToInt(buf[pos++]) << 24;
	return i;
    }
    public static int unsignedByteToInt(byte b) {
       return (int) b & 0xFF;
    }

    public void wait(int n){
        try{
            sleep(n);
        }catch(InterruptedException e){}
    }        
    
    public static void main (String args[]){
        ImageDownloader downloader = new ImageDownloader(args[1], Integer.parseInt(args[2]), 30, null);
        downloader.start();
    }
}