user_default/CCUserDefaultAndroid

#include "CCUserDefault.h"

#include "platform/CCPlatformConfig.h"

#include "platform/CCCommon.h"


#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include "platform/android/jni/Java_org_cocos2dx_lib_Cocos2dxHelper.h"


// root name of xml

#define USERDEFAULT_ROOT_NAME    "userDefaultRoot"


#define KEEP_COMPATABILITY


#define XML_FILE_NAME "UserDefault.xml"


#ifdef KEEP_COMPATABILITY

#include "platform/CCFileUtils.h"

#include "../tinyxml2/tinyxml2.h"

#endif


using namespace std;


NS_CC_BEGIN


/**

 * implements of CCUserDefault

 */


CCUserDefault* CCUserDefault::m_spUserDefault = 0;

string CCUserDefault::m_sFilePath = string("");

bool CCUserDefault::m_sbIsFilePathInitialized = false;


#ifdef KEEP_COMPATABILITY

static tinyxml2::XMLElement* getXMLNodeForKey(const char* pKey, tinyxml2::XMLDocument **doc)

{

    tinyxml2::XMLElement* curNode = NULL;

    tinyxml2::XMLElement* rootNode = NULL;

    

    if (! CCUserDefault::isXMLFileExist())

    {

        return NULL;

    }

    

    // check the key value

    if (! pKey)

    {

        return NULL;

    }

    

    do

    {

        tinyxml2::XMLDocument* xmlDoc = new tinyxml2::XMLDocument();

        *doc = xmlDoc;

        unsigned long nSize;

        const char* pXmlBuffer = (const char*)CCFileUtils::sharedFileUtils()->getFileData(CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str(), "rb", &nSize);

        //const char* pXmlBuffer = (const char*)data.getBuffer();

        if(NULL == pXmlBuffer)

        {

            CCLOG("can not read xml file");

            break;

        }

        xmlDoc->Parse(pXmlBuffer);

delete[] pXmlBuffer;

        // get root node

        rootNode = xmlDoc->RootElement();

        if (NULL == rootNode)

        {

            CCLOG("read root node error");

            break;

        }

        // find the node

        curNode = rootNode->FirstChildElement();

        if (!curNode)

        {

            // There is not xml node, delete xml file.

            remove(CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str());

            

            return NULL;

        }

        

        while (NULL != curNode)

        {

            const char* nodeName = curNode->Value();

            if (!strcmp(nodeName, pKey))

            {

                // delete the node

                break;

            }

            

            curNode = curNode->NextSiblingElement();

        }

    } while (0);

    

    return curNode;

}


static void deleteNode(tinyxml2::XMLDocument* doc, tinyxml2::XMLElement* node)

{

    if (node)

    {

        doc->DeleteNode(node);

        doc->SaveFile(CCUserDefault::sharedUserDefault()->getXMLFilePath().c_str());

        delete doc;

    }

}


static void deleteNodeByKey(const char *pKey)

{

    tinyxml2::XMLDocument* doc = NULL;

    tinyxml2::XMLElement* node = getXMLNodeForKey(pKey, &doc);

    deleteNode(doc, node);

}

#endif


/**

 * If the user invoke delete CCUserDefault::sharedUserDefault(), should set m_spUserDefault

 * to null to avoid error when he invoke CCUserDefault::sharedUserDefault() later.

 */

CCUserDefault::~CCUserDefault()

{

CC_SAFE_DELETE(m_spUserDefault);

    m_spUserDefault = NULL;

}


CCUserDefault::CCUserDefault()

{

m_spUserDefault = NULL;

}


void CCUserDefault::purgeSharedUserDefault()

{

    m_spUserDefault = NULL;

}


 bool CCUserDefault::getBoolForKey(const char* pKey)

 {

     return getBoolForKey(pKey, false);

 }


bool CCUserDefault::getBoolForKey(const char* pKey, bool defaultValue)

{

#ifdef KEEP_COMPATABILITY

    tinyxml2::XMLDocument* doc = NULL;

    tinyxml2::XMLElement* node = getXMLNodeForKey(pKey, &doc);

    if (node)

    {

        if (node->FirstChild())

        {

            const char* value = (const char*)node->FirstChild()->Value();

            bool ret = (! strcmp(value, "true"));

            

            // set value in NSUserDefaults

            setBoolForKey(pKey, ret);

            flush();

            

            // delete xmle node

            deleteNode(doc, node);

            

            return ret;

        }

        else

        {

            // delete xmle node

            deleteNode(doc, node);

        }

    }

#endif


    return getBoolForKeyJNI(pKey, defaultValue);

}


int CCUserDefault::getIntegerForKey(const char* pKey)

{

    return getIntegerForKey(pKey, 0);

}


int CCUserDefault::getIntegerForKey(const char* pKey, int defaultValue)

{

#ifdef KEEP_COMPATABILITY

    tinyxml2::XMLDocument* doc = NULL;

    tinyxml2::XMLElement* node = getXMLNodeForKey(pKey, &doc);

    if (node)

    {

        if (node->FirstChild())

        {

            int ret = atoi((const char*)node->FirstChild()->Value());

            

            // set value in NSUserDefaults

            setIntegerForKey(pKey, ret);

            flush();

            

            // delete xmle node

            deleteNode(doc, node);

            

            return ret;

        }

        else

        {

            // delete xmle node

            deleteNode(doc, node);

        }

    }

#endif

    

return getIntegerForKeyJNI(pKey, defaultValue);

}


float CCUserDefault::getFloatForKey(const char* pKey)

{

    return getFloatForKey(pKey, 0.0f);

}


float CCUserDefault::getFloatForKey(const char* pKey, float defaultValue)

{

#ifdef KEEP_COMPATABILITY

    tinyxml2::XMLDocument* doc = NULL;

    tinyxml2::XMLElement* node = getXMLNodeForKey(pKey, &doc);

    if (node)

    {

        if (node->FirstChild())

        {

            float ret = atof((const char*)node->FirstChild()->Value());

            

            // set value in NSUserDefaults

            setFloatForKey(pKey, ret);

            flush();

            

            // delete xmle node

            deleteNode(doc, node);

            

            return ret;

        }

        else

        {

            // delete xmle node

            deleteNode(doc, node);

        }

    }

#endif


    return getFloatForKeyJNI(pKey, defaultValue);

}


double  CCUserDefault::getDoubleForKey(const char* pKey)

{

    return getDoubleForKey(pKey, 0.0);

}


double CCUserDefault::getDoubleForKey(const char* pKey, double defaultValue)

{

#ifdef KEEP_COMPATABILITY

    tinyxml2::XMLDocument* doc = NULL;

    tinyxml2::XMLElement* node = getXMLNodeForKey(pKey, &doc);

    if (node)

    {

        if (node->FirstChild())

        {

            double ret = atof((const char*)node->FirstChild()->Value());

            

            // set value in NSUserDefaults

            setDoubleForKey(pKey, ret);

            flush();

            

            // delete xmle node

            deleteNode(doc, node);

            

            return ret;

        }

        else

        {

            // delete xmle node

            deleteNode(doc, node);

        }

    }

#endif


return getDoubleForKeyJNI(pKey, defaultValue);

}


std::string CCUserDefault::getStringForKey(const char* pKey)

{

    return getStringForKey(pKey, "");

}


string CCUserDefault::getStringForKey(const char* pKey, const std::string & defaultValue)

{

#ifdef KEEP_COMPATABILITY

    tinyxml2::XMLDocument* doc = NULL;

    tinyxml2::XMLElement* node = getXMLNodeForKey(pKey, &doc);

    if (node)

    {

        if (node->FirstChild())

        {

            string ret = (const char*)node->FirstChild()->Value();

            

            // set value in NSUserDefaults

            setStringForKey(pKey, ret);

            flush();

            

            // delete xmle node

            deleteNode(doc, node);

            

            return ret;

        }

        else

        {

            // delete xmle node

            deleteNode(doc, node);

        }

    }

#endif


    return getStringForKeyJNI(pKey, defaultValue.c_str());

}


void CCUserDefault::setBoolForKey(const char* pKey, bool value)

{

#ifdef KEEP_COMPATABILITY

    deleteNodeByKey(pKey);

#endif


    return setBoolForKeyJNI(pKey, value);

}


void CCUserDefault::setIntegerForKey(const char* pKey, int value)

{

#ifdef KEEP_COMPATABILITY

    deleteNodeByKey(pKey);

#endif


    return setIntegerForKeyJNI(pKey, value);

}


void CCUserDefault::setFloatForKey(const char* pKey, float value)

{

#ifdef KEEP_COMPATABILITY

    deleteNodeByKey(pKey);

#endif


    return setFloatForKeyJNI(pKey, value);

}


void CCUserDefault::setDoubleForKey(const char* pKey, double value)

{

#ifdef KEEP_COMPATABILITY

    deleteNodeByKey(pKey);

#endif


    return setDoubleForKeyJNI(pKey, value);

}


void CCUserDefault::setStringForKey(const char* pKey, const std::string & value)

{

#ifdef KEEP_COMPATABILITY

    deleteNodeByKey(pKey);

#endif


    return setStringForKeyJNI(pKey, value.c_str());

}


CCUserDefault* CCUserDefault::sharedUserDefault()

{

#ifdef KEEP_COMPATABILITY

    initXMLFilePath();

#endif

    

    if (! m_spUserDefault)

    {

        m_spUserDefault = new CCUserDefault();

    }


    return m_spUserDefault;

}


bool CCUserDefault::isXMLFileExist()

{

    FILE *fp = fopen(m_sFilePath.c_str(), "r");

    bool bRet = false;

    

    if (fp)

    {

        bRet = true;

        fclose(fp);

    }

    

    return bRet;

}


void CCUserDefault::initXMLFilePath()

{

#ifdef KEEP_COMPATABILITY

    if (! m_sbIsFilePathInitialized)

    {

        // UserDefault.xml is stored in /data/data/<package-path>/ before v2.1.2

        m_sFilePath += "/data/data/" + getPackageNameJNI() + "/" + XML_FILE_NAME;

        m_sbIsFilePathInitialized = true;

    }

#endif

}


// create new xml file

bool CCUserDefault::createXMLFile()

{

    return false;

}


const string& CCUserDefault::getXMLFilePath()

{

    return m_sFilePath;

}


void CCUserDefault::flush()

{

}


NS_CC_END


#endif // (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值