[Scummvm-cvs-logs] SF.net SVN: scummvm:[55060] scummvm/trunk/common
Bluddy at users.sourceforge.net
Bluddy at users.sourceforge.net
Wed Dec 29 16:16:32 CET 2010
Revision: 55060
http://scummvm.svn.sourceforge.net/scummvm/?rev=55060&view=rev
Author: Bluddy
Date: 2010-12-29 15:16:31 +0000 (Wed, 29 Dec 2010)
Log Message:
-----------
CONFIG-MGR: added ability to add other non-game domains
The way we determine if a domain is a game domain or not when loading from the config file is by checking for a 'gameId' key. This required changing the method of loading somewhat. MiscDomains (ie. non-game domains) are saved to the config file before game domains but after the main domains.
This change shouldn't mess anything up but it could probably use a look-through just in case.
Modified Paths:
--------------
scummvm/trunk/common/config-manager.cpp
scummvm/trunk/common/config-manager.h
Modified: scummvm/trunk/common/config-manager.cpp
===================================================================
--- scummvm/trunk/common/config-manager.cpp 2010-12-29 09:53:58 UTC (rev 55059)
+++ scummvm/trunk/common/config-manager.cpp 2010-12-29 15:16:31 UTC (rev 55060)
@@ -63,6 +63,7 @@
void ConfigManager::copyFrom(ConfigManager &source) {
_transientDomain = source._transientDomain;
_gameDomains = source._gameDomains;
+ _miscDomains = source._miscDomains;
_appDomain = source._appDomain;
_defaultsDomain = source._defaultsDomain;
#ifdef ENABLE_KEYMAPPER
@@ -109,13 +110,46 @@
}
}
+/**
+ * Add a ready-made domain based on its name and contents
+ * The domain name should not already exist in the ConfigManager.
+ **/
+void ConfigManager::addDomain(const Common::String &domainName, const ConfigManager::Domain &domain) {
+ if (domainName.empty())
+ return;
+ if (domainName == kApplicationDomain) {
+ _appDomain = domain;
+#ifdef ENABLE_KEYMAPPER
+ } else if (domain == kKeymapperDomain) {
+ _keymapperDomain = domain;
+#endif
+ } else if (domain.contains("gameid")) {
+ // If the domain contains "gameid" we assume it's a game domain
+ if (_gameDomains.contains(domainName))
+ warning("Game domain %s already exists in ConfigManager", domainName.c_str());
+
+ _gameDomains[domainName] = domain;
+
+ _domainSaveOrder.push_back(domainName);
+ } else {
+ // Otherwise it's a miscellaneous domain
+ if (_miscDomains.contains(domainName))
+ warning("Misc domain %s already exists in ConfigManager", domainName.c_str());
+
+ _miscDomains[domainName] = domain;
+ }
+}
+
+
void ConfigManager::loadFromStream(SeekableReadStream &stream) {
- String domain;
+ String domainName;
String comment;
+ Domain domain;
int lineno = 0;
_appDomain.clear();
_gameDomains.clear();
+ _miscDomains.clear();
_transientDomain.clear();
_domainSaveOrder.clear();
@@ -142,6 +176,9 @@
comment += "\n";
} else if (line[0] == '[') {
// It's a new domain which begins here.
+ // Determine where the previously accumulated domain goes, if we accumulated anything.
+ addDomain(domainName, domain);
+ domain.clear();
const char *p = line.c_str() + 1;
// Get the domain name, and check whether it's valid (that
// is, verify that it only consists of alphanumerics,
@@ -154,21 +191,11 @@
else if (*p != ']')
error("Config file buggy: Invalid character '%c' occurred in section name in line %d", *p, lineno);
- domain = String(line.c_str() + 1, p);
+ domainName = String(line.c_str() + 1, p);
- // Store domain comment
- if (domain == kApplicationDomain) {
- _appDomain.setDomainComment(comment);
-#ifdef ENABLE_KEYMAPPER
- } else if (domain == kKeymapperDomain) {
- _keymapperDomain.setDomainComment(comment);
-#endif
- } else {
- _gameDomains[domain].setDomainComment(comment);
- }
+ domain.setDomainComment(comment);
comment.clear();
- _domainSaveOrder.push_back(domain);
} else {
// This line should be a line with a 'key=value' pair, or an empty one.
@@ -182,7 +209,7 @@
continue;
// If no domain has been set, this config file is invalid!
- if (domain.empty()) {
+ if (domainName.empty()) {
error("Config file buggy: Key/value pair found outside a domain in line %d", lineno);
}
@@ -200,21 +227,15 @@
value.trim();
// Finally, store the key/value pair in the active domain
- set(key, value, domain);
+ domain[key] = value;
// Store comment
- if (domain == kApplicationDomain) {
- _appDomain.setKVComment(key, comment);
-#ifdef ENABLE_KEYMAPPER
- } else if (domain == kKeymapperDomain) {
- _keymapperDomain.setKVComment(key, comment);
-#endif
- } else {
- _gameDomains[domain].setKVComment(key, comment);
- }
+ domain.setKVComment(key, comment);
comment.clear();
}
}
+
+ addDomain(domainName, domain); // Add the last domain found
}
void ConfigManager::flushToDisk() {
@@ -248,6 +269,13 @@
writeDomain(*stream, kKeymapperDomain, _keymapperDomain);
#endif
+ DomainMap::const_iterator d;
+
+ // Write the miscellaneous domains next
+ for (d = _miscDomains.begin(); d != _miscDomains.end(); ++d) {
+ writeDomain(*stream, d->_key, d->_value);
+ }
+
// First write the domains in _domainSaveOrder, in that order.
// Note: It's possible for _domainSaveOrder to list domains which
// are not present anymore, so we validate each name.
@@ -255,11 +283,9 @@
for (i = _domainSaveOrder.begin(); i != _domainSaveOrder.end(); ++i) {
if (_gameDomains.contains(*i)) {
writeDomain(*stream, *i, _gameDomains[*i]);
- }
+ }
}
- DomainMap::const_iterator d;
-
// Now write the domains which haven't been written yet
for (d = _gameDomains.begin(); d != _gameDomains.end(); ++d) {
if (find(_domainSaveOrder.begin(), _domainSaveOrder.end(), d->_key) == _domainSaveOrder.end())
@@ -329,6 +355,8 @@
if (domName == kKeymapperDomain)
return &_keymapperDomain;
#endif
+ if (_miscDomains.contains(domName))
+ return &_miscDomains[domName];
if (_gameDomains.contains(domName))
return &_gameDomains[domName];
@@ -347,6 +375,8 @@
if (domName == kKeymapperDomain)
return &_keymapperDomain;
#endif
+ if (_miscDomains.contains(domName))
+ return &_miscDomains[domName];
if (_gameDomains.contains(domName))
return &_gameDomains[domName];
@@ -584,13 +614,38 @@
_domainSaveOrder.push_back(domName);
}
+void ConfigManager::addMiscDomain(const String &domName) {
+ assert(!domName.empty());
+ assert(isValidDomainName(domName));
+
+ _miscDomains[domName];
+}
+
void ConfigManager::removeGameDomain(const String &domName) {
assert(!domName.empty());
assert(isValidDomainName(domName));
_gameDomains.erase(domName);
}
+void ConfigManager::removeMiscDomain(const String &domName) {
+ assert(!domName.empty());
+ assert(isValidDomainName(domName));
+ _miscDomains.erase(domName);
+}
+
+
void ConfigManager::renameGameDomain(const String &oldName, const String &newName) {
+ renameDomain(oldName, newName, _gameDomains);
+}
+
+void ConfigManager::renameMiscDomain(const String &oldName, const String &newName) {
+ renameDomain(oldName, newName, _miscDomains);
+}
+
+/**
+ * Common private function to rename both game and misc domains
+ **/
+void ConfigManager::renameDomain(const String &oldName, const String &newName, DomainMap &map) {
if (oldName == newName)
return;
@@ -600,13 +655,13 @@
assert(isValidDomainName(newName));
// _gameDomains[newName].merge(_gameDomains[oldName]);
- Domain &oldDom = _gameDomains[oldName];
- Domain &newDom = _gameDomains[newName];
+ Domain &oldDom = map[oldName];
+ Domain &newDom = map[newName];
Domain::const_iterator iter;
for (iter = oldDom.begin(); iter != oldDom.end(); ++iter)
newDom[iter->_key] = iter->_value;
- _gameDomains.erase(oldName);
+ map.erase(oldName);
}
bool ConfigManager::hasGameDomain(const String &domName) const {
@@ -614,6 +669,10 @@
return isValidDomainName(domName) && _gameDomains.contains(domName);
}
+bool ConfigManager::hasMiscDomain(const String &domName) const {
+ assert(!domName.empty());
+ return isValidDomainName(domName) && _miscDomains.contains(domName);
+}
#pragma mark -
Modified: scummvm/trunk/common/config-manager.h
===================================================================
--- scummvm/trunk/common/config-manager.h 2010-12-29 09:53:58 UTC (rev 55059)
+++ scummvm/trunk/common/config-manager.h 2010-12-29 15:16:31 UTC (rev 55060)
@@ -137,7 +137,14 @@
void addGameDomain(const String &domName);
void removeGameDomain(const String &domName);
void renameGameDomain(const String &oldName, const String &newName);
+
+ void addMiscDomain(const String &domName);
+ void removeMiscDomain(const String &domName);
+ void renameMiscDomain(const String &oldName, const String &newName);
+
bool hasGameDomain(const String &domName) const;
+ bool hasMiscDomain(const String &domName) const;
+
const DomainMap & getGameDomains() const { return _gameDomains; }
DomainMap & getGameDomains() { return _gameDomains; }
@@ -149,10 +156,13 @@
ConfigManager();
void loadFromStream(SeekableReadStream &stream);
+ void addDomain(const Common::String &domainName, const Domain &domain);
void writeDomain(WriteStream &stream, const String &name, const Domain &domain);
+ void renameDomain(const String &oldName, const String &newName, DomainMap &map);
Domain _transientDomain;
DomainMap _gameDomains;
+ DomainMap _miscDomains; // Any other domains
Domain _appDomain;
Domain _defaultsDomain;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list