diff --git a/cocos2dx/CCConfiguration.cpp b/cocos2dx/CCConfiguration.cpp index c9104ea59f..c3513c1d82 100644 --- a/cocos2dx/CCConfiguration.cpp +++ b/cocos2dx/CCConfiguration.cpp @@ -31,6 +31,7 @@ THE SOFTWARE. #include "cocoa/CCInteger.h" #include "cocoa/CCBool.h" #include "cocos2d.h" +#include "CCFileUtils.h" using namespace std; @@ -57,6 +58,7 @@ CCConfiguration::CCConfiguration(void) bool CCConfiguration::init(void) { m_pDefaults = CCDictionary::create(); + m_pDefaults->retain(); m_pDefaults->setObject( CCString::create( cocos2dVersion() ), "cocos2d.version"); @@ -221,11 +223,15 @@ bool CCConfiguration::supportsShareableVAO(void) const const char *CCConfiguration::getCString( const char *key ) const { CCObject *ret = m_pDefaults->objectForKey(key); - if( ret ) + if( ret ) { if( CCString *str=dynamic_cast(ret) ) return str->getCString(); + CCAssert(false, "Key found, but from different type"); + } + // XXX: Should it throw an exception ? + CCLOG("Key not found: '%s'", key ); return NULL; } @@ -233,11 +239,14 @@ const char *CCConfiguration::getCString( const char *key ) const bool CCConfiguration::getBool( const char *key ) const { CCObject *ret = m_pDefaults->objectForKey(key); - if( ret ) + if( ret ) { if( CCBool *obj=dynamic_cast(ret) ) return obj->getValue(); + CCAssert(false, "Key found, but from different type"); + } // XXX: Should it throw an exception ? + CCLOG("Key not found: '%s'", key ); return false; } @@ -251,9 +260,12 @@ double CCConfiguration::getNumber( const char *key ) const if( CCInteger *obj=dynamic_cast(ret) ) return obj->getValue(); + + CCAssert(false, "Key found, but from different type"); } // XXX: Should it throw an exception ? + CCLOG("Key not found: '%s'", key ); return 0.0; } @@ -262,9 +274,23 @@ CCObject * CCConfiguration::getObject( const char *key ) const return m_pDefaults->objectForKey(key); } -ccConfigurationType CCConfiguration::getType( const char *key ) const +// +// load file +// +void CCConfiguration::loadConfigFile( const char *filename ) { - return ConfigurationError; + CCDictionary *dict = CCDictionary::createWithContentsOfFile(filename); + CCAssert(dict, "cannot create dictionary"); + + // Add all keys in the existing dictionary + CCDictElement* element; + CCDICT_FOREACH(dict, element) + { + if( ! m_pDefaults->objectForKey( element->getStrKey() ) ) + m_pDefaults->setObject(element->getObject(), element->getStrKey() ); + else + CCLOG("Key already present. Ignoring '%s'", element->getStrKey() ); + } } NS_CC_END diff --git a/cocos2dx/CCConfiguration.h b/cocos2dx/CCConfiguration.h index 292d38009d..5b8b0bbabb 100644 --- a/cocos2dx/CCConfiguration.h +++ b/cocos2dx/CCConfiguration.h @@ -57,9 +57,11 @@ class CC_DLL CCConfiguration : public CCObject public: /** returns a shared instance of CCConfiguration */ static CCConfiguration *sharedConfiguration(void); + /** purge the shared instance of CCConfiguration */ static void purgeConfiguration(void); -public: + +public: virtual ~CCConfiguration(void); @@ -116,21 +118,19 @@ public: /** returns the value of a given key as a double */ CCObject * getObject( const char *key ) const; - /** returns the type of a given key */ - ccConfigurationType getType( const char *key ) const; - /** dumps the current configuration on the console */ void dumpInfo(void) const; - /** loads JSON config file in the configuration */ - void loadConfigFile( char *filename ); - /** gathers OpenGL / GPU information */ void gatherGPUInfo( void ); + /** Loads a config file. If the keys are already present, then they are going to be replaced. Otherwise the new keys are added. */ + void loadConfigFile( const char *filename ); + private: CCConfiguration(void); static CCConfiguration *s_gSharedConfiguration; + static std::string s_sConfigfile; protected: GLint m_nMaxTextureSize;