7071f941cd
The command line, like a lot of other code, used the escape/unescape code in SafeConfigNode. For historic reasons, that code used ! as escape character, which is awkward for the command line, because that is a special character. Instead of further overloading the SafeConfigNode, this patch moves the escape/unescape code into its own utility class. This is the cleaner approach anyway. It also adds unit testing for the code. All other users of the old code are updated. Care must be taken here to not accidentally switch to a different escape mechanism, because the mechanism must remain compatible with the old implementation.
83 lines
2.3 KiB
C++
83 lines
2.3 KiB
C++
/*
|
|
* Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
|
|
*
|
|
* 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) version 3.
|
|
*
|
|
* 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
|
|
*/
|
|
|
|
#include <syncevo/SafeConfigNode.h>
|
|
#include <syncevo/SyncContext.h>
|
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
#include <syncevo/declarations.h>
|
|
SE_BEGIN_CXX
|
|
|
|
SafeConfigNode::SafeConfigNode(const boost::shared_ptr<ConfigNode> &node) :
|
|
m_node(node),
|
|
m_readOnlyNode(node),
|
|
m_strictMode(true)
|
|
{
|
|
}
|
|
|
|
SafeConfigNode::SafeConfigNode(const boost::shared_ptr<const ConfigNode> &node) :
|
|
m_readOnlyNode(node),
|
|
m_strictMode(true)
|
|
{
|
|
}
|
|
|
|
string SafeConfigNode::readProperty(const string &property) const
|
|
{
|
|
return unescape(m_readOnlyNode->readProperty(escape(property)));
|
|
}
|
|
|
|
void SafeConfigNode::setProperty(const string &property,
|
|
const string &value,
|
|
const string &comment,
|
|
const string *defValue)
|
|
{
|
|
m_node->setProperty(escape(property),
|
|
escape(value),
|
|
comment,
|
|
defValue);
|
|
}
|
|
|
|
void SafeConfigNode::readProperties(ConfigProps &props) const
|
|
{
|
|
ConfigProps original;
|
|
m_readOnlyNode->readProperties(original);
|
|
|
|
BOOST_FOREACH(const StringPair &prop, original) {
|
|
string key = unescape(prop.first);
|
|
string value = unescape(prop.second);
|
|
|
|
props[key] = value;
|
|
}
|
|
}
|
|
|
|
void SafeConfigNode::removeProperty(const string &property)
|
|
{
|
|
m_node->removeProperty(escape(property));
|
|
}
|
|
|
|
void SafeConfigNode::flush()
|
|
{
|
|
if (!m_node.get()) {
|
|
SyncContext::throwError(getName() + ": read-only, flushing not allowed");
|
|
}
|
|
m_node->flush();
|
|
}
|
|
|
|
SE_END_CXX
|