BOOL CSoftUninstall::LoadPinYin() { CDataFileLoader loader; BkDatLibContent content; if(!loader.GetLibDatContent((_ksafePath + SOFT_PINYIN_DAT).c_str(), content)) return FALSE; TiXmlDocument plugins; if(plugins.Parse((char*)content.pBuffer) == NULL) return FALSE; TiXmlHandle hRoot(plugins.FirstChildElement("fonts")); for(TiXmlElement *pElem = hRoot.FirstChildElement("font").Element(); pElem != NULL; pElem = pElem->NextSiblingElement()) { LPCSTR pHan = pElem->Attribute("c"); if(pHan == NULL) continue; PinYin pinyin; pinyin._whole = pElem->Attribute("p"); pinyin._acronym = pElem->Attribute("s"); _hashPinYin.insert(make_pair(pHan, pinyin)); } return TRUE; }
HRESULT STDMETHODCALLTYPE CSoftMgrUpdateHelper::Combine( LPCWSTR lpwszDifflib ) { #if OPEN_VCDIFF // 加载Delta BkDatLibContent delta; CDataFileLoader loader; if(!loader.GetLibDatContent(lpwszDifflib, delta)) return ::HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); // 目标文件路径 wchar_t szDstPath[MAX_PATH] = {0}; { ::GetModuleFileNameW(NULL, szDstPath, MAX_PATH); ::PathRemoveFileSpecW(szDstPath); wcscat_s(szDstPath, MAX_PATH, L"\\KSoft\\Data\\"); wcscat_s(szDstPath, MAX_PATH, ::PathFindFileNameW(lpwszDifflib)); // //@Issue // 根据名称来判断库类型 // //@Note // 命名规则为:libname_old_new.dat // LPWSTR pSep = wcschr(::PathFindFileNameW(szDstPath), L'_'); if(pSep == NULL) return ::HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); pSep[0] = L'\0'; wcscat_s(szDstPath, MAX_PATH, L".dat"); } // 加载字典文件 CAtlFile dictFile; HRESULT hr = dictFile.Create(szDstPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING); if(!SUCCEEDED(hr)) return hr; ULONGLONG dictSize; hr = dictFile.GetSize(dictSize); if(!SUCCEEDED(hr)) return hr; auto_buffer<char> dict(static_cast<size_t>(dictSize)); if(dict.empty()) return ::HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY); DWORD bytesRead; hr = dictFile.Read(dict.data(), static_cast<DWORD>(dict.size()), bytesRead); if(!SUCCEEDED(hr)) return hr; dictFile.Close(); // 创建目标临时文件 CAtlTemporaryFile tempTarget; hr = tempTarget.Create(); if(!SUCCEEDED(hr)) return hr; // // 开始合并 // //@Note // Dict(Source) + Delta => Target // Output2File output2File(tempTarget); { VCDiffStreamingDecoder decoder; decoder.StartDecoding(&dict[0], dict.size()); size_t beg = 0; size_t end = static_cast<size_t>(delta.nLen); LPCSTR pDelta = reinterpret_cast<LPCSTR>(delta.pBuffer); while(beg < end) { static const size_t MAX_THUNK_SIZE = 16*1024; size_t size = end - beg; if(size > MAX_THUNK_SIZE) size = MAX_THUNK_SIZE; if(!decoder.DecodeChunkToInterface(pDelta + beg, size, &output2File)) return ::HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); beg += size; } if(!decoder.FinishDecoding()) return ::HRESULT_FROM_WIN32(ERROR_BAD_FORMAT); } // 根据写入文件大小与期望大小来判断是否合并成功 ULONGLONG dstSize; hr = tempTarget.GetPosition(dstSize); if(!SUCCEEDED(hr) || dstSize != output2File.GetTotalBytes()) return ::HRESULT_FROM_WIN32(ERROR_WRITE_FAULT); // 移动到目标路径 return tempTarget.Close(szDstPath); #else return S_OK; #endif }