|
Packit |
a4aae4 |
|
|
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) 2002,2003 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// (c) COPYRIGHT URI/MIT 1997-1999
|
|
Packit |
a4aae4 |
// Please first read the full copyright statement in the file COPYRIGHT_URI.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// Authors:
|
|
Packit |
a4aae4 |
// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _dodsfilter_h
|
|
Packit |
a4aae4 |
#define _dodsfilter_h
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <string>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _das_h
|
|
Packit |
a4aae4 |
#include "DAS.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _dds_h
|
|
Packit |
a4aae4 |
#include "DDS.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef constraint_evaluator_h
|
|
Packit |
a4aae4 |
#include "ConstraintEvaluator.h"
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** When a DODS server receives a request from a DODS client, the
|
|
Packit |
a4aae4 |
server CGI script dispatches the request to one of several
|
|
Packit |
a4aae4 |
``filter'' programs. Each filter is responsible for returning a
|
|
Packit |
a4aae4 |
different aspect of the dataset information: one is for data, one
|
|
Packit |
a4aae4 |
is for the dataset DDS, one is for the dataset DAS, and a fourth
|
|
Packit |
a4aae4 |
is for a usage message describing the server itself. Some
|
|
Packit |
a4aae4 |
installations may have additional optional filters.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The filter program receives a data request from the dispatch
|
|
Packit |
a4aae4 |
script. It receives its operating parameters from the command
|
|
Packit |
a4aae4 |
line, like any UNIX command, and it returns its output to standard
|
|
Packit |
a4aae4 |
output, which the httpd server packages up into a reply to the
|
|
Packit |
a4aae4 |
client.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
This class contains some common functions for the filter programs
|
|
Packit |
a4aae4 |
used to make up the DODS data servers. The filter programs do not
|
|
Packit |
a4aae4 |
have to be called by a CGI program, but that is the normal
|
|
Packit |
a4aae4 |
mechanism by which they are invoked.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@todo Add a test to make sure that the required arguments are given.
|
|
Packit |
a4aae4 |
@todo We need to rethink the ancillary file/directory stuff. I don't
|
|
Packit |
a4aae4 |
think it's ever been used...
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@brief Common functions for DODS server filter programs.
|
|
Packit |
a4aae4 |
@author jhrg 8/26/97 */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class DODSFilter
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
/** Types of responses DODSFilter know about. */
|
|
Packit |
a4aae4 |
enum Response {
|
|
Packit |
a4aae4 |
Unknown_Response,
|
|
Packit |
a4aae4 |
DAS_Response,
|
|
Packit |
a4aae4 |
DDS_Response,
|
|
Packit |
a4aae4 |
DataDDS_Response,
|
|
Packit |
a4aae4 |
DDX_Response,
|
|
Packit |
a4aae4 |
DataDDX_Response,
|
|
Packit |
a4aae4 |
BLOB_Response,
|
|
Packit |
a4aae4 |
Version_Response
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
protected:
|
|
Packit |
a4aae4 |
bool d_comp; // True if the output should be compressed.
|
|
Packit |
a4aae4 |
bool d_bad_options; // True if the options (argc,argv) are bad.
|
|
Packit |
a4aae4 |
bool d_conditional_request;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string d_program_name; // Name of the filter program
|
|
Packit |
a4aae4 |
string d_dataset; // Name of the dataset/database
|
|
Packit |
a4aae4 |
string d_dap2ce; // DAP2 Constraint expression
|
|
Packit |
a4aae4 |
string d_cgi_ver; // Version of CGI script (caller)
|
|
Packit |
a4aae4 |
string d_anc_dir; // Look here for ancillary files
|
|
Packit |
a4aae4 |
string d_anc_file; // Use this for ancillary file name
|
|
Packit |
a4aae4 |
string d_cache_dir; // Use this for cache files
|
|
Packit |
a4aae4 |
string d_url; // URL minus CE.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Response d_response; // enum name of the response to generate
|
|
Packit |
a4aae4 |
string d_action; // string name of the response to generate
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int d_timeout; // Server timeout after N seconds
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
time_t d_anc_das_lmt; // Last modified time of the anc. DAS.
|
|
Packit |
a4aae4 |
time_t d_anc_dds_lmt; // Last modified time of the anc. DDS.
|
|
Packit |
a4aae4 |
time_t d_if_modified_since; // Time from a conditional request.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void initialize();
|
|
Packit |
a4aae4 |
void initialize(int argc, char *argv[]);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual int process_options(int argc, char *argv[]);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
/** Make an empty instance. Use the set_*() methods to load with needed
|
|
Packit |
a4aae4 |
values. You must call at least set_dataset_name() or be requesting
|
|
Packit |
a4aae4 |
version information.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
@todo Add methods to provide a way to set all of the parameters
|
|
Packit |
a4aae4 |
this class contains. They can currently only be set using the
|
|
Packit |
a4aae4 |
argc/argv command line parameters. */
|
|
Packit |
a4aae4 |
DODSFilter()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
initialize();
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
DODSFilter(int argc, char *argv[]) throw(Error);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual ~DODSFilter();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual bool is_conditional() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual string get_cgi_version() const;
|
|
Packit |
a4aae4 |
virtual void set_cgi_version(string version);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual string get_ce() const;
|
|
Packit |
a4aae4 |
virtual void set_ce(string _ce);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual string get_dataset_name() const;
|
|
Packit |
a4aae4 |
virtual void set_dataset_name(const string _dataset);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual string get_URL() const;
|
|
Packit |
a4aae4 |
virtual void set_URL(const string &url;;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual string get_dataset_version() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual Response get_response() const;
|
|
Packit |
a4aae4 |
virtual string get_action() const;
|
|
Packit |
a4aae4 |
virtual void set_response(const string &r);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual time_t get_dataset_last_modified_time() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual time_t get_das_last_modified_time(const string &anc_location = "") const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual time_t get_dds_last_modified_time(const string &anc_location = "") const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual time_t get_data_last_modified_time(const string &anc_location = "") const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual time_t get_request_if_modified_since() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual string get_cache_dir() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void set_timeout(int timeout = 0);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int get_timeout() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void establish_timeout(ostream &stream) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void print_usage() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void send_version_info() const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void send_das(DAS &das, const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
virtual void send_das(ostream &out, DAS &das, const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void send_dds(DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
bool constrained = false,
|
|
Packit |
a4aae4 |
const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
virtual void send_dds(ostream &out, DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
bool constrained = false,
|
|
Packit |
a4aae4 |
const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
// deprecated
|
|
Packit |
a4aae4 |
virtual void functional_constraint(BaseType &var, DDS &dds,
|
|
Packit |
a4aae4 |
ConstraintEvaluator &eval, ostream &out) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void dataset_constraint(DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
ostream &out, bool ce_eval = true) const;
|
|
Packit |
a4aae4 |
virtual void dataset_constraint_ddx(DDS & dds, ConstraintEvaluator & eval,
|
|
Packit |
a4aae4 |
ostream &out, const string &boundary,
|
|
Packit |
a4aae4 |
const string &start,
|
|
Packit |
a4aae4 |
bool ce_eval = true) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void send_data(DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
ostream &data_stream,
|
|
Packit |
a4aae4 |
const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
virtual void send_ddx(DDS &dds, ConstraintEvaluator &eval, ostream &out,
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
virtual void send_data_ddx(DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
ostream &data_stream, const string &start,
|
|
Packit |
a4aae4 |
const string &boundary,
|
|
Packit |
a4aae4 |
const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void establish_timeout(FILE *stream) const;
|
|
Packit |
a4aae4 |
virtual void send_das(FILE *out, DAS &das, const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
virtual void send_dds(FILE *out, DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
bool constrained = false,
|
|
Packit |
a4aae4 |
const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
// deprecated
|
|
Packit |
a4aae4 |
virtual void functional_constraint(BaseType &var, DDS &dds,
|
|
Packit |
a4aae4 |
ConstraintEvaluator &eval, FILE *out) const;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
virtual void dataset_constraint(DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
FILE *out, bool ce_eval = true) const;
|
|
Packit |
a4aae4 |
virtual void send_data(DDS &dds, ConstraintEvaluator &eval,
|
|
Packit |
a4aae4 |
FILE *data_stream,
|
|
Packit |
a4aae4 |
const string &anc_location = "",
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
virtual void send_ddx(DDS &dds, ConstraintEvaluator &eval, FILE *out,
|
|
Packit |
a4aae4 |
bool with_mime_headers = true) const;
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#endif // _dodsfilter_h
|