[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