// $Id: zoom-1.0c.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 {
    recordSyntaxGRS1,
    recordSyntaxSUTRS,
    recordSyntaxUSMARC,
    recordSyntaxUKMARC,
    recordSyntaxXML
  };

  class Z3950 {
  public:
    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 *srch);
    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 *search);
    ~prefixQuery ();
  };

    
  // ### Also need CCL search, build-by-hand tree, etc.

  class resultSet {
    // No public constructor: these are created by Z3950::connection
  public:
    const void *option (const char *key) const;
    const void *option (const char *key, const void *val);
    size_t size () const;
    record *getRecord (size_t i) const;
    record **getRecords (size_t *psz) const;
    record **getRecords (size_t i, size_t sz) const;
    int errcode () const;
    const char *errmsg () const;
    const char *addinfo () const;
    friend class connection;
  };

  class record {
    // No public constructor: these are created by Z3950::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:
    //virtual Z3950_recordSyntax recsyn () const = 0;
    ~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);
    int errcode () const;
  };
  
  class bib1Error: public error {
  public:
    bib1Error (int errcode, const char *addinfo);
    int errcode () const;
    const char *addinfo () const;
  };
}
