mirror of
https://github.com/znc/znc.git
synced 2026-03-28 17:42:41 +01:00
The same procedure as last year, Miss Sophie? The same procedure as every year, James. [skip ci]
174 lines
4.8 KiB
C++
174 lines
4.8 KiB
C++
/*
|
|
* Copyright (C) 2004-2018 ZNC, see the NOTICE file for details.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef ZNC_CONFIG_H
|
|
#define ZNC_CONFIG_H
|
|
|
|
#include <znc/zncconfig.h>
|
|
#include <znc/ZNCString.h>
|
|
|
|
class CFile;
|
|
class CConfig;
|
|
|
|
struct CConfigEntry {
|
|
CConfigEntry();
|
|
CConfigEntry(const CConfig& Config);
|
|
CConfigEntry(const CConfigEntry& other);
|
|
~CConfigEntry();
|
|
CConfigEntry& operator=(const CConfigEntry& other);
|
|
|
|
CConfig* m_pSubConfig;
|
|
};
|
|
|
|
class CConfig {
|
|
public:
|
|
CConfig() : m_ConfigEntries(), m_SubConfigs() {}
|
|
|
|
typedef std::map<CString, VCString> EntryMap;
|
|
typedef std::map<CString, CConfigEntry> SubConfig;
|
|
typedef std::map<CString, SubConfig> SubConfigMap;
|
|
|
|
typedef EntryMap::const_iterator EntryMapIterator;
|
|
typedef SubConfigMap::const_iterator SubConfigMapIterator;
|
|
|
|
EntryMapIterator BeginEntries() const { return m_ConfigEntries.begin(); }
|
|
EntryMapIterator EndEntries() const { return m_ConfigEntries.end(); }
|
|
|
|
SubConfigMapIterator BeginSubConfigs() const {
|
|
return m_SubConfigs.begin();
|
|
}
|
|
SubConfigMapIterator EndSubConfigs() const { return m_SubConfigs.end(); }
|
|
|
|
void AddKeyValuePair(const CString& sName, const CString& sValue) {
|
|
if (sName.empty() || sValue.empty()) {
|
|
return;
|
|
}
|
|
|
|
m_ConfigEntries[sName].push_back(sValue);
|
|
}
|
|
|
|
bool AddSubConfig(const CString& sTag, const CString& sName,
|
|
CConfig Config) {
|
|
SubConfig& conf = m_SubConfigs[sTag];
|
|
SubConfig::const_iterator it = conf.find(sName);
|
|
|
|
if (it != conf.end()) {
|
|
return false;
|
|
}
|
|
|
|
conf[sName] = Config;
|
|
return true;
|
|
}
|
|
|
|
bool FindStringVector(const CString& sName, VCString& vsList,
|
|
bool bErase = true) {
|
|
EntryMap::iterator it = m_ConfigEntries.find(sName);
|
|
vsList.clear();
|
|
if (it == m_ConfigEntries.end()) return false;
|
|
vsList = it->second;
|
|
|
|
if (bErase) {
|
|
m_ConfigEntries.erase(it);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool FindStringEntry(const CString& sName, CString& sRes,
|
|
const CString& sDefault = "") {
|
|
EntryMap::iterator it = m_ConfigEntries.find(sName);
|
|
sRes = sDefault;
|
|
if (it == m_ConfigEntries.end() || it->second.empty()) return false;
|
|
sRes = it->second.front();
|
|
it->second.erase(it->second.begin());
|
|
if (it->second.empty()) m_ConfigEntries.erase(it);
|
|
return true;
|
|
}
|
|
|
|
bool FindBoolEntry(const CString& sName, bool& bRes,
|
|
bool bDefault = false) {
|
|
CString s;
|
|
if (FindStringEntry(sName, s)) {
|
|
bRes = s.ToBool();
|
|
return true;
|
|
}
|
|
bRes = bDefault;
|
|
return false;
|
|
}
|
|
|
|
bool FindUIntEntry(const CString& sName, unsigned int& uRes,
|
|
unsigned int uDefault = 0) {
|
|
CString s;
|
|
if (FindStringEntry(sName, s)) {
|
|
uRes = s.ToUInt();
|
|
return true;
|
|
}
|
|
uRes = uDefault;
|
|
return false;
|
|
}
|
|
|
|
bool FindUShortEntry(const CString& sName, unsigned short& uRes,
|
|
unsigned short uDefault = 0) {
|
|
CString s;
|
|
if (FindStringEntry(sName, s)) {
|
|
uRes = s.ToUShort();
|
|
return true;
|
|
}
|
|
uRes = uDefault;
|
|
return false;
|
|
}
|
|
|
|
bool FindDoubleEntry(const CString& sName, double& fRes,
|
|
double fDefault = 0) {
|
|
CString s;
|
|
if (FindStringEntry(sName, s)) {
|
|
fRes = s.ToDouble();
|
|
return true;
|
|
}
|
|
fRes = fDefault;
|
|
return false;
|
|
}
|
|
|
|
bool FindSubConfig(const CString& sName, SubConfig& Config,
|
|
bool bErase = true) {
|
|
SubConfigMap::iterator it = m_SubConfigs.find(sName);
|
|
if (it == m_SubConfigs.end()) {
|
|
Config.clear();
|
|
return false;
|
|
}
|
|
Config = it->second;
|
|
|
|
if (bErase) {
|
|
m_SubConfigs.erase(it);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool empty() const {
|
|
return m_ConfigEntries.empty() && m_SubConfigs.empty();
|
|
}
|
|
|
|
bool Parse(CFile& file, CString& sErrorMsg);
|
|
void Write(CFile& file, unsigned int iIndentation = 0);
|
|
|
|
private:
|
|
EntryMap m_ConfigEntries;
|
|
SubConfigMap m_SubConfigs;
|
|
};
|
|
|
|
#endif // !ZNC_CONFIG_H
|