fixed #933: profile CCUserDefault

This commit is contained in:
minggo 2012-02-02 14:18:13 +08:00
parent 1ae8f001b8
commit 591b7d0619
3 changed files with 37 additions and 35 deletions

View File

@ -94,13 +94,17 @@ public:
@brief Set string value by key.
*/
void setStringForKey(const char* pKey, const std::string & value);
/**
@brief Save content to xml file
*/
void flush();
static CCUserDefault* sharedUserDefault();
static void purgeSharedUserDefault();
const static std::string& getXMLFilePath();
private:
CCUserDefault() {}
CCUserDefault();
static bool createXMLFile();
static bool isXMLFileExist();
static void initXMLFilePath();

View File

@ -42,12 +42,14 @@ using namespace std;
NS_CC_BEGIN;
static xmlDocPtr g_sharedDoc = NULL;
/**
* define the functions here because we don't want to
* export xmlNodePtr and other types in "CCUserDefault.h"
*/
static xmlNodePtr getXMLNodeForKey(const char* pKey, xmlNodePtr *rootNode, xmlDocPtr *doc)
static xmlNodePtr getXMLNodeForKey(const char* pKey, xmlNodePtr *rootNode)
{
xmlNodePtr curNode = NULL;
@ -59,16 +61,8 @@ static xmlNodePtr getXMLNodeForKey(const char* pKey, xmlNodePtr *rootNode, xmlDo
do
{
// read doc
*doc = xmlReadFile(CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str(), "utf-8", XML_PARSE_RECOVER);
if (NULL == *doc)
{
CCLOG("can not read xml file");
break;
}
// get root node
*rootNode = xmlDocGetRootElement(*doc);
*rootNode = xmlDocGetRootElement(g_sharedDoc);
if (NULL == *rootNode)
{
CCLOG("read root node error");
@ -95,8 +89,7 @@ static inline const char* getValueForKey(const char* pKey)
{
const char* ret = NULL;
xmlNodePtr rootNode;
xmlDocPtr doc;
xmlNodePtr node = getXMLNodeForKey(pKey, &rootNode, &doc);
xmlNodePtr node = getXMLNodeForKey(pKey, &rootNode);
// find the node
if (node)
@ -104,19 +97,12 @@ static inline const char* getValueForKey(const char* pKey)
ret = (const char*)xmlNodeGetContent(node);
}
// free doc
if (doc)
{
xmlFreeDoc(doc);
}
return ret;
}
static void setValueForKey(const char* pKey, const char* pValue)
{
xmlNodePtr rootNode;
xmlDocPtr doc;
xmlNodePtr node;
// check the params
@ -126,7 +112,7 @@ static void setValueForKey(const char* pKey, const char* pValue)
}
// find the node
node = getXMLNodeForKey(pKey, &rootNode, &doc);
node = getXMLNodeForKey(pKey, &rootNode);
// if node exist, change the content
if (node)
@ -145,13 +131,6 @@ static void setValueForKey(const char* pKey, const char* pValue)
xmlAddChild(tmpNode, content);
}
}
// save file and free doc
if (doc)
{
xmlSaveFile(CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str(),doc);
xmlFreeDoc(doc);
}
}
/**
@ -168,9 +147,21 @@ bool CCUserDefault::m_sbIsFilePathInitialized = false;
*/
CCUserDefault::~CCUserDefault()
{
flush();
if (g_sharedDoc)
{
xmlFreeDoc(g_sharedDoc);
g_sharedDoc = NULL;
}
m_spUserDefault = NULL;
}
CCUserDefault::CCUserDefault()
{
g_sharedDoc = xmlReadFile(getXMLFilePath().c_str(), "utf-8", XML_PARSE_RECOVER);
}
void CCUserDefault::purgeSharedUserDefault()
{
CC_SAFE_DELETE(m_spUserDefault);
@ -377,12 +368,6 @@ bool CCUserDefault::createXMLFile()
bRet = true;
} while (0);
// if doc is not null, free it
if (doc)
{
xmlFreeDoc(doc);
}
return bRet;
}
@ -391,4 +376,13 @@ const string& CCUserDefault::getXMLFilePath()
return m_sFilePath;
}
void CCUserDefault::flush()
{
// save to file
if (g_sharedDoc)
{
xmlSaveFile(CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str(), g_sharedDoc);
}
}
NS_CC_END;

View File

@ -51,6 +51,8 @@ void UserDefaultTest::doTest()
CCLOG("bool is false");
}
//CCUserDefault::sharedUserDefault()->flush();
CCLOG("********************** after change value ***********************");
// change the value
@ -61,6 +63,8 @@ void UserDefaultTest::doTest()
CCUserDefault::sharedUserDefault()->setDoubleForKey("double", 2.6);
CCUserDefault::sharedUserDefault()->setBoolForKey("bool", false);
CCUserDefault::sharedUserDefault()->flush();
// print value
ret = CCUserDefault::sharedUserDefault()->getStringForKey("string");