// $Id: zoom-1.0f.hh,v 1.1 2001-11-01 15:09:31 mike Exp $
//
// ZOOM C++ Binding.
// The ZOOM homepage is at http://zoom.z3950.org/
//
// This file is maintained by Ashley Sanders <ashley.sanders@man.ac.uk>


namespace ZOOM {
  // Forward declarations for type names.
  class query;
  class resultSet;
  class record;
  class data;

  const char *option (const char *key);
  const char *option (const char *key, const char *val);
  int errcode ();
  char *errmsg ();
  char *addinfo ();

  class connection {
  public:
    connection (const char *hostname, int portnum);
    const char *option (const char *key) const;
    const char *option (const char *key, const char *val);
    resultSet *search (query *q);
    int errcode () const;
    const char *errmsg () const;
    const char *addinfo () const;
  };

  class query {
      // pure virtual class: derive concrete subclasses from it.
  public:
    virtual ~query ();
  };

  class prefixQuery : public query {
  public:
    prefixQuery (const char *pqn);
    ~prefixQuery ();
  };

  class CCLQuery : public query {
  public:
    CCLQuery (const char *ccl, void *qualset);
    ~CCLQuery ();
  };

  class resultSet {
    // No public constructor: these are created by ZOOM::connection
  public:
    ~resultSet ();
    const char *option (const char *key) const;
    const char *option (const char *key, const char *val);
    size_t size () const;
    const record *getRecord (size_t num) const;
    int errcode () const;
    const char *errmsg () const;
    const char *addinfo () const;
    friend class connection;
  };

  class record {
    // Abstract base class. A sub-class should be defined for
    // each record syntax supported.
  public:
    virtual ~record ();
    enum recordSyntax {
      GRS1, SUTRS, USMARC, UKMARC, XML
    };
    virtual record *clone () const = 0;
    virtual recordSyntax recsyn () const = 0;
    virtual size_t nfields () const = 0;
    virtual char *field (const char *spec) const = 0;
    virtual const char *render () const = 0;
    virtual data *rawdata () const = 0;
  };

  class data {
    // Base class. A sub-class should be defined for
    // each record syntax supported.
  public:
    virtual ~data ();
    virtual data *clone () const = 0;
    virtual record::recordSyntax recsyn () const = 0;
  };

  class error {
    // pure virtual class: derive concrete subclasses from it.
  };

  class systemError: public error {
  public:
    systemError ();
    int errcode () const;
  };
  
  class bib1Error: public error {
  public:
    bib1Error (int errcode, const char *addinfo);
    int errcode () const;
    const char *addinfo () const;
  };
}
