libdap Updated for version 3.18.1
DDS.h
1// -*- mode: c++; c-basic-offset:4 -*-
2
3// This file is part of libdap, A C++ implementation of the OPeNDAP Data
4// Access Protocol.
5
6// Copyright (c) 2002,2003 OPeNDAP, Inc.
7// Author: James Gallagher <jgallagher@opendap.org>
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or (at your option) any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
24
25// (c) COPYRIGHT URI/MIT 1994-1999
26// Please read the full copyright statement in the file COPYRIGHT_URI.
27//
28// Authors:
29// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
30
31// Provide access to the DDS. This class is used to parse DDS text files, to
32// produce a printed representation of the in-memory variable table, and to
33// update the table on a per-variable basis.
34//
35// jhrg 9/8/94
36
37#ifndef _dds_h
38#define _dds_h 1
39
40#include <cstdio>
41#include <iostream>
42#include <string>
43#include <vector>
44
45#ifndef _basetype_h
46#include "BaseType.h"
47#endif
48
49#ifndef _constructor_h
50#include "Constructor.h"
51#endif
52
53#ifndef base_type_factory_h
54#include "BaseTypeFactory.h"
55#endif
56
57#ifndef _das_h
58#include "DAS.h"
59#endif
60
61#ifndef A_DapObj_h
62#include "DapObj.h"
63#endif
64
65#ifndef KEYWORDS_H_
66#include "Keywords2.h"
67#endif
68
69#ifndef XMLWRITER_H_
70#include "XMLWriter.h"
71#endif
72
73using std::cout;
74
75namespace libdap
76{
77
180class DDS : public DapObj
181{
182private:
183 BaseTypeFactory *d_factory;
184
185 string d_name; // The dataset d_name
186 string d_filename; // File d_name (or other OS identifier) for
187 string d_container_name; // d_name of container structure
188 Structure *d_container; // current container for container d_name
189 // dataset or part of dataset.
190
191 int d_dap_major; // The protocol major version number
192 int d_dap_minor; // ... and minor version number
193 string d_dap_version; // String version of the protocol
194 string d_request_xml_base;
195 string d_namespace;
196
197 AttrTable d_attr; // Global attributes.
198
199 vector<BaseType *> vars; // Variables at the top level
200
201 int d_timeout; // alarm time in seconds. If greater than
202 // zero, raise the alarm signal if more than
203 // d_timeout seconds are spent reading data.
204 Keywords d_keywords; // Holds keywords parsed from the CE
205
206 long d_max_response_size; // In bytes...
207
208 friend class DDSTest;
209
210protected:
211 void duplicate(const DDS &dds);
212 BaseType *leaf_match(const string &name, BaseType::btp_stack *s = 0);
213 BaseType *exact_match(const string &name, BaseType::btp_stack *s = 0);
214
215public:
216 typedef std::vector<BaseType *>::const_iterator Vars_citer ;
217 typedef std::vector<BaseType *>::iterator Vars_iter ;
218 typedef std::vector<BaseType *>::reverse_iterator Vars_riter ;
219
220 DDS(BaseTypeFactory *factory, const string &name = "");
221 DDS(BaseTypeFactory *factory, const string &name, const string &version);
222 DDS(const DDS &dds);
223
224 virtual ~DDS();
225
226 DDS & operator=(const DDS &rhs);
227
228 virtual void transfer_attributes(DAS *das);
229
230 string get_dataset_name() const;
231 void set_dataset_name(const string &n);
232
238 {
239 return d_factory;
240 }
241
249 {
250 BaseTypeFactory *t = d_factory;
251 d_factory = factory;
252 return t;
253 }
254
255 virtual AttrTable &get_attr_table();
256
257 string filename() const;
258 void filename(const string &fn);
259
261 int get_dap_major() const { return d_dap_major; }
263 int get_dap_minor() const { return d_dap_minor; }
264
265 void set_dap_version(const string &version_string = "2.0");
266 string get_dap_version() const { return d_dap_version; }
267 string get_dmr_version() const { return "1.0"; }
268
270 void set_dap_major(int p);
272 void set_dap_minor(int p);
274 void set_dap_version(double d);
275
276 Keywords &get_keywords() { return d_keywords; }
277
279 string get_request_xml_base() const { return d_request_xml_base; }
280
282 void set_request_xml_base(const string &xb) { d_request_xml_base = xb; }
283
285 string get_namespace() const { return d_namespace; }
286
288 void set_namespace(const string &ns) { d_namespace = ns; }
289
291 long get_response_limit() { return d_max_response_size; }
292
296 void set_response_limit(long size) { d_max_response_size = size * 1024; }
297
299 int get_request_size(bool constrained);
300
301 string container_name() ;
302 void container_name( const string &cn ) ;
304
305 void add_var(BaseType *bt);
306 void add_var_nocopy(BaseType *bt);
307
309 void del_var(const string &n);
310
311 BaseType *var(const string &n, BaseType::btp_stack &s);
312 BaseType *var(const string &n, BaseType::btp_stack *s = 0);
313 int num_var();
314
316 Vars_iter var_begin();
317#if 0
319 Vars_citer var_cbegin() const { return vars.cbegin(); }
320#endif
322 Vars_riter var_rbegin();
324 Vars_iter var_end();
325#if 0
327 Vars_citer var_cend() const { return vars.cend(); }
328#endif
330 Vars_riter var_rend();
332 Vars_iter get_vars_iter(int i);
334 BaseType *get_var_index(int i);
336 void insert_var(Vars_iter i, BaseType *ptr);
337 void insert_var_nocopy(Vars_iter i, BaseType *ptr);
339 void del_var(Vars_iter i);
341 void del_var(Vars_iter i1, Vars_iter i2);
342
348 void timeout_on();
349 void timeout_off();
350 void set_timeout(int t);
351 int get_timeout();
353
354 // These parse the DAP2 curly-brace document and make a C++ object.
355 void parse(string fname);
356 void parse(int fd);
357 void parse(FILE *in = stdin);
358
359 // These print the Binary object in either the curly-brace or XML reps
360 void print(FILE *out);
361 void print_constrained(FILE *out);
362 void print_xml(FILE *out, bool constrained, const string &blob = "");
363
364 // Same as above, but using C++ i/o streams
365 void print(ostream &out);
366 void print_constrained(ostream &out);
367 void print_xml(ostream &out, bool constrained, const string &blob = "");
368
369 // Print the XML using libxml2; the other print_xml methods use this impl.
370 void print_xml_writer(ostream &out, bool constrained, const string &blob = "");
371
372 // Print the DAP4 DMR 'object'
373 void print_dmr(ostream &out, bool constrained);
374
375 void print_das(ostream &out);
376
377 void mark_all(bool state);
378 bool mark(const string &name, bool state);
379 bool check_semantics(bool all = false);
380
382
383 virtual void dump(ostream &strm) const ;
384};
385
386} // namespace libdap
387
388#endif // _dds_h
Contains the attributes for a dataset.
Definition: AttrTable.h:143
The basic data type for the DODS DAP types.
Definition: BaseType.h:118
Hold attribute data for a DAP2 dataset.
Definition: DAS.h:122
void set_dataset_name(const string &n)
Definition: DDS.cc:364
void set_dap_major(int p)
Definition: DDS.cc:405
void mark_all(bool state)
Definition: DDS.cc:1500
void print_dmr(ostream &out, bool constrained)
Definition: DDS.cc:1318
Vars_riter var_rend()
Return a reverse iterator.
Definition: DDS.cc:823
void add_var_nocopy(BaseType *bt)
Adds the variable to the DDS.
Definition: DDS.cc:614
bool check_semantics(bool all=false)
Check the semantics of each of the variables represented in the DDS.
Definition: DDS.cc:1407
void set_namespace(const string &ns)
Set the namespace for this DDS/DDX object/response.
Definition: DDS.h:288
string filename() const
Definition: DDS.cc:388
virtual AttrTable & get_attr_table()
Definition: DDS.cc:373
void set_request_xml_base(const string &xb)
Definition: DDS.h:282
void set_response_limit(long size)
Definition: DDS.h:296
virtual void transfer_attributes(DAS *das)
Definition: DDS.cc:287
void set_dap_minor(int p)
Definition: DDS.cc:424
Vars_riter var_rbegin()
Return a reverse iterator.
Definition: DDS.cc:811
string get_namespace() const
Get the namespace associated with the DDS - likely set only by DDX responses.
Definition: DDS.h:285
int num_var()
Returns the number of variables in the DDS.
Definition: DDS.cc:879
Vars_iter get_vars_iter(int i)
Get an iterator.
Definition: DDS.cc:832
void print(FILE *out)
Print the entire DDS to the specified file.
Definition: DDS.cc:1029
BaseType * get_var_index(int i)
Get a variable.
Definition: DDS.cc:841
int get_request_size(bool constrained)
Get the estimated response size.
Definition: DDS.cc:566
BaseTypeFactory * set_factory(BaseTypeFactory *factory)
Definition: DDS.h:248
string get_dataset_name() const
Definition: DDS.cc:357
void del_var(const string &n)
Removes a variable from the DDS.
Definition: DDS.cc:642
void parse(string fname)
Parse a DDS from a file with the given d_name.
Definition: DDS.cc:948
BaseType * var(const string &n, BaseType::btp_stack &s)
Definition: DDS.cc:698
void print_xml(FILE *out, bool constrained, const string &blob="")
Definition: DDS.cc:1130
void insert_var(Vars_iter i, BaseType *ptr)
Insert a variable before the referenced element.
Definition: DDS.cc:851
bool mark(const string &name, bool state)
Mark the send_p flag of the named variable to state.
Definition: DDS.cc:1453
int get_dap_minor() const
Get the DAP minor version as sent by the client.
Definition: DDS.h:263
DDS(BaseTypeFactory *factory, const string &name="")
Definition: DDS.cc:205
void tag_nested_sequences()
Traverse DDS, set Sequence leaf nodes.
Definition: DDS.cc:936
BaseTypeFactory * get_factory() const
Definition: DDS.h:237
void print_constrained(FILE *out)
Print a constrained DDS to the specified file.
Definition: DDS.cc:1084
Vars_iter var_begin()
Return an iterator to the first variable.
Definition: DDS.cc:805
string container_name()
Definition: DDS.cc:512
void insert_var_nocopy(Vars_iter i, BaseType *ptr)
Definition: DDS.cc:868
string get_request_xml_base() const
Get the URL that will return this DDS/DDX/DataThing.
Definition: DDS.h:279
int get_dap_major() const
Get the DAP major version as sent by the client.
Definition: DDS.h:261
Vars_iter var_end()
Return an iterator.
Definition: DDS.cc:817
void set_dap_version(const string &version_string="2.0")
Definition: DDS.cc:441
Structure * container()
Definition: DDS.cc:548
void add_var(BaseType *bt)
Adds a copy of the variable to the DDS. Using the ptr_duplicate() method, perform a deep copy on the ...
Definition: DDS.cc:587
void print_xml_writer(ostream &out, bool constrained, const string &blob="")
Definition: DDS.cc:1185
long get_response_limit()
Get the maximum response size, in KB. Zero indicates no limit.
Definition: DDS.h:291
void print_das(ostream &out)
Definition: DDS.cc:1061
virtual void dump(ostream &strm) const
dumps information about this object
Definition: DDS.cc:1514
libdap base object for common functionality of libdap objects
Definition: DapObj.h:56
Holds a structure (aggregate) type.
Definition: Structure.h:84