27 #include <QTextStream>
32 if(!fileName.isEmpty())
39 QFile inFile(fileName);
40 if (inFile.open(QFile::ReadOnly|QIODevice::Text)) {
42 if (encoding.isEmpty()) {
43 fileContent = QString::fromLocal8Bit(inFile.readAll());
46 QTextCodec* decoder = QTextCodec::codecForName(encoding.toLatin1());
48 decoder = QTextCodec::codecForLocale();
49 QTextStream qerr(stderr,QIODevice::WriteOnly);
50 qerr <<
"Selected encoding: " << decoder->name() << endl;
52 fileContent = decoder->toUnicode(inFile.readAll());
54 QTextStream str(&fileContent,QIODevice::ReadOnly);
56 QRegExp lb(
"(.*)\\\\\\s*");
57 QRegExp cm(
"(.*\\S)?\\s*#.*");
58 QRegExp kv(
"(\\S+)\\s*(\\S.*)?");
62 while (!str.atEnd()) {
64 line = str.readLine().trimmed();
67 if (cm.exactMatch(line)) {
71 while (lb.exactMatch(line)) {
72 QString next = str.readLine().trimmed();
74 if (cm.exactMatch(next)) {
77 line = lb.cap(1) + next;
85 if (kv.exactMatch(line)) {
86 QString par(kv.cap(1)), val(kv.cap(2));
87 Q_ASSERT(!par.isEmpty());
91 qDebug(
"%s:%d: malformed line",fileName.toLocal8Bit().constData(),lc);
98 QFile outFile(fileName);
99 if (outFile.exists()) {
100 QString backupFileName(fileName +
"~");
101 QFile::remove(backupFileName);
102 outFile.copy(backupFileName);
104 if (outFile.open(QFile::WriteOnly|QIODevice::Truncate|QIODevice::Text)) {
105 QTextStream strm(&outFile);
112 for (QStringList::const_iterator kIter=
_keys.constBegin();
113 kIter!=
_keys.constEnd(); kIter++) {
114 res << QString(
"%1\t\t%2")
115 .arg(*kIter).arg(
_content.value(kIter->toLower()));
121 return _content.contains(parameter.toLower());
125 return isSet(parameter) ?
126 _content.value(parameter.toLower()) : QString::null;
131 if (
isSet(parameter +
".editorpriority")) {
133 const int& pos =
_keys.indexOf(QRegExp(parameter +
".editorpriority",
134 Qt::CaseInsensitive, QRegExp::FixedString));
135 Q_ASSERT(pos >= 0); Q_ASSERT(pos <
_keys.size());
138 if (
isSet(parameter)) {
140 const int& pos =
_keys.indexOf(
141 QRegExp(parameter,Qt::CaseInsensitive,QRegExp::FixedString));
142 Q_ASSERT(pos >= 0); Q_ASSERT(pos <
_keys.size());
148 if (parameter.isEmpty()) {
149 qDebug(
"Empty parameter given in set()");
152 if (!
isSet(parameter)) {
153 _keys.append(parameter);
155 if (value.isNull()) {
158 _content.insert(parameter.toLower(),value);
164 if (beginsWith.isEmpty()) {
168 QStringListIterator ki(
_keys);
169 while (ki.hasNext()) {
170 QString cur = ki.next();
171 if (cur.startsWith(beginsWith,Qt::CaseInsensitive)) {
190 oldPrefix=oldPrefix.section(
".",0,0);
191 if (oldPrefix.isEmpty() || newPrefix.isEmpty() || oldPrefix == newPrefix) {
195 if (!check.exactMatch(newPrefix)) {
196 qDebug(
"QParameterFile::rename: new prefix is no valid prefix: %s",
197 newPrefix.toLocal8Bit().constData());
201 QStringList keysToRename;
202 QRegExp hasPrefix(oldPrefix+
"(\\.[\\w\\.\\-_]+)?",Qt::CaseInsensitive);
203 for (QStringList::const_iterator kIter =
_keys.constBegin();
204 kIter!=
_keys.constEnd(); kIter++) {
205 if (hasPrefix.exactMatch(*kIter)) {
206 keysToRename << *kIter;
207 QString newKey = newPrefix+hasPrefix.cap(1);
208 if (
_keys.contains(newKey,Qt::CaseInsensitive)
209 ||
_content.contains(newKey.toLower())) {
210 qDebug(
"new Key \"%s\" already exists! abort",
211 newKey.toLocal8Bit().constData());
216 if (keysToRename.isEmpty()) {
218 qDebug(
"no keys found starting with prefix \"%s\"",
219 oldPrefix.toLocal8Bit().constData());
224 for (QStringList::const_iterator rIter = keysToRename.constBegin();
225 rIter!=keysToRename.constEnd(); rIter++) {
226 QString cur = *rIter;
227 hasPrefix.exactMatch(cur);
228 Q_ASSERT(hasPrefix.matchedLength() >= 0);
229 int pos =
_keys.indexOf(QRegExp(cur,Qt::CaseInsensitive));
231 Q_ASSERT(
_content.contains(cur.toLower()));
232 QString val =
_content.value(cur.toLower());
234 Q_ASSERT(!
_keys.contains(cur,Qt::CaseInsensitive));
236 Q_ASSERT(!
_content.contains(cur.toLower()));
237 QString newKey = newPrefix+hasPrefix.cap(1);
239 _content.insert(newKey.toLower(),val);
245 QString(
"((?:%1;)*)(%3)(%2)?((?:;%1)*)")
248 .arg(oldPrefix),Qt::CaseInsensitive);
249 for (QHash<QString,QString>::iterator cIter=
_content.begin();
251 while (paramMatch.exactMatch(cIter.value())) {
252 QStringList mod = paramMatch.capturedTexts();
254 Q_ASSERT(mod.length() == 4);
255 Q_ASSERT(oldPrefix.compare(mod[1],Qt::CaseInsensitive)==0);
256 Q_ASSERT(mod.join(
"") == cIter.value());
257 mod.replace(1,newPrefix);
258 cIter.value() = mod.join(QString());
260 if (cIter.value().contains(QRegExp(QString(
"^([^\\s]*;)?%1([\\.;][^\\s]*)?$")
261 .arg(oldPrefix),Qt::CaseInsensitive))) {
262 qWarning(
"line still contains old prefix (%s): %s",
263 oldPrefix.toLocal8Bit().constData(),
264 cIter.value().toLocal8Bit().constData());
265 qWarning(
"it does not match the pattern: %s",
266 paramMatch.pattern().toLocal8Bit().constData());
QString get(QString parameter) const
get parameter value
QParameterFile(QString fileName="")
default constructor
QStringList _keys
key array, stored in mixed case
bool isSet(QString parameter) const
check if a given parameter has been set
static const QRegExp paramCheckSloppy
full parameter name check (sloppy version, may handle buggy lines)
Declaration of class QParameterFile.
void load(QString fileName, QString encoding=QString())
load parameter file
void set(QString parameter, QString value="")
set parameter value
QHash< QString, QString > _content
value hash table, keys are stored in lowercase
void erase(QString parameter)
remove parameter from file
bool rename(QString oldPrefix, QString newPrefix)
rename prefix
static const QRegExp paramCheck
full parameter name check
void save(QString fileName) const
save to given plain text file
static const QRegExp postfixCheck
postfix check, everything that may follow a prefix (starting with ".")
QStringList getKeyList(QString beginsWith="") const
Look for parameters beginning with a given string.
QStringList toStringList() const
get StringList representation, like file content after save()
void clear()
clear content
static const QRegExp prefixCheck
instance name or prefix check regex