|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2013 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _dmr_h
|
|
Packit |
a4aae4 |
#define _dmr_h 1
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <cassert>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <iostream>
|
|
Packit |
a4aae4 |
#include <string>
|
|
Packit |
a4aae4 |
#include <vector>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
//#include "D4Group.h"
|
|
Packit |
a4aae4 |
//#include "XMLWriter.h"
|
|
Packit |
a4aae4 |
#include "DapObj.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class D4Group;
|
|
Packit |
a4aae4 |
class D4BaseTypeFactory;
|
|
Packit |
a4aae4 |
class XMLWriter;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class DDS;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** DMR is root object for a DAP4 dataset. It holds a D4Group and other
|
|
Packit |
a4aae4 |
* information about the dataset (DAP protocol number, DMR version, etc.).
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @note This class holds the dataset name and filename (which might
|
|
Packit |
a4aae4 |
* actually be a database name, but it's usually a filename). The variables
|
|
Packit |
a4aae4 |
* of a DAP4 dataset are held by the D4Group instance (which is a child
|
|
Packit |
a4aae4 |
* of Constructor).
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
class DMR : public DapObj
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
private:
|
|
Packit |
a4aae4 |
D4BaseTypeFactory *d_factory;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// The name of the dataset. This should not be the pathname to a file
|
|
Packit |
a4aae4 |
string d_name;
|
|
Packit |
a4aae4 |
/// The pathname or other system identifier for the dataset
|
|
Packit |
a4aae4 |
string d_filename;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// DAP protocol major version number. Should be '4'
|
|
Packit |
a4aae4 |
int d_dap_major;
|
|
Packit |
a4aae4 |
/// DAP protocol minor version number.
|
|
Packit |
a4aae4 |
int d_dap_minor;
|
|
Packit |
a4aae4 |
/// String version of the DAP protocol number
|
|
Packit |
a4aae4 |
string d_dap_version;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// The version of the DMR document
|
|
Packit |
a4aae4 |
string d_dmr_version;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// The URL for the request base
|
|
Packit |
a4aae4 |
string d_request_xml_base;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// The namespace to use when printing the XML serialization
|
|
Packit |
a4aae4 |
string d_namespace;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// The maximum response size (in Kilo bytes)
|
|
Packit |
a4aae4 |
long d_max_response_size;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// The root group; holds dimensions, enums, variables, groups, ...
|
|
Packit |
a4aae4 |
D4Group *d_root;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
friend class DMRTest;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
protected:
|
|
Packit |
a4aae4 |
void m_duplicate(const DMR &dmr);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
DMR();
|
|
Packit |
a4aae4 |
DMR(const DMR &dmr);
|
|
Packit |
a4aae4 |
DMR(D4BaseTypeFactory *factory, const string &name = "");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DMR(D4BaseTypeFactory *factory, DDS &dds;;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual ~DMR();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DMR &operator=(const DMR &rhs;;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void build_using_dds(DDS &dds;;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* Class invariant. If true, any method can be used.
|
|
Packit |
a4aae4 |
* @return True if the instance is OK to use, false otherwise.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
bool OK() const { return (d_factory && d_root && !d_dap_version.empty()); }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Get and set the DMR's name. This is effectively the 'dataset' name.
|
|
Packit |
a4aae4 |
* It should not be used to reference the dataset's data store
|
|
Packit |
a4aae4 |
* (e.g., it should not be a pathname to a file). This will be used in
|
|
Packit |
a4aae4 |
* error messages.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
//@{
|
|
Packit |
a4aae4 |
string name() const { return d_name; }
|
|
Packit |
a4aae4 |
void set_name(const string &n) { d_name = n; }
|
|
Packit |
a4aae4 |
//@}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Get/set the factory which makes instances of the variables.
|
|
Packit |
a4aae4 |
Specialize D4BaseTypeFactory so that a DMR will be
|
|
Packit |
a4aae4 |
populated with your client or server's specialized types.*/
|
|
Packit |
a4aae4 |
//@{
|
|
Packit |
a4aae4 |
virtual D4BaseTypeFactory *factory() { return d_factory; }
|
|
Packit |
a4aae4 |
virtual void set_factory(D4BaseTypeFactory *f) { d_factory = f; }
|
|
Packit |
a4aae4 |
//@}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** get/set the dataset's 'filename.' The filename is a string that can
|
|
Packit |
a4aae4 |
* be used to access the dataset's actual data store (it's usually a
|
|
Packit |
a4aae4 |
* pathname to a file, but it might be a database key.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
//@{
|
|
Packit |
a4aae4 |
string filename() const { return d_filename; }
|
|
Packit |
a4aae4 |
void set_filename(const string &fn) { d_filename = fn;}
|
|
Packit |
a4aae4 |
//@}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string dap_version() const { return d_dap_version; }
|
|
Packit |
a4aae4 |
void set_dap_version(const string &version_string);
|
|
Packit |
a4aae4 |
int dap_major() const { return d_dap_major; }
|
|
Packit |
a4aae4 |
int dap_minor() const { return d_dap_minor; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string dmr_version() const { return d_dmr_version; }
|
|
Packit |
a4aae4 |
void set_dmr_version(const string &v) { d_dmr_version = v; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// Get the URL that will return this DMR/DDX/DataThing
|
|
Packit |
a4aae4 |
string request_xml_base() const { return d_request_xml_base; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// @see get_request_xml_base
|
|
Packit |
a4aae4 |
void set_request_xml_base(const string &xb) { d_request_xml_base = xb; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// Get the namespace associated with the DDS - likely set only by DDX responses
|
|
Packit |
a4aae4 |
string get_namespace() const { return d_namespace; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// Set the namespace for this DDS/DDX object/response
|
|
Packit |
a4aae4 |
void set_namespace(const string &ns) { d_namespace = ns; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// TODO Move the response_limit methods to D4ResponseBuilder? jhrg 5/1/13
|
|
Packit |
a4aae4 |
/// Get the maximum response size, in KB. Zero indicates no limit.
|
|
Packit |
a4aae4 |
long response_limit() { return d_max_response_size; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Set the maximum response size. Zero is the default value. The size
|
|
Packit |
a4aae4 |
is given in kilobytes.
|
|
Packit |
a4aae4 |
@param size The maximum size of the response in kilobytes. */
|
|
Packit |
a4aae4 |
void set_response_limit(long size) { d_max_response_size = size; }
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/// Get the estimated response size, in kilo bytes
|
|
Packit |
a4aae4 |
long request_size(bool constrained);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Return the root group of this Dataset. If no root group has been
|
|
Packit |
a4aae4 |
* set, use the D4BaseType factory to make it.
|
|
Packit |
a4aae4 |
* @return The root group of the dataset.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
D4Group *root();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static DDS *getDDS(DMR &dmr);
|
|
Packit |
a4aae4 |
virtual DDS *getDDS();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void print_dap4(XMLWriter &xml, bool constrained = false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void dump(ostream &strm) const ;
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#endif // _dmr_h
|