static bool InstallCopyFiles() { // extract all payload files one by one (transacted, if possible) ZipFile archive(GetOwnPath()); FileTransaction trans; for (int i = 0; gPayloadData[i].filepath; i++) { // skip files that are only uninstalled if (!gPayloadData[i].install) continue; ScopedMem<WCHAR> filepathT(str::conv::FromUtf8(gPayloadData[i].filepath)); size_t size; ScopedMem<char> data(archive.GetFileData(filepathT, &size)); if (!data) { NotifyFailed(L"Some files to be installed are damaged or missing"); return false; } ScopedMem<WCHAR> extpath(path::Join(gGlobalData.installDir, path::GetBaseName(filepathT))); bool ok = trans.WriteAll(extpath, data, size); if (!ok) { ScopedMem<WCHAR> msg(str::Format(L"Couldn't write %s to disk", filepathT)); NotifyFailed(msg); return false; } // set modification time to original value FILETIME ftModified = archive.GetFileTime(filepathT); trans.SetModificationTime(extpath, ftModified); ProgressStep(); } return trans.Commit(); }
static bool InstallCopyFiles() { FileInfo fileInfos[32]; HRSRC resSrc = FindResource(ghinst, MAKEINTRESOURCE(1), RT_RCDATA); CrashIf(!resSrc); HGLOBAL res = LoadResource(NULL, resSrc); CrashIf(!res); const uint8_t *data = (const uint8_t*)LockResource(res); DWORD dataSize = SizeofResource(NULL, resSrc); // extract all payload files one by one (transacted, if possible) FileTransaction trans; const int32_t *idata = (const int32_t*)data; int32_t fileCount = *idata++; CrashIf(fileCount >= dimof(fileInfos)); int32_t off = 0; for (int32_t i = 0; i < fileCount; i++) { fileInfos[i].off = off; fileInfos[i].sizeUncompressed = *idata++; fileInfos[i].sizeCompressed = *idata++; off += fileInfos[i].sizeCompressed; data = (const uint8_t*)idata; fileInfos[i].name = (const char*)data; while (*data) { ++data; } ++data; idata = (const int32_t*)data; } uint8_t *dst; for (int32_t i = 0; i < fileCount; i++) { ScopedMem<WCHAR> filepathT(str::conv::FromUtf8(fileInfos[i].name)); int32_t srcLen = fileInfos[i].sizeCompressed; off = fileInfos[i].off; const uint8_t *src = data + off; unsigned dstLen; dst = decodeLZMA((uint8_t*)src, (unsigned)srcLen, &dstLen); CrashIf(dstLen != (unsigned)fileInfos[i].sizeUncompressed); ScopedMem<WCHAR> extpath(path::Join(gGlobalData.installDir, path::GetBaseName(filepathT))); bool ok = trans.WriteAll(extpath, dst, dstLen); if (!ok) { ScopedMem<WCHAR> msg(str::Format(_TR("Couldn't write %s to disk"), filepathT)); NotifyFailed(msg); goto Error; } free(dst); // set modification time to original value //FILETIME ftModified = archive.GetFileTime(filepathT); //trans.SetModificationTime(extpath, ftModified); ProgressStep(); } UnlockResource(res); return trans.Commit(); Error: UnlockResource(res); return false; }