libdap Updated for version 3.21.0
libdap4 is an implementation of OPeNDAP's DAP protocol.
Todo List
Member functions::GeoConstraint::reorder_data_longitude_axis (libdap::Array &a, libdap::Array::Dim_iter lon_dim)
Fix this code so that it works with latitude as the rightmost map
Member libdap::AISResources::get_resource (const string &primary)
Make this return an empty ResourceVector is no matching resources are found. Clients would not need to call has_resource() which would save some time.
Member libdap::Constructor::serialize (D4StreamMarshaller &m, DMR &dmr, bool filter=false) override
See notebook for 8/21/14
Class libdap::D4Enum
Note the hack to remove the union...
Member libdap::D4Group::transform_to_dap2 (AttrTable *parent_attr_table) override
Fix the comment.
Member libdap::D4ResponseBuilder::establish_timeout (ostream &stream) const
When the alarm handler is called, two CRLF pairs are dumped to the stream and then an Error object is sent. Replace this with code that uses the new chunking protocol to insert an error message that can be read.
Member libdap::D4ResponseBuilder::read_data_from_cache (FILE *data, DDS *fdds)
Maybe move this code into libdap as a general 'get it from disk' method. Use that code in libdapclient.
Member libdap::D4ResponseBuilder::send_data_ddx (ostream &data_stream, DDS &dds, ConstraintEvaluator &eval, const string &start, const string &boundary, bool with_mime_headers=true)
I am broken WRT the other code here for sending data and DDS responses
Member libdap::D4ResponseBuilder::send_ddx (ostream &out, DDS &dds, ConstraintEvaluator &eval, bool with_mime_headers=true)
I am broken WRT the other code here for sending data and DDS responses
Member libdap::D4RValue::value (DMR &dmr)
Could move the operation that wraps a constant in a BaseType to this method while providing other ways to access the value(s) (methods to determine if the rvalue is a constant and what DAP type it is, e.g.). This would provide an optimization for the filter evaluator which may access the values many times. We might also modify the server side functions so they could access constant values more efficiently.
Member libdap::DAPCache3::purge_file (const string &file)
This is a new feature; add to BESCache3
Member libdap::DDS::mark_all (bool state)

These methods that use the btp_stack to keep track of the path from the top of a dataset to a particular variable can be rewritten to use the parent field instead.

All the methods that use names to identify variables should have counterparts that take BaseType pointers. */ bool DDS::mark(const string &n, bool state) { unique_ptr<BaseType::btp_stack> s(new BaseType::btp_stack);

Member libdap::DODSFilter ()
Add methods to provide a way to set all of the parameters this class contains. They can currently only be set using the argc/argv command line parameters.
Class libdap::fdostream
Generalize this so that it can take a FILE * as well and then make two classes file_istream and file_ostream that can be initialized with either a file descriptor or a FILE pointer.
Class libdap::HTTPResponse
Maybe refactor so that the header parsing code is here and not in HTTPConnect?
Member libdap::HTTPResponse::HTTPResponse (std::fstream *s, int status, std::vector< std::string > *h, const std::string &temp_file)
Decide on how the temp files fit into DAP4
Member libdap::Response

Add a test to make sure that the required arguments are given.

We need to rethink the ancillary file/directory stuff. I don't think it's ever been used...

If the code that parses the MIME headers was moved from Connect and HTTPConnect to this class and its children, it would be easier to build a FileConnect class (or maybe the specifics of the connection type could be held in the Response object and HTTPConnect and the to-be-written FileConnect would not be needed).