⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chxliteprefs.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                    {
                        eState = eParsingComment;
                    }
                    break;

                    default:
                    {
                        eState = eParsingName;
                        sName = *pos; // don't lose this char
                    }
                }
                ++pos;
                --nCount;
        }
        break;
        default:
            HX_ASSERT(false);
            break;
        }
    }

    return HXR_OK;
}



void
LitePrefs::ClearPrefs(CHXMapStringToOb* pPrefs)
{
    POSITION pos = pPrefs->GetStartPosition();
    while(pos != NULL)
    {
        Pref * pPref = NULL;
        char * szPrefKey = NULL;
        pPrefs->GetNextAssoc( pos, (const char*&) szPrefKey, (void*&) pPref );
        HX_ASSERT(pPref);
        delete pPref;
    }
    pPrefs->RemoveAll();
}

HX_RESULT 
LitePrefs::RetrievePref(IHXCommonClassFactory* pFactory,
			   const CHXMapStringToOb* pPrefs,
			   const char* pName,
			   REF(IHXBuffer*) pValue)
{
    HX_RESULT res = HXR_FAIL;

    Pref* pPref = NULL;
    if (pPrefs->Lookup(pName, (void*&)pPref))
    {
	res = pFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pValue);
	if (SUCCEEDED(res))
	{
	    res = pValue->Set((const UCHAR*)pPref->Buffer(), 
				   pPref->Size());
	}
    }

    return res;
}

BOOL
LitePrefs::SkipToken(char*& pos, INT32& nCount, char term)
{
    BOOL bRet = FALSE;

    while (*pos != term && nCount != 0)
    {
        ++pos;
        --nCount;
    }

    if( nCount != 0 )
    {
        // skip term
        ++pos;
        --nCount;
        bRet = TRUE;
    }

    return bRet;
}

BOOL
LitePrefs::ParseToken(char*& pos, INT32& nCount, char term, CHXString& token)
{
    BOOL bRet = FALSE;

    while (*pos != term && nCount != 0)
    {
        token += *pos;
        ++pos;
        --nCount;
    }

    if( nCount != 0 )
    {
        // skip term
        ++pos;
        --nCount;

        // trim white space around token
        token.TrimLeft();
        token.TrimRight();

        bRet = TRUE;
    }

    return bRet;
}



//
// class CHXLitePrefs
//
CHXLitePrefs::CHXLitePrefs(const char* pRootPath)
: m_pMutex(NULL)
, m_pFactory(NULL)
, m_pScheduler(NULL)
, m_hCallback((CallbackHandle)NULL)
, m_strRootPath(pRootPath)
, m_bAutoCommit(true)
{
#ifdef THREADS_SUPPORTED
    HXMutex::MakeMutex(m_pMutex);
#else
    HXMutex::MakeStubMutex(m_pMutex);
#endif
    m_prefs.SetCaseSensitive(FALSE);
}


CHXLitePrefs::~CHXLitePrefs()
{
    Close();
}

inline
CHXString CHXLitePrefs::GetFullPath(const CHXString& strFileName)
{
    return HXPathUtil::CombinePath(m_strRootPath, strFileName);
}

void
CHXLitePrefs::Close()
{
#if !defined(HELIX_CONFIG_LITEPREFS_SLUGGISH_OUT)
    // remove pending callback
    if (m_hCallback)
    {
	m_pScheduler->Remove(m_hCallback);
        m_hCallback = (CallbackHandle)NULL;
    }
#endif // (HELIX_CONFIG_LITEPREFS_SLUGGISH_OUT)

    // commit changes
    Commit();

    // cleanup
    LitePrefs::ClearPrefs(&m_prefs);
    HX_RELEASE(m_pFactory);
    HX_RELEASE(m_pScheduler);
    HX_DELETE(m_pMutex);
}


// IHXPreferences

STDMETHODIMP
CHXLitePrefs::ReadPref(const char* pName, REF(IHXBuffer*) pValue)
{
    HX_RESULT res = HXR_FAIL;

    if (pName && m_pFactory)
    {
	m_pMutex->Lock();

	res = LitePrefs::RetrievePref(m_pFactory, &m_prefs, pName, pValue);

	m_pMutex->Unlock();
    }

    return res;
}

STDMETHODIMP
CHXLitePrefs::SetAutoCommit(bool bAutoCommit)
{
    // if false, client must explicitly call Commit() to save changes after write
    m_bAutoCommit = bAutoCommit;
    return HXR_OK;
}

void
CHXLitePrefs::PossiblyCommitPrefChange()
{
    if (m_bAutoCommit)
    {
#if defined(HELIX_CONFIG_LITEPREFS_SLUGGISH_OUT)      
        HX_VERIFY(SUCCEEDED(Commit()));
#else
        // schedule a callback and commit the changes
        // so that multiple WritePref calls result in only one write to file
	if (!m_hCallback && m_pScheduler)
	{
	    m_hCallback = m_pScheduler->RelativeEnter(this, 0);
	    HX_ASSERT(m_hCallback);
	}
	else if (!m_pScheduler)
	{
	    // lame... no scheduler!
	    HX_VERIFY(SUCCEEDED(Commit()));
	}
#endif
    }
}

STDMETHODIMP
CHXLitePrefs::WritePref(const char* pName, IHXBuffer* pValue)
{
    HX_RESULT res = HXR_FAIL;

    if (pName && pValue)
    {
	m_pMutex->Lock();
	res = LitePrefs::StorePref(&m_prefs, pName, (const char*)pValue->GetBuffer());
        if(SUCCEEDED(res))
        {
            PossiblyCommitPrefChange();
        }
        m_pMutex->Unlock();
    }

    return res;
}

// IHXPreferences3
STDMETHODIMP
CHXLitePrefs::Open(const char* pCompanyName,
		   const char* pProductName,
		   ULONG32 nProdMajorVer,
		   ULONG32 nProdMinorVer)
{
    HX_RESULT res = HXR_INVALID_PARAMETER;

    if (pProductName)
    {
        m_strFileName.Format("%s_%lu_%lu.cfg",pProductName, nProdMajorVer, nProdMinorVer); 

	LitePrefs::ClearPrefs(&m_prefs);
    
        CHXString strPath = GetFullPath(m_strFileName);
        res = LitePrefs::ReadPrefs(strPath, &m_prefs);
    }
    return res;
}


STDMETHODIMP
CHXLitePrefs::OpenShared(const char* pCompanyName)
{
    return HXR_NOTIMPL; //Open(pCompanyName, "Shared", 0, 0);
}


STDMETHODIMP
CHXLitePrefs::DeletePref(const char* pPrefKey)
{
    HX_RESULT hr = HXR_FAIL;
    Pref* pPref = NULL;

    m_pMutex->Lock();
    if (m_prefs.Lookup(pPrefKey, (void*&)pPref))
    {
	// delete the pref
        m_prefs.RemoveKey(pPrefKey);
	delete pPref;

        PossiblyCommitPrefChange();
        hr = HXR_OK;
    }
    m_pMutex->Unlock();

    return hr;
}

//
// Restore primary pref file so it contains no pref
// settings (and update current prefs accordingly) 
//
STDMETHODIMP
CHXLitePrefs::ResetPrefs()
{
    m_pMutex->Lock();
    // force re-write of file so only shadow references remain.
    LitePrefs::ClearPrefs(&m_prefs);
    Commit();

    // re-build memory prefs (so default values from shadows are set)
    CHXString strPrimaryFilePath = GetFullPath(m_strFileName);
    HX_RESULT hr = LitePrefs::ReadPrefs(strPrimaryFilePath, &m_prefs);
    m_pMutex->Lock();

    return hr;
}




STDMETHODIMP
CHXLitePrefs::SetContext(IUnknown* pContext)
{
    HX_RESULT res = HXR_FAIL;

    if (!m_pFactory && pContext)
    {
	res = pContext->QueryInterface(IID_IHXCommonClassFactory,
				       (void**)&m_pFactory);
	HX_ASSERT(SUCCEEDED(res));

#if !defined(HELIX_CONFIG_LITEPREFS_SLUGGISH_OUT)
	res = pContext->QueryInterface(IID_IHXScheduler,
				       (void**)&m_pScheduler);
	HX_ASSERT(SUCCEEDED(res));
#endif // (HELIX_CONFIG_LITEPREFS_SLUGGISH_OUT)
    }

    return res;
}


STDMETHODIMP
CHXLitePrefs::Commit()
{
    HX_RESULT res = HXR_NOT_INITIALIZED;
    
    if (m_strFileName)
    {
	m_pMutex->Lock();

        CHXString strPath = GetFullPath(m_strFileName);
	res = LitePrefs::WritePrefs(&m_prefs, strPath);

	m_pMutex->Unlock();
    }

    return res;
}

// IHXCallback
#if !defined(HELIX_CONFIG_LITEPREFS_SLUGGISH_OUT)
STDMETHODIMP
CHXLitePrefs::Func()
{
    m_hCallback = (CallbackHandle)NULL;

    HX_VERIFY(SUCCEEDED(Commit()));

    return HXR_OK;
}
#endif




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -