A Discrete-Event Network Simulator
API
raw-text-config.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2009 INRIA
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Mathieu Lacage <mathieu.lacage@cutebugs.net>
19 */
20
21#include "raw-text-config.h"
22#include "attribute-iterator.h"
24#include "ns3/global-value.h"
25#include "ns3/string.h"
26#include "ns3/log.h"
27#include "ns3/config.h"
28
29#include <istream>
30#include <sstream>
31#include <algorithm>
32#include <functional>
33
34namespace ns3 {
35
36NS_LOG_COMPONENT_DEFINE ("RawTextConfig");
37
39 : m_os (0)
40{
41 NS_LOG_FUNCTION (this);
42}
44{
45 NS_LOG_FUNCTION (this);
46 if (m_os != 0)
47 {
48 m_os->close ();
49 }
50 delete m_os;
51 m_os = 0;
52}
53void
54RawTextConfigSave::SetFilename (std::string filename)
55{
56 NS_LOG_FUNCTION (this << filename);
57 m_os = new std::ofstream ();
58 m_os->open (filename.c_str (), std::ios::out);
59}
60void
62{
63 NS_LOG_FUNCTION (this);
64 class RawTextDefaultIterator : public AttributeDefaultIterator
65 {
66public:
67 RawTextDefaultIterator (std::ostream *os) {
68 m_os = os;
69 }
70 void SetSaveDeprecated (bool saveDeprecated) {
71 m_saveDeprecated = saveDeprecated;
72 }
73
74private:
75 virtual void StartVisitTypeId (std::string name) {
76 m_typeId = name;
77 }
78 virtual void DoVisitAttribute (std::string name, std::string defaultValue) {
79 NS_LOG_DEBUG ("Saving " << m_typeId << "::" << name);
80 TypeId tid = TypeId::LookupByName (m_typeId);
81 ns3::TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED;
82 for (std::size_t i = 0; i < tid.GetAttributeN (); i++)
83 {
84 struct TypeId::AttributeInformation tmp = tid.GetAttribute (i);
85 if (tmp.name == name)
86 {
87 supportLevel = tmp.supportLevel;
88 break;
89 }
90 }
91 if (supportLevel == TypeId::SupportLevel::OBSOLETE)
92 {
93 NS_LOG_WARN ("Global attribute "
94 << m_typeId << "::" << name
95 << " was not saved because it is OBSOLETE");
96 }
97 else if ((supportLevel == TypeId::SupportLevel::DEPRECATED) && (m_saveDeprecated == false))
98 {
99 NS_LOG_WARN ("Global attribute " << m_typeId << "::" << name
100 << " was not saved because it is DEPRECATED");
101 }
102 else
103 {
104 *m_os << "default " << m_typeId << "::" << name << " \"" << defaultValue << "\""
105 << std::endl;
106 }
107 }
108 std::string m_typeId;
109 std::ostream *m_os;
110 bool m_saveDeprecated;
111 };
112
113 RawTextDefaultIterator iterator = RawTextDefaultIterator (m_os);
114 iterator.SetSaveDeprecated (m_saveDeprecated);
115 iterator.Iterate ();
116}
117void
119{
120 NS_LOG_FUNCTION (this);
122 {
123 StringValue value;
124 (*i)->GetValue (value);
125 NS_LOG_LOGIC ("Saving " << (*i)->GetName ());
126 *m_os << "global " << (*i)->GetName () << " \"" << value.Get () << "\"" << std::endl;
127 }
128}
129void
131{
132 NS_LOG_FUNCTION (this);
133 class RawTextAttributeIterator : public AttributeIterator
134 {
135public:
136 RawTextAttributeIterator (std::ostream *os)
137 : m_os (os) {}
138 void
139 SetSaveDeprecated (bool saveDeprecated) {
140 m_saveDeprecated = saveDeprecated;
141 }
142
143private:
144 virtual void DoVisitAttribute (Ptr<Object> object, std::string name) {
145 StringValue str;
146
147 ns3::TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED;
148 TypeId tid = object->GetInstanceTypeId ();
149
150 for (std::size_t i = 0; i < tid.GetAttributeN (); i++)
151 {
152 struct TypeId::AttributeInformation tmp = tid.GetAttribute (i);
153 if (tmp.name == name)
154 {
155 supportLevel = tmp.supportLevel;
156 break;
157 }
158 }
159 if (supportLevel == TypeId::SupportLevel::OBSOLETE)
160 {
161 NS_LOG_WARN ("Attribute " << GetCurrentPath ()
162 << " was not saved because it is OBSOLETE");
163 }
164 else if ((supportLevel == TypeId::SupportLevel::DEPRECATED) && (m_saveDeprecated == false))
165 {
166 NS_LOG_WARN ("Attribute " << GetCurrentPath ()
167 << " was not saved because it is DEPRECATED");
168 }
169 else
170 {
171 object->GetAttribute (name, str);
172 NS_LOG_DEBUG ("Saving " << GetCurrentPath ());
173 *m_os << "value " << GetCurrentPath () << " \"" << str.Get () << "\"" << std::endl;
174 }
175 }
176 std::ostream *m_os;
177 bool m_saveDeprecated;
178 };
179
180 RawTextAttributeIterator iter = RawTextAttributeIterator (m_os);
181 iter.SetSaveDeprecated (m_saveDeprecated);
182 iter.Iterate ();
183}
184
186 : m_is (0)
187{
188 NS_LOG_FUNCTION (this);
189}
191{
192 NS_LOG_FUNCTION (this);
193 if (m_is != 0)
194 {
195 m_is->close ();
196 delete m_is;
197 m_is = 0;
198 }
199}
200void
201RawTextConfigLoad::SetFilename (std::string filename)
202{
203 NS_LOG_FUNCTION (this << filename);
204 m_is = new std::ifstream ();
205 m_is->open (filename.c_str (), std::ios::in);
206}
207std::string
208RawTextConfigLoad::Strip (std::string value)
209{
210 NS_LOG_FUNCTION (this << value);
211 std::string::size_type start = value.find ("\"");
212 std::string::size_type end = value.find ("\"", 1);
213 NS_ABORT_MSG_IF (start != 0, "Ill-formed attribute value: " << value);
214 NS_ABORT_MSG_IF (end != value.size () - 1, "Ill-formed attribute value: " << value);
215 return value.substr (start+1, end-start-1);
216}
217
218void
220{
221 NS_LOG_FUNCTION (this);
222 m_is->clear ();
223 m_is->seekg (0);
224 std::string type, name, value;
225 for (std::string line; std::getline (*m_is, line);)
226 {
227 if (!ParseLine (line, type, name, value))
228 {
229 continue;
230 }
231
232 NS_LOG_DEBUG ("type=" << type << ", name=" << name << ", value=" << value);
233 value = Strip (value);
234 if (type == "default")
235 {
236 Config::SetDefault (name, StringValue (value));
237 }
238 name.clear ();
239 type.clear ();
240 value.clear ();
241 }
242}
243void
245{
246 NS_LOG_FUNCTION (this);
247 m_is->clear ();
248 m_is->seekg (0);
249 std::string type, name, value;
250 for (std::string line; std::getline (*m_is, line);)
251 {
252 if (!ParseLine (line, type, name, value))
253 {
254 continue;
255 }
256
257 NS_LOG_DEBUG ("type=" << type << ", name=" << name << ", value=" << value);
258 value = Strip (value);
259 if (type == "global")
260 {
261 Config::SetGlobal (name, StringValue (value));
262 }
263 name.clear ();
264 type.clear ();
265 value.clear ();
266 }
267}
268void
270{
271 NS_LOG_FUNCTION (this);
272 m_is->clear ();
273 m_is->seekg (0);
274 std::string type, name, value;
275 for (std::string line; std::getline (*m_is, line);)
276 {
277 if (!ParseLine (line, type, name, value))
278 {
279 continue;
280 }
281
282 NS_LOG_DEBUG ("type=" << type << ", name=" << name << ", value=" << value);
283 value = Strip (value);
284 if (type == "value")
285 {
286 Config::Set (name, StringValue (value));
287 }
288 name.clear ();
289 type.clear ();
290 value.clear ();
291 }
292}
293
294bool
295RawTextConfigLoad::ParseLine (const std::string &line, std::string &type, std::string &name, std::string &value)
296{
297 NS_LOG_FUNCTION (this << line << type << name << value);
298
299 // check for blank line
300 {
301 std::istringstream iss (line);
302 iss >> std::ws; // remove all blanks line
303 if (!iss.good ()) // eofbit set if no non-blanks
304 {
305 return false;
306 }
307 }
308
309 if (line.front () == '#')
310 {
311 return false; // comment line
312 }
313
314 // for multiline values, append line to value if type and name not empty
315 if (type.empty () && name.empty ())
316 {
317 std::istringstream iss (line);
318 iss >> type >> name >> std::ws;
319 std::getline (iss, value); // remaining line, includes embedded spaces
320 }
321 else
322 {
323 value.append (line);
324 }
325
326 // two quotes in value signifies a completed (possibly multi-line)
327 // config-store entry, return True to signal load function to
328 // validate value (see Strip method) and set attribute
329 return std::count (value.begin (), value.end (), '"') == 2;
330}
331
332
333} // namespace ns3
Iterator to iterate on the default values of attributes of an ns3::Object.
Iterator to iterate on the values of attributes of an ns3::Object.
void SetSaveDeprecated(bool saveDeprecated)
Set if to save deprecated attributes.
Definition: file-config.cc:30
bool m_saveDeprecated
save deprecated attributes
Definition: file-config.h:61
Vector::const_iterator Iterator
Iterator type for the list of all global values.
Definition: global-value.h:80
static Iterator End(void)
The End iterator.
static Iterator Begin(void)
The Begin iterator.
virtual void Global(void)
Load or save the global values.
virtual void Default(void)
Load or save the default values.
RawTextConfigLoad()
default constructor
virtual bool ParseLine(const std::string &line, std::string &type, std::string &name, std::string &value)
Parse (potentially multi-) line configs into type, name, and values.
virtual ~RawTextConfigLoad()
destructor
std::ifstream * m_is
Config store input stream.
std::string Strip(std::string value)
Strip out attribute value.
virtual void SetFilename(std::string filename)
Set the file name.
virtual void Attributes(void)
Load or save the attributes values.
std::ofstream * m_os
Config store output stream.
virtual void Attributes(void)
Load or save the attributes values.
virtual ~RawTextConfigSave()
destructor
virtual void SetFilename(std::string filename)
Set the file name.
RawTextConfigSave()
default constructor
virtual void Default(void)
Load or save the default values.
virtual void Global(void)
Load or save the global values.
Hold variables of type string.
Definition: string.h:41
std::string Get(void) const
Definition: string.cc:31
a unique identifier for an interface.
Definition: type-id.h:59
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition: type-id.cc:829
std::size_t GetAttributeN(void) const
Get the number of attributes.
Definition: type-id.cc:1076
struct TypeId::AttributeInformation GetAttribute(std::size_t i) const
Get Attribute information by index.
Definition: type-id.cc:1083
SupportLevel
The level of support or deprecation for attributes or trace sources.
Definition: type-id.h:71
void SetGlobal(std::string name, const AttributeValue &value)
Definition: config.cc:891
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
void Set(std::string path, const AttributeValue &value)
Definition: config.cc:839
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
Every class exported by the ns3 library is enclosed in the ns3 namespace.
def start()
Definition: core.py:1853
Attribute implementation.
Definition: type-id.h:78
TypeId::SupportLevel supportLevel
Support level/deprecation.
Definition: type-id.h:94
std::string name
Attribute name.
Definition: type-id.h:80