Exemple #1
0
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();
}
Exemple #2
0
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;
}