📄 chxliteprefs.cpp
字号:
{ eState = eParsingComment; } break; default: { eState = eParsingName; sName = *pos; // don't lose this char } } ++pos; --nCount; } break; default: HX_ASSERT(false); break; } } return HXR_OK;}voidLitePrefs::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;}BOOLLitePrefs::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;}BOOLLitePrefs::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();}inlineCHXString CHXLitePrefs::GetFullPath(const CHXString& strFileName){ return HXPathUtil::CombinePath(m_strRootPath, strFileName);}voidCHXLitePrefs::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);}// IHXPreferencesSTDMETHODIMPCHXLitePrefs::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;}STDMETHODIMPCHXLitePrefs::SetAutoCommit(bool bAutoCommit){ // if false, client must explicitly call Commit() to save changes after write m_bAutoCommit = bAutoCommit; return HXR_OK;}voidCHXLitePrefs::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 }}STDMETHODIMPCHXLitePrefs::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;}// IHXPreferences3STDMETHODIMPCHXLitePrefs::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;}STDMETHODIMPCHXLitePrefs::OpenShared(const char* pCompanyName){ return HXR_NOTIMPL; //Open(pCompanyName, "Shared", 0, 0);}STDMETHODIMPCHXLitePrefs::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) //STDMETHODIMPCHXLitePrefs::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;}STDMETHODIMPCHXLitePrefs::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;}STDMETHODIMPCHXLitePrefs::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)STDMETHODIMPCHXLitePrefs::Func(){ m_hCallback = (CallbackHandle)NULL; HX_VERIFY(SUCCEEDED(Commit())); return HXR_OK;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -