syncevolution/src/syncevo/FilterConfigNode.h
Patrick Ohly 9b35062bb9 ConfigNode: use map with case-insensitive keys for properties
The case of property names does not matter. A map where the key
is case-insensitive is thus a better data structure for storing
a set of property key/value pairs.

Such a type was already used by FilterConfigNode. This patch
cleans up the config nodes so that all of them use the new ConfigProps
type. The previous typedefs inside ConfigNode and FilterConfigNode are
preserved to keep old source code working without changing it.

The intention is to use the result of readProperties() directly as
parameter for setConfigFilter().
2009-11-25 16:57:51 +01:00

89 lines
3.2 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
*/
#ifndef INCL_EVOLUTION_FILTER_CONFIG_NODE
# define INCL_EVOLUTION_FILTER_CONFIG_NODE
#include <syncevo/ConfigNode.h>
#include <boost/shared_ptr.hpp>
#include <boost/algorithm/string/case_conv.hpp>
#include <boost/algorithm/string.hpp>
#include <map>
#include <utility>
#include <vector>
#include <string>
#include <syncevo/declarations.h>
SE_BEGIN_CXX
using namespace std;
/**
* This class acts as filter between a real config node and its user:
* reads which match properties which are set in the filter will
* return the value set in the filter. Writes will go to the underlying
* node and future reads will return the written value.
*
* The purpose of this class is temporarily overriding saved values
* during one run without having to modify the saved values.
*/
class FilterConfigNode : public ConfigNode {
public:
/** config filters are the same case-insensitive string to string mapping as property sets */
typedef ConfigProps ConfigFilter;
/** read-write access to underlying node */
FilterConfigNode(const boost::shared_ptr<ConfigNode> &node,
const ConfigFilter &filter = ConfigFilter());
/** read-only access to underlying node */
FilterConfigNode(const boost::shared_ptr<const ConfigNode> &node,
const ConfigFilter &filter = ConfigFilter());
virtual string getName() const { return m_readOnlyNode->getName(); }
/** add another entry to the list of filter properties */
virtual void addFilter(const string &property,
const string &value);
/** replace current filter list with new one */
virtual void setFilter(const ConfigFilter &filter);
virtual const ConfigFilter &getFilter() const { return m_filter; }
/* ConfigNode API */
virtual void flush();
virtual string readProperty(const string &property) const;
virtual void setProperty(const string &property,
const string &value,
const string &comment = "",
const string *defValue = NULL);
virtual void readProperties(ConfigProps &props) const;
virtual void removeProperty(const string &property);
virtual bool exists() const { return m_readOnlyNode->exists(); }
virtual void clear();
private:
ConfigFilter m_filter;
boost::shared_ptr<ConfigNode> m_node;
boost::shared_ptr<const ConfigNode> m_readOnlyNode;
};
SE_END_CXX
#endif