#include "piconfig.h" PIConfig::PIConfig(const PIString & path): PIFile(path) { if (!isOpened()) open(path, Read | Write | New); parse(); } bool PIConfig::getValue(const PIString & vname, const bool def, bool * exist) const { return atob(getValue(vname, btos(def), exist));} char PIConfig::getValue(const PIString & vname, const char def, bool * exist) const { return getValue(vname, PIString(def), exist)[0];} short PIConfig::getValue(const PIString & vname, const short def, bool * exist) const { return getValue(vname, itos(def), exist).toShort();} int PIConfig::getValue(const PIString & vname, const int def, bool * exist) const { return getValue(vname, itos(def), exist).toInt();} long PIConfig::getValue(const PIString & vname, const long def, bool * exist) const { return getValue(vname, ltos(def), exist).toLong();} uchar PIConfig::getValue(const PIString & vname, const uchar def, bool * exist) const { return getValue(vname, uitos(def), exist).toInt();} ushort PIConfig::getValue(const PIString & vname, const ushort def, bool * exist) const { return getValue(vname, uitos(def), exist).toShort();} uint PIConfig::getValue(const PIString & vname, const uint def, bool * exist) const { return getValue(vname, uitos(def), exist).toInt();} ulong PIConfig::getValue(const PIString & vname, const ulong def, bool * exist) const { return getValue(vname, ultos(def), exist).toLong();} float PIConfig::getValue(const PIString & vname, const float def, bool * exist) const { return getValue(vname, ftos(def), exist).toFloat();} double PIConfig::getValue(const PIString & vname, const double def, bool * exist) const { return getValue(vname, dtos(def), exist).toDouble();} void PIConfig::setValue(const PIString & name, const char * value, bool write) { setValue(name, PIString(value), "s", write);} void PIConfig::setValue(const PIString & name, const bool value, bool write) { setValue(name, btos(value), "b", write);} void PIConfig::setValue(const PIString & name, const char value, bool write) { setValue(name, PIString(1, value), "s", write);} void PIConfig::setValue(const PIString & name, const short value, bool write) { setValue(name, itos(value), "n", write);} void PIConfig::setValue(const PIString & name, const int value, bool write) { setValue(name, itos(value), "n", write);} void PIConfig::setValue(const PIString & name, const long value, bool write) { setValue(name, ltos(value), "n", write);} void PIConfig::setValue(const PIString & name, const uchar value, bool write) { setValue(name, uitos(value), "n", write);} void PIConfig::setValue(const PIString & name, const ushort value, bool write) { setValue(name, uitos(value), "n", write);} void PIConfig::setValue(const PIString & name, const uint value, bool write) { setValue(name, uitos(value), "n", write);} void PIConfig::setValue(const PIString & name, const ulong value, bool write) { setValue(name, ultos(value), "n", write);} void PIConfig::setValue(const PIString & name, const float value, bool write) { setValue(name, ftos(value), "f", write);} void PIConfig::setValue(const PIString & name, const double value, bool write) { setValue(name, dtos(value), "f", write);} PIString PIConfig::getValue(const PIString & vname, const PIString & def, bool * exist) const { for (uint i = 0; i < settname.size(); i++) { if (settname[i] == vname) { if (exist != 0) *exist = true; return settval[i]; } } if (exist != 0) *exist = false; return def; } void PIConfig::setValue(const PIString & name, const PIString & value, const PIString & type, bool write) { int number = getNumber(name); if (number == -1) { addLine(name, value, type); return; } PIString tmp = settname[number] + " = " + value + " #" + setttype[number] + " " + settcom[number]; settval[number] = value; all[settlines[number]] = tmp; if (write) writeAll(); } bool PIConfig::existsValue(const PIString & name) { for (uint i = 0; i < settname.size(); i++) if (settname[i] == name) return true; return false; } void PIConfig::addLine(const PIString & name, const PIString & value, const PIString & type) { if (setttab.size() > 0) *this << setttab[setttab.size() - 1] << name << " = " << value << " #" << type << "\n"; else *this << name << " = " << value << " #" << type << "\n"; settname.push_back(name); settval.push_back(value); settcom.push_back(""); setttype.push_back(type); if (setttab.size() > 0) setttab.push_back(setttab[setttab.size() - 1]); else setttab.push_back("\t"); settlines.push_back(all.size()); all.push_back(name + " = " + value + " #" + type); flush(); } void PIConfig::insertLine(uint number, const PIString & name, const PIString & value, const PIString & type) { if (number >= settname.size()) { addLine(name, value, type); return; } settname.insert(settname.begin() + number, name); settval.insert(settval.begin() + number, value); settcom.insert(settcom.begin() + number, ""); setttab.insert(setttab.begin() + number, setttab[number]); setttype.insert(setttype.begin() + number, type); settlines.insert(settlines.begin() + number, settlines[number]); for (uint i = number + 1; i < settlines.size(); i++) settlines[i]++; all.insert(all.begin() + settlines[number], name + " = " + value + " #" + type); flush(); writeAll(); } int PIConfig::getNumber(const PIString & name) { for (uint i = 0; i < settname.size(); i++) if (settname[i] == name) return i; return -1; } void PIConfig::setValue(uint number, const PIString & value, bool write) { PIString tmp = settname[number] + " = " + value + " #" + setttype[number] + " " + settcom[number]; settval[number] = value; all[settlines[number]] = tmp; if (write) writeAll(); } void PIConfig::setName(uint number, const PIString & name) { PIString tmp = name + " = " + settval[number] + " #" + setttype[number] + " " + settcom[number]; settname[number] = name; all[settlines[number]] = tmp; writeAll(); } void PIConfig::setType(uint number, const PIString & type) { PIString tmp = settname[number] + " = " + settval[number] + " #" + type + " " + settcom[number]; setttype[number] = type; all[settlines[number]] = tmp; writeAll(); } void PIConfig::setComment(uint number, const PIString & comment) { PIString tmp = settname[number] + " = " + settval[number] + " #" + setttype[number] + " " + comment; settcom[number] = comment; all[settlines[number]] = tmp; writeAll(); } void PIConfig::deleteLine(const PIString & name) { bool exist = false; uint i; for (i = 0; i < settname.size(); i++) { if (settname[i] == name) { exist = true; break; } } if (!exist) return; deleteLine(i); } void PIConfig::deleteLine(uint number) { settname.erase(settname.begin() + number); settval.erase(settval.begin() + number); settcom.erase(settcom.begin() + number); setttab.erase(setttab.begin() + number); setttype.erase(setttype.begin() + number); all.erase(all.begin() + settlines[number]); for (uint i = number; i < settlines.size(); i++) settlines[i]--; settlines.erase(settlines.begin() + number); writeAll(); } void PIConfig::writeAll() { clear(); uint c = 0; for (uint i = 0; i < all.size() - 1; i++) { if (c < settlines.size() && c < setttab.size()) { if (settlines[c] == i) { *this << setttab[c]; c++; } } *this << all[i] << "\n"; } readAll(); } void PIConfig::readAll() { settname.clear(); settval.clear(); settcom.clear(); setttab.clear(); settlines.clear(); setttype.clear(); all.clear(); flush(); parse(); } void PIConfig::parse() { PIString str, tab, comm; int ind, sind; if (!isOpened()) return; seek(0); lines = 0; while (!isEnd()) { str = readLine(); //cout << str << endl; tab = str.left(str.find(str.trimmed().left(1))); str.trim(); all.push_back(str); ind = str.find('='); if ((ind > 0) && !(str[0] == '#')) { sind = str.find('#'); if (sind > 0) { comm = str.right(str.size() - sind - 1).trimmed(); setttype.push_back(comm[0]); comm = comm.right(comm.size() - 1).trimmed(); settcom.push_back(comm); str = str.left(sind); } else { setttype.push_back("s"); settcom.push_back(""); } settname.push_back(str.left(ind).trimmed()); settval.push_back(str.right(str.size() - ind - 1).trimmed()); setttab.push_back(tab); settlines.push_back(lines); } lines++; } }