Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/iodevices/PlainXMLFormatter.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2012-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file PlainXMLFormatter.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Michael Behrisch
17
/// @date 2012
18
///
19
// Static storage of an output device and its base (abstract) implementation
20
/****************************************************************************/
21
#include <config.h>
22
23
#include <utils/common/ToString.h>
24
#include <utils/options/OptionsCont.h>
25
#include "PlainXMLFormatter.h"
26
27
28
// ===========================================================================
29
// member method definitions
30
// ===========================================================================
31
PlainXMLFormatter::PlainXMLFormatter(const int defaultIndentation)
32
: OutputFormatter(OutputFormatterType::XML), myDefaultIndentation(defaultIndentation), myHavePendingOpener(false) {
33
}
34
35
36
bool
37
PlainXMLFormatter::writeXMLHeader(std::ostream& into, const std::string& rootElement,
38
const std::map<SumoXMLAttr, std::string>& attrs,
39
bool writeMetadata, bool includeConfig) {
40
if (myXMLStack.empty()) {
41
const OptionsCont& oc = OptionsCont::getOptions();
42
oc.writeXMLHeader(into, includeConfig);
43
openTag(into, rootElement);
44
for (std::map<SumoXMLAttr, std::string>::const_iterator it = attrs.begin(); it != attrs.end(); ++it) {
45
writeAttr(into, it->first, it->second);
46
}
47
into << ">\n";
48
if (writeMetadata) {
49
into << " <metadata created_at=\"" << StringUtils::isoTimeString() << "\" created_by=\"" << oc.getFullName() << "\">\n";
50
oc.writeConfiguration(into, true, false, false, "", false, true, " ");
51
into << " </metadata>\n";
52
}
53
myHavePendingOpener = false;
54
return true;
55
}
56
return false;
57
}
58
59
60
void
61
PlainXMLFormatter::openTag(std::ostream& into, const std::string& xmlElement) {
62
if (myHavePendingOpener) {
63
into << ">\n";
64
}
65
myHavePendingOpener = true;
66
into << std::string(4 * (myXMLStack.size() + myDefaultIndentation), ' ') << "<" << xmlElement;
67
myXMLStack.push_back(xmlElement);
68
}
69
70
71
void
72
PlainXMLFormatter::openTag(std::ostream& into, const SumoXMLTag& xmlElement) {
73
openTag(into, toString(xmlElement));
74
}
75
76
77
bool
78
PlainXMLFormatter::closeTag(std::ostream& into, const std::string& comment) {
79
if (!myXMLStack.empty()) {
80
if (myHavePendingOpener) {
81
into << "/>" << comment << "\n";
82
myHavePendingOpener = false;
83
} else {
84
const std::string indent(4 * (myXMLStack.size() + myDefaultIndentation - 1), ' ');
85
into << indent << "</" << myXMLStack.back() << ">" << comment << "\n";
86
}
87
myXMLStack.pop_back();
88
return true;
89
}
90
return false;
91
}
92
93
94
void
95
PlainXMLFormatter::writePreformattedTag(std::ostream& into, const std::string& val) {
96
if (myHavePendingOpener) {
97
into << ">\n";
98
myHavePendingOpener = false;
99
}
100
into << val;
101
}
102
103
104
void
105
PlainXMLFormatter::writePadding(std::ostream& into, const std::string& val) {
106
into << val;
107
}
108
109
110
/****************************************************************************/
111
112