//=========================================================================
// Summary  : */
// Filename : SharedObjectClient.h
// Author   : Tom O'Reilly                                                  */
// Project  : */
// Revision : 1
// Created  : 2000/08/19
// Modified : 2000/08/19
//=========================================================================
// Description :
//=========================================================================
#ifndef _SHAREDOBJECTCLIENT_H
#define _SHAREDOBJECTCLIENT_H

#include <unistd.h>
#include <stdio.h>
#include "SharedObject.h"

// Use this for server connect timeout if you don't want to connect
// to server at create time
#define DoNotConnect -1

/*
CLASS 
SharedObjectClient

DESCRIPTION
Applications use a SharedObjectClient to exchange data with a server process

AUTHOR
Tom O'Reilly
*/

class SharedObjectClient : public SharedObject {

public:

  friend class ExternalComms;

  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] name: Name of object instance
  // [input] serverName: Name of server program
  // [input] serverConnectTimeout: Timeout for server connection (sec)
  SharedObjectClient(const char *name, const char *serverName,
		     int serverConnectTimeout);


  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] name: Name of object instance
  SharedObjectClient(const char *name);

  ~SharedObjectClient();

  ///////////////////////////////////////////////////////////////////
  // Name of server process
  const char *serverName() {
    return _serverName;
  }

  ///////////////////////////////////////////////////////////////////
  // Specify name of server process
  void setServerName(const char *name);

  ///////////////////////////////////////////////////////////////////
  // Indicate if connected to server
  Boolean connected() {
    return _connected;
  }

  ///////////////////////////////////////////////////////////////////
  // Server pid
  pid_t serverPid() {
    return _serverPid;
  }

  ///////////////////////////////////////////////////////////////////
  // Bind to default server
  void bind(int serverConnectTimeout);

  ///////////////////////////////////////////////////////////////////
  // Bind to server with specified name
  void bind(const char *serverName, int serverConnectTimeout);

protected:

  class MissingServer : public Error {

  public:
    MissingServer(const char *serverName) : Error("") {
      sprintf(msg, "Server \"%s\" not found", serverName);
    }
  };

  ///////////////////////////////////////////////////////////////////
  // Find process with name specified by _serverName
  void findServer(int timeoutSecs = 10)
    throw (MissingServer);

  ///////////////////////////////////////////////////////////////////
  // Send request and wait for reply
  void send(Request *request, int nRequestBytes, 
	    Reply *reply, int nReplyBytes) 
    throw (Error);


private:

  const char *_serverName;
  pid_t _serverPid;
  Boolean _connected;
  int _serverConnectTimeout;

};


#endif
