aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/array.h9
-rw-r--r--common/config-manager.cpp26
-rw-r--r--common/config-manager.h2
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;
};