diff options
-rw-r--r-- | common/array.h | 9 | ||||
-rw-r--r-- | common/config-manager.cpp | 26 | ||||
-rw-r--r-- | common/config-manager.h | 2 |
3 files changed, 33 insertions, 4 deletions
diff --git a/common/array.h b/common/array.h index 6fde309ac4..497e44ba70 100644 --- a/common/array.h +++ b/common/array.h @@ -145,6 +145,15 @@ public: return _data + _size; } + bool contains(const T &key) const { + for (const_iterator i = begin(); i != end(); ++i) { + if (*i == key) + return true; + } + return false; + } + + protected: void ensureCapacity(int new_len) { if (new_len <= _capacity) diff --git a/common/config-manager.cpp b/common/config-manager.cpp index 8dec3ae4e0..fcc660daa4 100644 --- a/common/config-manager.cpp +++ b/common/config-manager.cpp @@ -103,6 +103,7 @@ void ConfigManager::switchFile(const String &filename) { #endif _filename = filename; + _domainSaveOrder.clear(); loadFile(_filename); debug(1, "Switched to configuration %s", _filename.c_str()); } @@ -159,6 +160,8 @@ void ConfigManager::loadFile(const String &filename) { _gameDomains[domain].setDomainComment(comment); } comment.clear(); + + _domainSaveOrder.push_back(domain); } else { // Skip leading & trailing whitespaces char *t = rtrim(ltrim(buf)); @@ -204,16 +207,31 @@ void ConfigManager::flushToDisk() { if (!(cfg_file = fopen(_filename.c_str(), "w"))) { warning("Unable to write configuration file: %s", _filename.c_str()); } else { + + // First write the domains in _domainSaveOrder, in that order. + // Note: It's possible for _domainSaveOrder to list domains which + // are not present anymore. + StringList::const_iterator i; + for (i = _domainSaveOrder.begin(); i != _domainSaveOrder.end(); ++i) { + if (_globalDomains.contains(*i)) { + writeDomain(cfg_file, *i, _globalDomains[*i]); + } else if (_gameDomains.contains(*i)) { + writeDomain(cfg_file, *i, _gameDomains[*i]); + } + } + DomainMap::const_iterator d; - // First write the global domains + // Now write the global domains which weren't written yet for (d = _globalDomains.begin(); d != _globalDomains.end(); ++d) { - writeDomain(cfg_file, d->_key, d->_value); + if (!_domainSaveOrder.contains(d->_key)) + writeDomain(cfg_file, d->_key, d->_value); } - // Second, write the game domains + // Finally write the remaining game domains for (d = _gameDomains.begin(); d != _gameDomains.end(); ++d) { - writeDomain(cfg_file, d->_key, d->_value); + if (!_domainSaveOrder.contains(d->_key)) + writeDomain(cfg_file, d->_key, d->_value); } fclose(cfg_file); diff --git a/common/config-manager.h b/common/config-manager.h index 7187da0346..5b6c27d531 100644 --- a/common/config-manager.h +++ b/common/config-manager.h @@ -127,6 +127,8 @@ private: DomainMap _globalDomains; Domain _defaultsDomain; + StringList _domainSaveOrder; + String _activeDomain; String _filename; }; |