forked from OPENDAP/bes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BESHTMLInfo.cc
265 lines (243 loc) · 7.97 KB
/
BESHTMLInfo.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
// BESHTMLInfo.cc
// This file is part of bes, A C++ back-end server implementation framework
// for the OPeNDAP Data Access Protocol.
// Copyright (c) 2004-2009 University Corporation for Atmospheric Research
// Author: Patrick West <[email protected]> and Jose Garcia <[email protected]>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
// You can contact University Corporation for Atmospheric Research at
// 3080 Center Green Drive, Boulder, CO 80301
// (c) COPYRIGHT University Corporation for Atmospheric Research 2004-2005
// Please read the full copyright statement in the file COPYRIGHT_UCAR.
//
// Authors:
// pwest Patrick West <[email protected]>
// jgarcia Jose Garcia <[email protected]>
#include <sstream>
#include <iostream>
#include <map>
using std::ostringstream;
using std::endl;
using std::map;
using std::string;
using std::ostream;
#include "BESHTMLInfo.h"
#include "BESUtil.h"
/** @brief constructs an html formatted information response object.
*
* @see BESInfo
* @see BESResponseObject
*/
BESHTMLInfo::BESHTMLInfo() :
BESInfo(), _header(false), _do_indent(true)
{
}
/** @brief constructs a basic text information response object.
*
* Uses the default specified key in the bes configuration file to
* determine whether the information should be buffered or not.
*
* @see BESInfo
* @see BESResponseObject
*/
BESHTMLInfo::BESHTMLInfo(const string &key, ostream *strm, bool strm_owned) :
BESInfo(key, strm, strm_owned), _header(false), _do_indent(true)
{
}
BESHTMLInfo::~BESHTMLInfo()
{
}
/** @brief begin the informational response
*
* Because this is text informational object, no begin tags are needed
*
* @param response_name name of the response this information represents
* @param dhi information about the request and response
*/
void BESHTMLInfo::begin_response(const string &response_name, BESDataHandlerInterface &dhi)
{
BESInfo::begin_response(response_name, dhi);
add_data("<HTML>\n");
_indent += " ";
add_data("<HEAD>\n");
_indent += " ";
add_data((string) "<TITLE>" + response_name + "</TITLE>\n");
if (_indent.length() >= 4) _indent = _indent.substr(0, _indent.length() - 4);
add_data("</HEAD>\n");
add_data("<BODY>\n");
_indent += " ";
}
/** @brief end the response
*
* Add the terminating tags for the response and for the response name. If
* there are still tags that have not been closed then an exception is
* thrown.
*
*/
void BESHTMLInfo::end_response()
{
if (_indent.length() >= 4) _indent = _indent.substr(0, _indent.length() - 4);
add_data("</BODY>\n");
if (_indent.length() >= 4) _indent = _indent.substr(0, _indent.length() - 4);
add_data("</HTML>\n");
}
/** @brief add tagged information to the inforamtional response
*
* @param tag_name name of the tag to be added to the response
* @param tag_data information describing the tag
* @param attrs map of attributes to add to the tag
*/
void BESHTMLInfo::add_tag(const string &tag_name, const string &tag_data, map<string, string> *attrs)
{
string to_add = tag_name + ": " + tag_data + "<BR />\n";
add_data(to_add);
if (attrs) {
map<string, string>::const_iterator i = attrs->begin();
map<string, string>::const_iterator e = attrs->end();
for (; i != e; i++) {
string name = (*i).first;
string val = (*i).second;
BESInfo::add_data(_indent + " " + name + ": " + val + "<BR />\n");
}
}
}
/** @brief begin a tagged part of the information, information to follow
*
* @param tag_name name of the tag to begin
* @param attrs map of attributes to begin the tag with
*/
void BESHTMLInfo::begin_tag(const string &tag_name, map<string, string> *attrs)
{
BESInfo::begin_tag(tag_name);
string to_add = tag_name + "<BR />\n";
add_data(to_add);
_indent += " ";
if (attrs) {
map<string, string>::const_iterator i = attrs->begin();
map<string, string>::const_iterator e = attrs->end();
for (; i != e; i++) {
string name = (*i).first;
string val = (*i).second;
BESInfo::add_data(_indent + name + ": " + val + "<BR />\n");
}
}
}
/** @brief end a tagged part of the informational response
*
* If the named tag is not the current tag then an error is thrown.
*
* @param tag_name name of the tag to end
*/
void BESHTMLInfo::end_tag(const string &tag_name)
{
BESInfo::end_tag(tag_name);
if (_indent.length() >= 4) _indent = _indent.substr(0, _indent.length() - 4);
}
/** @brief add a space to the informational response
*
* @param num_spaces the number of spaces to add to the information
*/
void BESHTMLInfo::add_space(unsigned long num_spaces)
{
string to_add;
for (unsigned long i = 0; i < num_spaces; i++) {
to_add += " ";
}
_do_indent = false;
add_data(to_add);
}
/** @brief add a line break to the information
*
* @param num_breaks the number of line breaks to add to the information
*/
void BESHTMLInfo::add_break(unsigned long num_breaks)
{
string to_add;
for (unsigned long i = 0; i < num_breaks; i++) {
to_add += "<BR />";
}
to_add += "\n";
_do_indent = false;
add_data(to_add);
}
/** @brief add data to this informational object.
*
* If buffering is not set then the information is output directly to the
* output stream.
*
* Formatting is up to the user
*
* @param s information to be added to this response object
*/
void BESHTMLInfo::add_data(const string &s)
{
if (!_header && !_buffered) {
BESUtil::set_mime_html(*_strm);
_header = true;
}
if (_do_indent)
BESInfo::add_data(_indent + s);
else
BESInfo::add_data(s);
_do_indent = true;
}
/** @brief add data from a file to the informational object
*
* This method simply adds a .HTML to the end of the key and passes the
* request on up to the BESInfo parent class.
*
* @param key Key from the initialization file specifying the file to be
* @param name A description of what is the information being loaded
*/
void BESHTMLInfo::add_data_from_file(const string &key, const string &name)
{
string newkey = key + ".HTML";
BESInfo::add_data_from_file(newkey, name);
}
/** @brief transmit the text information as text
*
* use the send_html method on the transmitter to transmit the html
* formatted information back to the client
*
* @param transmitter The type of transmitter to use to transmit the info
* @param dhi information to help with the transmission
*/
void BESHTMLInfo::transmit(BESTransmitter *transmitter, BESDataHandlerInterface &dhi)
{
transmitter->send_html(*this, dhi);
}
/** @brief dumps information about this object
*
* Displays the pointer value of this instance along with values of private
* data members.
*
* @param strm C++ i/o stream to dump the information to
*/
void BESHTMLInfo::dump(ostream &strm) const
{
strm << BESIndent::LMarg << "BESHTMLInfo::dump - (" << (void *) this << ")" << endl;
BESIndent::Indent();
strm << BESIndent::LMarg << "has header been added? " << _header << endl;
strm << BESIndent::LMarg << "indentation \"" << _indent << "\"" << endl;
strm << BESIndent::LMarg << "do indent? " << _do_indent << endl;
BESInfo::dump(strm);
BESIndent::UnIndent();
}
BESInfo *
BESHTMLInfo::BuildHTMLInfo(const string &/*info_type*/)
{
return new BESHTMLInfo();
}