//-----------------------------------------------------------------------------
// Copyright (c) 1994,1995 Southeastern Universities Research Association,
//                         Continuous Electron Beam Accelerator Facility
//
// This software was developed under a United States Government license
// described in the NOTICE file included as part of this distribution.
//
// Jefferson Lab HPC Group, 12000 Jefferson Ave., Newport News, VA 23606
//-----------------------------------------------------------------------------
//
// Description:
//      RSVC UDP Client for Servers to update their time stamps
//
// Author:  
//      Jie Chen
//      Jefferson Lab HPC Group
//
// Revision History:
//   $Log: rsvcUdpClient.java,v $
//   Revision 1.1.1.1  2000/05/23 15:12:50  pal
//   cdev_psi_1.7.2
//
//   Revision 1.1  1999/10/18 17:12:44  chen
//   *** empty log message ***
//
//
//
import java.io.*;
import java.util.*;
import java.net.*;
import rsvcEvent;
import rsvcData;
import rsvcConfig;

public final class rsvcUdpClient
{
    // UDP Socket
    private DatagramSocket udpsocket_ = null;
    // Destination address for packets
    private InetAddress    dest_ = null;
    // Destination port for packets
    private int            port_ = 0;

    /**
     * Construct an empty rsvcUdpClient Object
     */
    public rsvcUdpClient ()
    {
	// empty
    }

    /**
     * Override default finalize method.This allows Java virtual
     * machine to clean up resource when this object is no longer
     * needed.
     */
    protected void finalize() throws Throwable
    {
	if (udpsocket_ != null)
	    udpsocket_.close ();
    }

    /**
     * Connect to a server that is on a given host at a given port
     */
    public synchronized void connect (String host, int port) throws UnknownHostException, IOException
    {
	try {
	    udpsocket_ = new DatagramSocket ();
	}catch (IOException e) {
	    System.err.println(e);
	    throw e;
	}

	try {
	    dest_ = InetAddress.getByName (host);
	}catch (UnknownHostException ue) {
	    throw ue;
	}
	port_ = port;
    }

    /**
     * A server that is being managed by RSVC sends a very simple data
     * to the rsvcServer to manifest itself being alive.
     * data is in the form of two tagged ("name", "domain") values or
     * anything that will make up an index
     */
    public synchronized int update (rsvcData data) throws IOException
    {
	if (udpsocket_ == null)
	    return rsvcConfig.RSVC_ERROR;

	rsvcEvent cbk = new rsvcEvent (data);
	cbk.setOpcode (rsvcConfig.RSVC_SET);
	cbk.setEventid (0);

	int datasize = cbk.streamSize ();
	ByteArrayOutputStream baoutput = new ByteArrayOutputStream (datasize);
	try {
	    cbk.streamOut (baoutput);
	}catch (IOException e) {
	    throw e;
	}

	// return underlying byte from this byteArrayStream
	byte[] obuffer = baoutput.toByteArray ();
	if (datasize != obuffer.length) {
	    throw new IOException ("Streamed out buffer size != original calculated stream size");
	}

	// construct a datapacket to send data out
	DatagramPacket packet = new DatagramPacket (obuffer, datasize,
						    dest_, port_);

	try {
	    udpsocket_.send (packet);
	} catch (IOException e) {
	    throw e;
	}
	return rsvcConfig.RSVC_SUCCESS;
    }

    /**
     * Shutdown connection (close socket)
     */
    public void disconnect () 
    {
	if (udpsocket_ != null)
	    udpsocket_.close ();
    }
	
	
}

