#include using namespace std; SettingsReader::SettingsReader(const QString & fname) { isFile = true; file = new QFile(fname); file->open(QIODevice::ReadWrite); stream = new QTextStream(file); parse(); } SettingsReader::SettingsReader(QString * string) { isFile = false; str = string; stream = new QTextStream(string); parse(); } SettingsReader::~SettingsReader() { settname.clear(); settval.clear(); settcom.clear(); setttab.clear(); settlines.clear(); setttype.clear(); all.clear(); stream->setDevice(0); delete stream; if (isFile) { file->close(); delete file; } } QString SettingsReader::getValue(QString vname, QString def, bool * exist) { for (int i = 0; i < settname.size(); i++) { if (settname.at(i) == vname) { if (exist != 0) *exist = true; return settval.at(i); } } if (exist != 0) *exist = false; return def; } void SettingsReader::addLine(const QString & name, const QString & value, const QString & type) { if (setttab.size() > 0 && all.size() > 0) *stream << setttab.at(setttab.size() - 1) << name << " = " << value << " #" << type << endl; else *stream << name << " = " << value << " #" << type << endl; settname.append(name); settval.append(value); settcom.append(""); setttype.append(type); if (setttab.size() > 0) setttab.append(setttab.at(setttab.size() - 1)); else setttab.append(" "); settlines.push_back(all.size()); all.append(name + " = " + value + " #" + type); stream->flush(); if (isFile) file->flush(); } void SettingsReader::insertLine(int number, const QString & name, const QString & value, const QString & type) { if (number >= settname.size()) { addLine(name, value, type); return; } settname.insert(number, name); settval.insert(number, value); settcom.insert(number, ""); setttab.insert(number, setttab.at(number)); setttype.insert(number, type); settlines.insert(number, settlines.at(number)); for (int i = number + 1; i < settlines.size(); i++) settlines[i]++; all.insert(settlines.at(number), name + " = " + value + " #" + type); stream->flush(); if (isFile) file->flush(); writeAll(); } int SettingsReader::numValues() { return settval.size(); } QString SettingsReader::getValue(int number) { return settval.at(number); } QString SettingsReader::getName(int number) { return settname.at(number); } QString SettingsReader::getComment(int number) { return settcom.at(number); } char SettingsReader::getType(int number) { return setttype.at(number)[0].cell(); } int SettingsReader::getNumber(const QString & name) { for (int i = 0; i < settname.size(); i++) { if (settname.at(i) == name) { return i; } } return -1; } void SettingsReader::setValue(int number, const QString & value, bool write) { QString tmp = settname.at(number) + " = " + value + " #" + setttype.at(number) + " " + settcom.at(number); settval.replace(number, value); all.replace(settlines[number], tmp); if (write) writeAll(); } void SettingsReader::setValue(const QString & name, const QString & value, bool write) { int number = getNumber(name); if (number == -1) return; QString tmp = settname.at(number) + " = " + value + " #" + setttype.at(number) + " " + settcom.at(number); settval.replace(number, value); all.replace(settlines[number], tmp); if (write) writeAll(); } void SettingsReader::setName(int number, const QString & name) { QString tmp = name + " = " + settval.at(number) + " #" + setttype.at(number) + " " + settcom.at(number); settname.replace(number, name); all.replace(settlines[number], tmp); writeAll(); } void SettingsReader::setType(int number, const QString & type) { QString tmp = settname.at(number) + " = " + settval.at(number) + " #" + type + " " + settcom.at(number); setttype.replace(number, type); all.replace(settlines[number], tmp); writeAll(); } void SettingsReader::setComment(int number, const QString & comment) { QString tmp = settname.at(number) + " = " + settval.at(number) + " #" + setttype.at(number) + " " + comment; settcom.replace(number, comment); all.replace(settlines[number], tmp); writeAll(); } void SettingsReader::deleteLine(const QString & name) { bool exist = false; int i; for (i = 0; i < settname.size(); i++) { if (settname.at(i) == name) { exist = true; break; } } if (!exist) return; deleteLine(i); } void SettingsReader::deleteLine(int number) { settname.remove(number); settval.remove(number); settcom.remove(number); setttab.remove(number); setttype.remove(number); all.remove(settlines[number]); for (int i = number; i < settlines.size(); i++) settlines[i]--; settlines.remove(number); writeAll(); } void SettingsReader::writeAll() { if (isFile) file->resize(0); else *str = ""; stream->seek(0); int c = 0; for (int i = 0; i < all.size(); i++) { if (c < settlines.size() && c < setttab.size()) { if (settlines[c] == i) { *stream << setttab.at(c); c++; } } *stream << all.at(i) << endl; } if (isFile) file->flush(); readAll(); } void SettingsReader::readAll() { settname.clear(); settval.clear(); settcom.clear(); setttab.clear(); settlines.clear(); setttype.clear(); all.clear(); if (isFile) file->flush(); parse(); } void SettingsReader::parse() { QString str, tab, comm; int ind, sind; stream->seek(0); lines = 0; if (isFile) if (!file->exists()) return; while (!stream->atEnd()) { str = stream->readLine(); tab = str.left(str.indexOf(str.trimmed().left(1))); str = str.trimmed(); all.append(str); ind = str.indexOf('='); if ((ind > 0) && !(str.left(1) == "#")) { sind = str.indexOf('#'); if (sind > 0) { comm = str.right(str.length() - sind - 1).trimmed(); setttype.append(comm.left(1)); comm = comm.right(comm.length() - 1).trimmed(); settcom.append(comm); str.truncate(sind); } else { setttype.append("s"); settcom.append(""); } settname.append((str.left(ind)).trimmed()); settval.append((str.right(str.length() - ind - 1)).trimmed()); setttab.append(tab); settlines.push_back(lines); } lines++; } }