-
Notifications
You must be signed in to change notification settings - Fork 4
/
D4Group.cc
130 lines (101 loc) · 3.1 KB
/
D4Group.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* D4Group.cc
*
* Created on: Sep 27, 2012
* Author: jimg
*/
#include "D4Group.h"
#include "BaseType.h"
namespace libdap {
/** The D4Group constructor requires only the name of the variable
to be created. The name may be omitted, which will create a
nameless variable. This may be adequate for some applications.
@param n A string containing the name of the variable.
*/
D4Group::D4Group(const string &n) : Constructor(n, dods_group_c, /*is_dap4*/true)
{}
/** The D4Group server-side constructor requires the name of the variable
to be created and the dataset name from which this variable is being
created. Used on server-side handlers.
@param n A string containing the name of the variable.
@param d A string containing the name of the dataset.
*/
D4Group::D4Group(const string &n, const string &d)
: Constructor(n, d, dods_group_c, /*is_dap4*/true)
{}
/** The D4Group copy constructor. */
D4Group::D4Group(const D4Group &rhs) : Constructor(rhs)
{
m_duplicate(rhs);
}
static void enum_del(D4EnumDef *ed)
{
delete ed;
}
D4Group::~D4Group()
{
for_each(d_enums.begin(), d_enums.end(), enum_del);
}
BaseType *
D4Group::ptr_duplicate()
{
return new D4Group(*this);
}
D4Group &
D4Group::operator=(const D4Group &rhs)
{
if (this == &rhs)
return *this;
dynamic_cast<Constructor &>(*this) = rhs; // run Constructor=
m_duplicate(rhs);
return *this;
}
void
D4Group::add_enumeration_nocopy(D4EnumDef *enum_def)
{
d_enums.push_back(enum_def);
}
class PrintVariable : public unary_function<BaseType *, void>
{
XMLWriter &d_xml;
bool d_constrained;
public:
PrintVariable(XMLWriter &x, bool c) : d_xml(x), d_constrained(c) {}
void operator()(BaseType *btp)
{
btp->print_xml_writer(d_xml, d_constrained);
}
};
class PrintEnum : public unary_function<D4EnumDef *, void>
{
XMLWriter &d_xml;
public:
PrintEnum(XMLWriter &x) : d_xml(x){}
void operator()(D4EnumDef *e)
{
e->print_xml_writer(d_xml);
}
};
void
D4Group::print_xml_writer(XMLWriter &xml, bool constrained)
{
if (constrained && !send_p())
return;
if (xmlTextWriterStartElement(xml.get_writer(), (const xmlChar*)type_name().c_str()) < 0)
throw InternalErr(__FILE__, __LINE__, "Could not write " + type_name() + " element");
if (!name().empty())
if (xmlTextWriterWriteAttribute(xml.get_writer(), (const xmlChar*) "name", (const xmlChar*)name().c_str()) < 0)
throw InternalErr(__FILE__, __LINE__, "Could not write attribute for name");
// If the Group has Enumeration definitions
if (d_enums.size() > 0)
for_each(d_enums.begin(), d_enums.end(), PrintEnum(xml));
// If it has attributes
if (get_attr_table().get_size() > 0)
get_attr_table().print_xml_writer(xml);
// If it has variables
if (var_begin() != var_end())
for_each(var_begin(), var_end(), PrintVariable(xml, constrained));
if (xmlTextWriterEndElement(xml.get_writer()) < 0)
throw InternalErr(__FILE__, __LINE__, "Could not end " + type_name() + " element");
}
} /* namespace libdap */