Blame DODSFilter.h

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