📄 hxresmg.cpp
字号:
memset(pStatBuffer,0,sizeof(*pStatBuffer)); if(stat((const char*)pPath, pStatBuffer) < 0) { rc = HXR_FAIL; } return rc;}IHXBuffer* HXExternalResourceManager::ConvertToAsciiString(char* pBuffer, UINT32 nBuffLen){ char* pOut = new char[nBuffLen*2+1]; char* pStartOut = pOut; char Nibble; IHXBuffer* pOutBuffer = new CHXBuffer; pOutBuffer->AddRef(); for (int i = 0; i < (int)nBuffLen; i++) { Nibble = (*pBuffer >> 4) & 15; *pOut= (Nibble > 9 ) ? Nibble + 55 : Nibble + 48; pOut++; Nibble = *pBuffer & 15; *pOut= (Nibble > 9 ) ? Nibble + 55 : Nibble + 48; pOut++; pBuffer++; } *pOut = 0; pOutBuffer->Set((UCHAR*)pStartOut, strlen(pStartOut)+1); delete[] pStartOut; return pOutBuffer;}IHXBuffer* HXExternalResourceManager::ChecksumFile(const char* pPath){ struct stat stat_struct; md5_state_t MD5_data; UCHAR tempbuf[16]; md5_init(&MD5_data); if (HXR_OK != Stat(pPath, &stat_struct)) { md5_finish(tempbuf, &MD5_data); return NULL; } md5_append(&MD5_data,(UCHAR*)&(stat_struct),sizeof(stat_struct)); md5_finish(tempbuf, &MD5_data); return ConvertToAsciiString((char*)tempbuf, sizeof(tempbuf));}HX_RESULTHXExternalResourceManager::SaveFileInfo(const char* pFileName, const char* pPath){ HX_RESULT rc = HXR_OK; // set/reset cache info if(!m_pPrefs) { return HXR_FAIL; } IHXBuffer* pStatInfo = ChecksumFile(pPath); if(pStatInfo) { CHXString prefString; prefString.Format("%s\\%s\\%s\\%s", EXT_RES_DATA_KEY, FILE_INFO_KEY, pFileName, CHECKSUM_KEY); m_pPrefs->WritePref(prefString, pStatInfo); HX_RELEASE(pStatInfo); } // now write out the langages supported in the resource file IHXXResFile* pResFile; if(HXR_OK == m_pHXXResPlugin->QueryInterface(IID_IHXXResFile, (void**)&pResFile)) { HX_RESULT rc = HXR_OK; // open res file and iterate through all of the languages // it supports pResFile->Open(pPath); UINT32 ulLangID = 0; rc = pResFile->GetFirstResourceLanguage(ulLangID); while(HXR_OK == rc) { CHXString prefString; IHXBuffer* pBuffer = new CHXBuffer; prefString.Format("%s\\%s\\%s\\%s\\%ld", EXT_RES_DATA_KEY, FILE_INFO_KEY, pFileName, LANGUAGE_KEY, ulLangID); pBuffer->Set((BYTE*)"", 1); m_pPrefs->WritePref(prefString, pBuffer); HX_RELEASE(pBuffer); rc = pResFile->GetNextResourceLanguage(ulLangID); }; HX_RELEASE(pResFile); } return rc;}HX_RESULTHXExternalResourceManager::LoadResourceFile(const char* pPath){ HX_RESULT rc = HXR_OK; // MakeResFileObject only returns an IHXXResFile // if there are any resources in the current language IHXXResFile* pResFile = MakeResFileObject(pPath); if (pResFile) { if(!m_pResourceList) { m_pResourceList = new CHXSimpleList; } m_pResourceList->AddTail(pResFile); } return rc;}BOOLHXExternalResourceManager::FileInfoCurrent(const char* pFileName, const char* pPath){ BOOL rc = FALSE; IHXBuffer* pStatInfo = ChecksumFile(pPath); if(pStatInfo) { IHXBuffer* pPrefValue = NULL; CHXString prefString; prefString.Format("%s\\%s\\%s\\%s", EXT_RES_DATA_KEY, FILE_INFO_KEY, pFileName, CHECKSUM_KEY); if(HXR_OK == m_pPrefs->ReadPref(prefString, pPrefValue) && pPrefValue) { const char* pActualPrefValue = (const char*)pPrefValue->GetBuffer(); const char* pActualStatInfo = (const char*)pStatInfo->GetBuffer(); if(strcmp(pActualPrefValue, pActualStatInfo) == 0) { rc = TRUE; } HX_RELEASE(pPrefValue); } HX_RELEASE(pStatInfo); } return rc;}BOOLHXExternalResourceManager::ContainsCurrentLanguage(const char* pFileName, const char* pPath){#if defined (_MACINTOSH) || defined (_UNIX) /* Temporary - Mac Installer does not write this pref yet -- XXXRA */ return TRUE;#endif BOOL rc = FALSE; IHXBuffer* pLangInfo = NULL; CHXString prefString; prefString.Format("%s\\%s\\%s\\%s\\%ld", EXT_RES_DATA_KEY, FILE_INFO_KEY, pFileName, LANGUAGE_KEY, m_ulLanguageID); if(HXR_OK == m_pPrefs->ReadPref(prefString, pLangInfo)) { rc = TRUE; HX_RELEASE(pLangInfo); } return rc;}HX_RESULTHXExternalResourceManager::LoadResourceFiles(){ CFindFile* pFileFinder = NULL; char* pResFile = NULL; const char* pFileExtension = "*.xrs"; HX_RESULT rc = HXR_OK; // find plugins with specified pattern pFileFinder = CFindFile::CreateFindFile(m_pExternalResDir, 0, pFileExtension); if (NULL == pFileFinder) { rc = HXR_FAIL; goto cleanup; } // collect plugin info. pResFile = pFileFinder->FindFirst(); while (pResFile) { BOOL bLoadFile = FALSE; const char* pResPath = pFileFinder->GetCurFilePath(); // only load the file if it has resources that reflect // the current system language ID if(!FileInfoCurrent(pResFile, pResPath)) { SaveFileInfo(pResFile, pResPath); } if(ContainsCurrentLanguage(pResFile, pResPath)) { rc = LoadResourceFile(pResPath); } if(HXR_OK != rc) { // error - log it and keep on? } pResFile = pFileFinder->FindNext(); } delete pFileFinder;cleanup: return rc;}// HXExternalResourceReader methodsHXExternalResourceReader::HXExternalResourceReader( HXExternalResourceManager* pMgr): m_lRefCount(0) ,m_pResManager(pMgr) ,m_pResourceList(NULL) ,m_pDefaultRes(NULL){}HXExternalResourceReader::~HXExternalResourceReader(){ HX_DELETE(m_pResourceList); HX_RELEASE(m_pDefaultRes);}// IUnknown methodsSTDMETHODIMP HXExternalResourceReader::QueryInterface(REFIID riid, void** ppvObj){ QInterfaceList qiList[] = { { GET_IIDHANDLE(IID_IHXExternalResourceReader), (IHXExternalResourceReader*)this }, { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXExternalResourceReader*)this }, }; return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);}STDMETHODIMP_(ULONG32) HXExternalResourceReader::AddRef(){ return InterlockedIncrement(&m_lRefCount);}STDMETHODIMP_(ULONG32) HXExternalResourceReader::Release(){ if (InterlockedDecrement(&m_lRefCount) > 0) { return m_lRefCount; } delete this; return 0;}STDMETHODIMPHXExternalResourceReader::SetDefaultResourceFile( const char* pResourcePath){ HX_RESULT rc = HXR_OK; m_pDefaultRes = m_pResManager->MakeResFileObject(pResourcePath); return rc;}IHXXResource*HXExternalResourceReader::GetResource(IHXXResFile* pResFile, UINT32 ulResourceType, UINT32 ulResourceID){ IHXXResource* pRes = NULL; switch(ulResourceType) { case HX_RT_STRING: { pRes = pResFile->GetString(ulResourceID); } break; case HX_RT_DIALOG: { pRes = pResFile->GetDialog(ulResourceID); } break; case HX_RT_BITMAP: { pRes = pResFile->GetBitmap(ulResourceID); } break; default: break; } return pRes;}STDMETHODIMP_(IHXXResource*)HXExternalResourceReader::GetResource(UINT32 ulResourceType, UINT32 ulResourceID){ IHXXResource* pRes = NULL; if(m_pResourceList) { CHXSimpleList::Iterator i = m_pResourceList->Begin(); for (; i != m_pResourceList->End(); ++i) { IHXXResFile* pResFile = (IHXXResFile*)(*i); pRes = GetResource(pResFile, ulResourceType, ulResourceID); if(pRes) { break; } } } if(!pRes && m_pDefaultRes) // check default { pRes = GetResource(m_pDefaultRes, ulResourceType, ulResourceID); } return pRes;}HX_RESULTHXExternalResourceReader::Init(const char* pShortName, CHXSimpleList* pResList){ HX_RESULT rc = HXR_OK; if(pResList) { CHXSimpleList::Iterator i = pResList->Begin(); for (; i != pResList->End(); ++i) { IHXXResFile* pResFile = (IHXXResFile*)(*i); if(pResFile->IncludesShortName(pShortName)) { if(!m_pResourceList) { m_pResourceList = new CHXSimpleList; } m_pResourceList->AddTail(pResFile); } } } return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -