Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/options/OptionsLoader.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-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 OptionsLoader.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date Mon, 17 Dec 2001
19
///
20
// A SAX-Handler for loading options
21
/****************************************************************************/
22
#include <config.h>
23
24
#include <algorithm>
25
#include <string>
26
#include <vector>
27
#include <xercesc/sax/HandlerBase.hpp>
28
#include <xercesc/sax/AttributeList.hpp>
29
#include <xercesc/sax/SAXParseException.hpp>
30
#include <xercesc/sax/SAXException.hpp>
31
#include <utils/common/StringUtils.h>
32
#include <utils/common/StringTokenizer.h>
33
#include <utils/common/UtilExceptions.h>
34
#include <utils/common/FileHelpers.h>
35
#include <utils/common/MsgHandler.h>
36
#include <utils/common/ToString.h>
37
#include "OptionsIO.h"
38
#include "OptionsCont.h"
39
#include "OptionsLoader.h"
40
41
42
// ===========================================================================
43
// method definitions
44
// ===========================================================================
45
46
OptionsLoader::OptionsLoader(OptionsCont& customOptions, const bool rootOnly) :
47
myRootOnly(rootOnly),
48
myOptions(customOptions),
49
myItem() {
50
}
51
52
53
OptionsLoader::~OptionsLoader() {}
54
55
56
void OptionsLoader::startElement(const XMLCh* const name, XERCES_CPP_NAMESPACE::AttributeList& attributes) {
57
myFoundValue = false;
58
myItem = StringUtils::transcode(name);
59
if (!myRootOnly) {
60
for (int i = 0; i < (int)attributes.getLength(); i++) {
61
const std::string& key = StringUtils::transcode(attributes.getName(i));
62
const std::string& value = StringUtils::transcode(attributes.getValue(i));
63
if (key == "value" || key == "v") {
64
setValue(myItem, value);
65
myFoundValue = true;
66
} else if (key != "xmlns:xsi"
67
&& key != "xsi:noNamespaceSchemaLocation"
68
&& key != "synonymes"
69
&& key != "deprecated"
70
&& key != "type"
71
&& key != "help"
72
// parsing a network file as single argument
73
&& (key != "version" && myItem != "net")) {
74
WRITE_WARNINGF(TL("Ignoring attribute '%' for option '%'"), key, myItem);
75
}
76
}
77
myValue = "";
78
}
79
}
80
81
82
void OptionsLoader::setValue(const std::string& key, const std::string& value) {
83
if (value.length() > 0) {
84
// try to add value in option container
85
try {
86
if (!setSecure(myOptions, key, value)) {
87
WRITE_ERRORF(TL("Could not set option '%' (probably defined twice)."), key);
88
myError = true;
89
}
90
} catch (ProcessError& e) {
91
WRITE_ERROR(e.what());
92
myError = true;
93
}
94
}
95
}
96
97
98
void OptionsLoader::characters(const XMLCh* const chars, const XERCES3_SIZE_t length) {
99
myValue = myValue + StringUtils::transcode(chars, (int) length);
100
}
101
102
103
bool
104
OptionsLoader::setSecure(OptionsCont& options, const std::string& name, const std::string& value) const {
105
if (options.isWriteable(name)) {
106
options.set(name, value);
107
return true;
108
}
109
return false;
110
}
111
112
113
void
114
OptionsLoader::endElement(const XMLCh* const /*name*/) {
115
if (myItem.length() == 0 || myValue.length() == 0) {
116
if (!myFoundValue) {
117
WRITE_ERRORF(TL("Could not set option '%' because attribute 'value' is missing."), myItem);
118
}
119
return;
120
}
121
if (myValue.find_first_not_of("\n\t \a") == std::string::npos) {
122
return;
123
}
124
setValue(myItem, myValue);
125
myItem = "";
126
myValue = "";
127
}
128
129
130
void
131
OptionsLoader::warning(const XERCES_CPP_NAMESPACE::SAXParseException& exception) {
132
WRITE_WARNING(StringUtils::transcode(exception.getMessage()));
133
WRITE_WARNING(" (At line/column " \
134
+ toString(exception.getLineNumber() + 1) + '/' \
135
+ toString(exception.getColumnNumber()) + ").");
136
myError = true;
137
}
138
139
140
void
141
OptionsLoader::error(const XERCES_CPP_NAMESPACE::SAXParseException& exception) {
142
WRITE_ERROR(StringUtils::transcode(exception.getMessage()));
143
WRITE_ERROR(" (At line/column "
144
+ toString(exception.getLineNumber() + 1) + '/'
145
+ toString(exception.getColumnNumber()) + ").");
146
myError = true;
147
}
148
149
150
void
151
OptionsLoader::fatalError(const XERCES_CPP_NAMESPACE::SAXParseException& exception) {
152
WRITE_ERROR(StringUtils::transcode(exception.getMessage()));
153
WRITE_ERROR(" (At line/column "
154
+ toString(exception.getLineNumber() + 1) + '/'
155
+ toString(exception.getColumnNumber()) + ").");
156
myError = true;
157
}
158
159
160
bool
161
OptionsLoader::errorOccurred() const {
162
return myError;
163
}
164
165
/****************************************************************************/
166
167