/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : OffboardMessage.h                                             */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _OFFBOARDMESSAGE_H
#define _OFFBOARDMESSAGE_H

#include "ExternalData.h"

/*
CLASS 
OffboardMessage

DESCRIPTION
Implementation of ExternalData interface. Converts between primitive
data values and a low-bandwidth, platform-independent representation.
Used for exchanging data between onboard and offboard processes.

AUTHOR
Tom O'Reilly
*/
class OffboardMessage : public ExternalData {

public:

  ///////////////////////////////////////////////////////////////////
  OffboardMessage(int bufferSize);

  virtual ~OffboardMessage();

  ///////////////////////////////////////////////////////////////////
  // Reset buffer read/write pointer
  void reset();

  ///////////////////////////////////////////////////////////////////
  // Point to buffer
  const char *buffer();

  ///////////////////////////////////////////////////////////////////
  // Total number of bytes in buffer
  int nBufferSize();

  ///////////////////////////////////////////////////////////////////
  // Total bytes read or written
  int nBytesProcessed();

  ///////////////////////////////////////////////////////////////////
  // Set char value to external representation
  // [input] charData: Value to be converted
  virtual void set(CharData *shortData);

  ///////////////////////////////////////////////////////////////////
  // Set short value to external representation
  // [input] shortData: Value to be converted
  virtual void set(ShortData *shortData);

  ///////////////////////////////////////////////////////////////////
  // Set int value to external representation
  // [input] integerData: Value to be converted
  virtual void set(IntegerData *integerData);

  ///////////////////////////////////////////////////////////////////
  // Set int value to external representation
  // [input] floatData: Value to be converted
  virtual void set(FloatData *floatData);

  ///////////////////////////////////////////////////////////////////
  // Set int value to external representation
  // [input] doubleData: Value to be converted
  virtual void set(DoubleData *doubleData);

  ///////////////////////////////////////////////////////////////////
  // Get char value from external representation
  // [output] charData: contains internal representation of data
  virtual void get(CharData *charData);

  ///////////////////////////////////////////////////////////////////
  // Get short value from external representation
  // [output] shortData: contains internal representation of data
  virtual void get(ShortData *shortData);

  ///////////////////////////////////////////////////////////////////
  // Get int value from external representation
  // [output] integerData: contains internal representation of data
  virtual void get(IntegerData *integerData);

  ///////////////////////////////////////////////////////////////////
  // Get int value from external representation
  // [output] floatData: contains internal representation of data
  virtual void get(FloatData *floatData);

  ///////////////////////////////////////////////////////////////////
  // Get int value from external representation
  // [output] doubleData: contains internal representation of data
  virtual void get(DoubleData *integerData);

  ///////////////////////////////////////////////////////////////////
  // Read message from socket
  int read(int socket);

  ///////////////////////////////////////////////////////////////////
  // Write message to socket
  int write(int socket);

  ///////////////////////////////////////////////////////////////////
  // TaskInterface to access
  int taskIndex();

  ///////////////////////////////////////////////////////////////////
  // Method to invoke on TaskInterface
  int methodCode();


protected:

  char *nextToken();
  char *startNextToken(char *buffer);
  void endRecord();

  char *_buffer;
  int _nBufferBytes;
  char *_bufPtr;
  char _tmpBuf[100];

  // Pointer to end of buffer
  char *_endPtr;

  // TaskInterface
  int _taskIndex;

  // Method to invoke on TaskInterface
  int _methodCode;
};

#endif
