HRESULT CAssemblyStream::AddSizeToItem( ) { HRESULT hr=S_OK; DWORD dwFileSizeLow = 0, dwFileSizeHigh = 0; hr = GetFileSizeRoundedToCluster(_hf, &dwFileSizeLow, &dwFileSizeHigh); if(SUCCEEDED(hr)) { _pParent->AddStreamSize(dwFileSizeLow, dwFileSizeHigh); } return hr ; }
HRESULT GetAssemblyKBSize(LPWSTR pszManifestPath, DWORD *pdwSizeinKB, LPFILETIME pftLastAccess, LPFILETIME pftCreation) { HRESULT hr = S_OK; LPWSTR pszTemp=NULL; TCHAR szSearchPath[MAX_PATH+1]; HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA FindFileData; DWORD dwLen = 0; DWORD dwAsmSize=0; LPWSTR pszManifestFileName=NULL; dwLen = lstrlen(pszManifestPath); ASSERT(dwLen <= MAX_PATH); if(pftLastAccess) memset(pftLastAccess, 0, sizeof(FILETIME)); pszManifestFileName = PathFindFileName(pszManifestPath); if(!pszManifestFileName || (pszManifestFileName <= pszManifestPath) ) { hr = E_FAIL; goto exit; } wnsprintf(szSearchPath, MAX_PATH, L"%s", pszManifestPath); pszTemp = PathFindFileName(szSearchPath); if(!pszTemp || (pszTemp <= szSearchPath) ) { hr = E_FAIL; goto exit; } *(pszTemp-1) = '\0'; // knock-off filename from szSearchPath wnsprintf(szSearchPath, MAX_PATH, L"%s\\*", szSearchPath); hFind = FindFirstFile(szSearchPath, &FindFileData); if(hFind == INVALID_HANDLE_VALUE) { hr = FusionpHresultFromLastError(); goto exit; } do { // skip directories if (!StrCmp(FindFileData.cFileName, L"..")) continue; // count the size of dir ?? if (!StrCmp(FindFileData.cFileName, L".")) continue; if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { // this is assembly Dir; what are dirs doing here ?? continue; } hr = GetFileSizeRoundedToCluster(INVALID_HANDLE_VALUE, &(FindFileData.nFileSizeLow), &(FindFileData.nFileSizeHigh)); if(FAILED(hr)) goto exit; dwAsmSize += GetFileSizeInKB(FindFileData.nFileSizeLow, FindFileData.nFileSizeHigh); if(pftLastAccess && pftCreation && !StrCmpI(pszManifestFileName, FindFileData.cFileName)) { memcpy(pftLastAccess, &(FindFileData.ftLastAccessTime), sizeof(FILETIME)); memcpy(pftCreation, &(FindFileData.ftCreationTime), sizeof(FILETIME)); } }while(FindNextFile(hFind, &FindFileData)); if( GetLastError() != ERROR_NO_MORE_FILES) { hr = FusionpHresultFromLastError(); goto exit; } if(pdwSizeinKB) { *pdwSizeinKB = dwAsmSize; } exit: if(hFind != INVALID_HANDLE_VALUE) FindClose(hFind); return hr; }
HRESULT StoreFusionInfo(IAssemblyName *pName, LPWSTR pszDir, DWORD *pdwFileSizeLow) { HRESULT hr = S_OK; WCHAR pszFilePath[MAX_PATH+1]; PBYTE pMVID=NULL; PBYTE pCustom=NULL; LPWSTR pszCustomString=NULL; LPWSTR pszURL=NULL; LPWSTR pszDisplayName=NULL; DWORD cbSize=0; BOOL fRet = FALSE; DWORD dwSize; LPWSTR pszBuf=NULL; HINI hIni=NULL; if(( lstrlenW(pszDir) + lstrlenW(g_FusionInfoFile) + 1) >= MAX_PATH) { hr = HRESULT_FROM_WIN32(FUSION_E_INVALID_NAME); goto exit; } StrCpy(pszFilePath, pszDir); PathAddBackslash(pszFilePath); StrCat(pszFilePath, g_FusionInfoFile); if ((hIni = PAL_IniCreate()) == NULL) { hr = FusionpHresultFromLastError(); goto exit; } #define _WriteString(section, key, value) PAL_IniWriteString(hIni, section, key, value) pszBuf = NEW(WCHAR[MAX_URL_LENGTH+1]); if (!pszBuf) { hr = E_OUTOFMEMORY; goto exit; } cbSize = 0; if(FAILED(hr = NameObjGetWrapper(pName, ASM_NAME_MVID, &pMVID, &cbSize))) goto exit; if(cbSize && (cbSize == MVID_LENGTH)) { CParseUtils::BinToUnicodeHex(pMVID, cbSize, pszBuf); pszBuf[MVID_LENGTH*2] = L'\0'; fRet = _WriteString(ASSEMBLY_INFO_STRING, MVID_KEY_STRING, pszBuf); if (!fRet) { hr = FusionpHresultFromLastError(); goto exit; } } cbSize = 0; if(FAILED(hr = NameObjGetWrapper(pName, ASM_NAME_CUSTOM, &pCustom, &cbSize))) goto exit; if(cbSize) { pszCustomString = (LPWSTR) pCustom; fRet = _WriteString(ASSEMBLY_INFO_STRING, CUSTOM_BLOB_STRING, pszCustomString); if (!fRet) { hr = FusionpHresultFromLastError(); goto exit; } } else { // if there is no Custom Blob try storing URL. cbSize = 0; if(FAILED(hr = NameObjGetWrapper(pName, ASM_NAME_CODEBASE_URL, (LPBYTE*) &pszURL, &cbSize))) goto exit; if(cbSize) { fRet = _WriteString(ASSEMBLY_INFO_STRING, URL_STRING, pszURL); if (!fRet) { hr = FusionpHresultFromLastError(); goto exit; } } dwSize = 0; hr = pName->GetDisplayName(NULL, &dwSize, 0); if (hr != HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)) { ASSERT(0); hr = E_UNEXPECTED; goto exit; } pszDisplayName = NEW(WCHAR[dwSize]); if (!pszDisplayName) { hr = E_OUTOFMEMORY; goto exit; } hr = pName->GetDisplayName(pszDisplayName, &dwSize, 0); if (FAILED(hr)) { goto exit; } cbSize = dwSize * sizeof(WCHAR); if(cbSize) { fRet = _WriteString(ASSEMBLY_INFO_STRING, DISPLAY_NAME_STRING, pszDisplayName); if (!fRet) { hr = FusionpHresultFromLastError(); goto exit; } } } if (!PAL_IniSave(hIni, pszFilePath, TRUE)) { hr = FusionpHresultFromLastError(); goto exit; } { DWORD dwSizeHigh=0; *pdwFileSizeLow = 512; // hard-code info file size. hr = GetFileSizeRoundedToCluster(INVALID_HANDLE_VALUE, pdwFileSizeLow, &dwSizeHigh); } exit: if (hIni != NULL) PAL_IniClose(hIni); SAFEDELETEARRAY(pszBuf); SAFEDELETEARRAY(pszDisplayName); SAFEDELETEARRAY(pMVID); SAFEDELETEARRAY(pCustom); SAFEDELETEARRAY(pszURL); return hr; }