// $Id: zoom-1.0d.hh,v 1.1.1.1 2001-10-25 16:15:03 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;

  enum recordSyntax {
    GRS1,
    SUTRS,
    USMARC,
    UKMARC,
    XML
  };

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

  class connection {
  public:
    connection (const char *hostname, int portnum);
    const void *option (const char *key) const;
    const void *option (const char *key, const void *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:
    const void *option (const char *key) const;
    const void *option (const char *key, const void *val);
    size_t size () const;
    record **getRecords (size_t i, size_t size) const;
    int errcode () const;
    const char *errmsg () const;
    const char *addinfo () const;
    friend class connection;
  };

  class record {
    // No public constructor: these are created by ZOOM::resultSet
  public:
    virtual ~record () {};
    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 const char *rawdata (size_t *psize) const = 0;
  };

  class MARCRecord : public record {
  public:
    ~MARCRecord ();
    size_t nfields () const;
    virtual char *field (const char *spec) const;
    virtual const char *render () const;
    const char *rawdata (size_t *psize) const;
    friend class resultSet;
  };

  class UKMARCRecord : public MARCRecord {
  public:
    recordSyntax recsyn () const;
    friend class resultSet;
  };
  
  class USMARCRecord : public MARCRecord {
  public:
    recordSyntax recsyn () const;
    friend class resultSet;
  };

  class XMLRecord : public record {
  public:
    ~XMLRecord ();
    recordSyntax recsyn () const;
    size_t nfields () const;
    char *field (const char *spec) const;
    const char *render () const;
    const char *rawdata (size_t *psize) const;
    friend class resultSet;
  };

  class SUTRSRecord : public record {
  public:
    ~SUTRSRecord ();
    recordSyntax recsyn () const;
    size_t nfields () const;
    char *field (const char *spec) const;
    const char *render () const;
    const char *rawdata (size_t *psize) const;
    friend class resultSet;
  };

  class GRS1Record : public record {
  public:
    ~GRS1Record ();
    recordSyntax recsyn () const;
    size_t nfields () const;
    char *field (const char *spec) const;
    const char *render () const;
    const char *rawdata (size_t *psize) const;
    friend class resultSet;
  };

  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;
  };
}
