1 /*
2  * %kadu copyright begin%
3  * Copyright 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
4  * %kadu copyright end%
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of
9  * the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "deprecated-configuration-api.h"
21 
22 #include "configuration/configuration-api.h"
23 #include "misc/misc.h"
24 
25 #include <QtCore/QMutex>
26 #include <QtCore/QMutexLocker>
27 #include <QtWidgets/QApplication>
28 
29 static QMutex GlobalMutex;
30 
DeprecatedConfigurationApi(ConfigurationApi * xmlConfigFile,const QString & fileName)31 DeprecatedConfigurationApi::DeprecatedConfigurationApi(ConfigurationApi *xmlConfigFile, const QString &fileName) :
32 		m_xmlConfigFile{xmlConfigFile},
33 		m_fileName{fileName.section('/', -1)}
34 {
35 }
36 
changeEntry(const QString & group,const QString & name,const QString & value)37 bool DeprecatedConfigurationApi::changeEntry(const QString &group, const QString &name, const QString &value)
38 {
39 	QMutexLocker locker(&GlobalMutex);
40 
41 	auto root_elem = m_xmlConfigFile->rootElement();
42 	auto deprecated_elem = m_xmlConfigFile->accessElement(root_elem, "Deprecated");
43 	auto config_file_elem = m_xmlConfigFile->accessElementByFileNameProperty(deprecated_elem, "ConfigFile", "name", m_fileName);
44 	auto group_elem = m_xmlConfigFile->accessElementByProperty(config_file_elem, "Group", "name", group);
45 	auto entry_elem = m_xmlConfigFile->accessElementByProperty(group_elem, "Entry", "name", name);
46 	entry_elem.setAttribute("value", value);
47 
48 	return true;
49 }
50 
getEntry(const QString & group,const QString & name) const51 QString DeprecatedConfigurationApi::getEntry(const QString &group, const QString &name) const
52 {
53 	QMutexLocker locker(&GlobalMutex);
54 
55 	auto root_elem = m_xmlConfigFile->rootElement();
56 	auto deprecated_elem = m_xmlConfigFile->findElement(root_elem, "Deprecated");
57 
58 	if (deprecated_elem.isNull())
59 		return {};
60 
61 	auto config_file_elem = m_xmlConfigFile->findElementByFileNameProperty(deprecated_elem, "ConfigFile", "name", m_fileName);
62 	if (config_file_elem.isNull())
63 		return {};
64 
65 	auto group_elem = m_xmlConfigFile->findElementByProperty(config_file_elem, "Group", "name", group);
66 	if (group_elem.isNull())
67 		return {};
68 
69 	auto entry_elem = m_xmlConfigFile->findElementByProperty(group_elem, "Entry", "name", name);
70 	return entry_elem.attribute("value");
71 }
72 
writeEntry(const QString & group,const QString & name,const QString & value)73 void DeprecatedConfigurationApi::writeEntry(const QString &group,const QString &name, const QString &value)
74 {
75 	changeEntry(group, name, value);
76 }
77 
writeEntry(const QString & group,const QString & name,const char * value)78 void DeprecatedConfigurationApi::writeEntry(const QString &group,const QString &name, const char *value)
79 {
80 	changeEntry(group, name, QString::fromLocal8Bit(value));
81 }
82 
writeEntry(const QString & group,const QString & name,const int value)83 void DeprecatedConfigurationApi::writeEntry(const QString &group,const QString &name, const int value)
84 {
85 	changeEntry(group, name, QString::number(value));
86 }
87 
writeEntry(const QString & group,const QString & name,const bool value)88 void DeprecatedConfigurationApi::writeEntry(const QString &group,const QString &name, const bool value)
89 {
90 	changeEntry(group, name, value ? "true" : "false");
91 }
92 
writeEntry(const QString & group,const QString & name,const QRect & value)93 void DeprecatedConfigurationApi::writeEntry(const QString &group,const QString &name, const QRect &value)
94 {
95 	changeEntry(group, name, rectToString(value));
96 }
97 
writeEntry(const QString & group,const QString & name,const QColor & value)98 void DeprecatedConfigurationApi::writeEntry(const QString &group,const QString &name, const QColor &value)
99 {
100 	changeEntry(group, name, value.name());
101 }
102 
writeEntry(const QString & group,const QString & name,const QFont & value)103 void DeprecatedConfigurationApi::writeEntry(const QString &group,const QString &name, const QFont &value)
104 {
105 	changeEntry(group, name, value.toString());
106 }
107 
readEntry(const QString & group,const QString & name,const QString & def) const108 QString DeprecatedConfigurationApi::readEntry(const QString &group,const QString &name, const QString &def) const
109 {
110 	auto string = getEntry(group, name);
111 	if (string.isNull())
112 		return def;
113 	return string;
114 }
115 
readUnsignedNumEntry(const QString & group,const QString & name,unsigned int def) const116 unsigned int DeprecatedConfigurationApi::readUnsignedNumEntry(const QString &group,const QString &name, unsigned int def) const
117 {
118 	auto ok = false;
119 	auto string = getEntry(group, name);
120 	if (string.isNull())
121 		return def;
122 	auto num = string.toUInt(&ok);
123 	if (!ok)
124 		return def;
125 	return num;
126 }
127 
readNumEntry(const QString & group,const QString & name,int def) const128 int DeprecatedConfigurationApi::readNumEntry(const QString &group,const QString &name, int def) const
129 {
130 	auto ok = false;
131 	auto string = getEntry(group, name);
132 	if (string.isNull())
133 		return def;
134 	auto num = string.toInt(&ok);
135 	if (!ok)
136 		return def;
137 	return num;
138 }
139 
readBoolEntry(const QString & group,const QString & name,bool def) const140 bool DeprecatedConfigurationApi::readBoolEntry(const QString &group,const QString &name, bool def) const
141 {
142 	auto string = getEntry(group, name);
143 	if (string.isNull())
144 		return def;
145 	return string=="true";
146 }
147 
readRectEntry(const QString & group,const QString & name,const QRect * def) const148 QRect DeprecatedConfigurationApi::readRectEntry(const QString &group,const QString &name, const QRect *def) const
149 {
150 	return stringToRect(getEntry(group, name), def);
151 }
152 
readColorEntry(const QString & group,const QString & name,const QColor * def) const153 QColor DeprecatedConfigurationApi::readColorEntry(const QString &group,const QString &name, const QColor *def) const
154 {
155 	auto str = getEntry(group, name);
156 	if (str.isNull())
157 		return def ? *def : QColor(0, 0, 0);
158 	else
159 		return QColor(str);
160 }
161 
162 
readFontEntry(const QString & group,const QString & name,const QFont * def) const163 QFont DeprecatedConfigurationApi::readFontEntry(const QString &group,const QString &name, const QFont *def) const
164 {
165 	auto string = getEntry(group, name);
166 	if (string.isNull())
167 		return def ? *def : QApplication::font();
168 	auto font = QFont{};
169 	if(font.fromString(string))
170 		return font;
171 	return def ? *def : QApplication::font();
172 }
173 
removeVariable(const QString & group,const QString & name)174 void DeprecatedConfigurationApi::removeVariable(const QString &group, const QString &name)
175 {
176 	QMutexLocker locker(&GlobalMutex);
177 
178 	auto root_elem = m_xmlConfigFile->rootElement();
179 	auto deprecated_elem = m_xmlConfigFile->accessElement(root_elem, "Deprecated");
180 	auto config_file_elem = m_xmlConfigFile->accessElementByFileNameProperty(deprecated_elem, "ConfigFile", "name", m_fileName);
181 	auto group_elem = m_xmlConfigFile->accessElementByProperty(config_file_elem, "Group", "name", group);
182 	auto entry_elem = m_xmlConfigFile->accessElementByProperty(group_elem, "Entry", "name", name);
183 	group_elem.removeChild(entry_elem);
184 }
185 
addVariable(const QString & group,const QString & name,const QString & defvalue)186 void DeprecatedConfigurationApi::addVariable(const QString &group, const QString &name, const QString &defvalue)
187 {
188 	if (getEntry(group, name).isEmpty())
189 		writeEntry(group, name, defvalue);
190 }
addVariable(const QString & group,const QString & name,const char * defvalue)191 void DeprecatedConfigurationApi::addVariable(const QString &group, const QString &name, const char *defvalue)
192 {
193 	if (getEntry(group, name).isEmpty())
194 		writeEntry(group, name, defvalue);
195 }
addVariable(const QString & group,const QString & name,const int defvalue)196 void DeprecatedConfigurationApi::addVariable(const QString &group, const QString &name, const int defvalue)
197 {
198 	if (getEntry(group, name).isEmpty())
199 		writeEntry(group, name, defvalue);
200 }
addVariable(const QString & group,const QString & name,const bool defvalue)201 void DeprecatedConfigurationApi::addVariable(const QString &group, const QString &name, const bool defvalue)
202 {
203 	if (getEntry(group, name).isEmpty())
204 		writeEntry(group, name, defvalue);
205 }
addVariable(const QString & group,const QString & name,const QColor & defvalue)206 void DeprecatedConfigurationApi::addVariable(const QString &group, const QString &name, const QColor &defvalue)
207 {
208 	if (getEntry(group, name).isEmpty())
209 		writeEntry(group, name, defvalue);
210 }
addVariable(const QString & group,const QString & name,const QFont & defvalue)211 void DeprecatedConfigurationApi::addVariable(const QString &group, const QString &name, const QFont &defvalue)
212 {
213 	if (getEntry(group, name).isEmpty())
214 		writeEntry(group, name, defvalue);
215 }
216