libdap++
Updated for version 3.8.2
|
00001 // -*- mode: c++; c-basic-offset:4 -*- 00002 00003 // This file is part of libdap, A C++ implementation of the OPeNDAP Data 00004 // Access Protocol. 00005 00006 // Copyright (c) 2002,2003 OPeNDAP, Inc. 00007 // Author: James Gallagher <jgallagher@opendap.org> 00008 // 00009 // This library is free software; you can redistribute it and/or 00010 // modify it under the terms of the GNU Lesser General Public 00011 // License as published by the Free Software Foundation; either 00012 // version 2.1 of the License, or (at your option) any later version. 00013 // 00014 // This library is distributed in the hope that it will be useful, 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 // Lesser General Public License for more details. 00018 // 00019 // You should have received a copy of the GNU Lesser General Public 00020 // License along with this library; if not, write to the Free Software 00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 // 00023 // You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112. 00024 00025 // (c) COPYRIGHT URI/MIT 1994-1999 00026 // Please read the full copyright statement in the file COPYRIGHT_URI. 00027 // 00028 // Authors: 00029 // jhrg,jimg James Gallagher <jgallagher@gso.uri.edu> 00030 00031 // Provide access to the DDS. This class is used to parse DDS text files, to 00032 // produce a printed representation of the in-memory variable table, and to 00033 // update the table on a per-variable basis. 00034 // 00035 // jhrg 9/8/94 00036 00037 #ifndef _dds_h 00038 #define _dds_h 1 00039 00040 #include <cstdio> 00041 #include <iostream> 00042 #include <string> 00043 #include <vector> 00044 00045 #ifndef _basetype_h 00046 #include "BaseType.h" 00047 #endif 00048 00049 #ifndef _constructor_h 00050 #include "Constructor.h" 00051 #endif 00052 00053 #ifndef base_type_factory_h 00054 #include "BaseTypeFactory.h" 00055 #endif 00056 00057 #ifndef _das_h 00058 #include "DAS.h" 00059 #endif 00060 00061 #ifndef A_DapObj_h 00062 #include "DapObj.h" 00063 #endif 00064 00065 #ifndef KEYWORDS_H_ 00066 #include "Keywords2.h" 00067 #endif 00068 00069 #ifndef XMLWRITER_H_ 00070 #include "XMLWriter.h" 00071 #endif 00072 00073 using std::cout; 00074 00075 #define FILE_METHODS 1 00076 00077 namespace libdap 00078 { 00079 00182 class DDS : public DapObj 00183 { 00184 private: 00185 BaseTypeFactory *d_factory; 00186 00187 string name; // The dataset name 00188 string d_filename; // File name (or other OS identifier) for 00189 string d_container_name; // name of container structure 00190 Structure *d_container; // current container for container name 00191 // dataset or part of dataset. 00192 00193 int d_dap_major; // The protocol major version number 00194 int d_dap_minor; // ... and minor version number 00195 string d_dap_version; // String version of the protocol 00196 string d_request_xml_base; 00197 00198 AttrTable d_attr; // Global attributes. 00199 00200 vector<BaseType *> vars; // Variables at the top level 00201 00202 // BaseType *find_hdf4_dimension_attribute_home(AttrTable::entry *source); 00203 00204 int d_timeout; // alarm time in seconds. If greater than 00205 // zero, raise the alarm signal if more than 00206 // d_timeout seconds are spent reading data. 00207 Keywords d_keywords; // Holds keywords parsed from the CE 00208 00209 long d_max_response_size; // In bytes 00210 00211 friend class DDSTest; 00212 00213 protected: 00214 void duplicate(const DDS &dds); 00215 BaseType *leaf_match(const string &name, BaseType::btp_stack *s = 0); 00216 BaseType *exact_match(const string &name, BaseType::btp_stack *s = 0); 00217 00218 public: 00219 typedef std::vector<BaseType *>::const_iterator Vars_citer ; 00220 typedef std::vector<BaseType *>::iterator Vars_iter ; 00221 typedef std::vector<BaseType *>::reverse_iterator Vars_riter ; 00222 00223 DDS(BaseTypeFactory *factory, const string &n = ""); 00224 DDS(const DDS &dds); 00225 00226 virtual ~DDS(); 00227 00228 DDS & operator=(const DDS &rhs); 00229 00230 virtual void transfer_attributes(DAS *das); 00231 00232 string get_dataset_name() const; 00233 void set_dataset_name(const string &n); 00234 00239 BaseTypeFactory *get_factory() const 00240 { 00241 return d_factory; 00242 } 00243 00250 BaseTypeFactory *set_factory(BaseTypeFactory *factory) 00251 { 00252 BaseTypeFactory *t = d_factory; 00253 d_factory = factory; 00254 return t; 00255 } 00256 00257 virtual AttrTable &get_attr_table(); 00258 00259 string filename(); 00260 void filename(const string &fn); 00261 00263 int get_dap_major() const { return d_dap_major; } 00265 int get_dap_minor() const { return d_dap_minor; } 00266 00268 void set_dap_major(int p); 00270 void set_dap_minor(int p); 00271 00272 void set_dap_version(const string &version_string); 00273 void set_dap_version(double d); 00274 00275 string get_dap_version() const { return d_dap_version; } 00276 00277 Keywords &get_keywords() { return d_keywords; } 00278 00280 string get_request_xml_base() const { return d_request_xml_base; } 00281 00283 void set_request_xml_base(const string &xb) { d_request_xml_base = xb; } 00284 00286 long get_response_limit() { return d_max_response_size; } 00287 00291 void set_response_limit(long size) { d_max_response_size = size * 1024; } 00292 00294 int get_request_size(bool constrained); 00295 00296 string container_name() ; 00297 void container_name( const string &cn ) ; 00298 Structure *container() ; 00299 00300 void add_var(BaseType *bt); 00301 void add_var_nocopy(BaseType *bt); 00302 00304 void del_var(const string &n); 00305 00306 BaseType *var(const string &n, BaseType::btp_stack &s); 00307 BaseType *var(const string &n, BaseType::btp_stack *s = 0); 00308 int num_var(); 00309 00311 Vars_iter var_begin(); 00313 Vars_riter var_rbegin(); 00315 Vars_iter var_end(); 00317 Vars_riter var_rend(); 00319 Vars_iter get_vars_iter(int i); 00321 BaseType *get_var_index(int i); 00323 void insert_var(Vars_iter i, BaseType *ptr); 00324 void insert_var_nocopy(Vars_iter i, BaseType *ptr); 00326 void del_var(Vars_iter i); 00328 void del_var(Vars_iter i1, Vars_iter i2); 00329 00330 void timeout_on(); 00331 void timeout_off(); 00332 void set_timeout(int t); 00333 int get_timeout(); 00334 00335 void parse(string fname); 00336 void parse(int fd); 00337 void parse(FILE *in = stdin); 00338 #if FILE_METHODS 00339 void print(FILE *out); 00340 void print_constrained(FILE *out); 00341 void print_xml(FILE *out, bool constrained, const string &blob = ""); 00342 #endif 00343 void print(ostream &out); 00344 void print_constrained(ostream &out); 00345 void print_xml(ostream &out, bool constrained, const string &blob = ""); 00346 00347 void print_xml_writer(ostream &out, bool constrained, const string &blob = ""); 00348 00349 void mark_all(bool state); 00350 bool mark(const string &name, bool state); 00351 bool check_semantics(bool all = false); 00352 00353 void tag_nested_sequences(); 00354 00355 virtual void dump(ostream &strm) const ; 00356 }; 00357 00358 } // namespace libdap 00359 00360 #endif // _dds_h