コード例 #1
0
ファイル: fileutils.cpp プロジェクト: iebie/DualBootPatcher
PatcherError FileUtils::mzAddFile(zipFile zf,
                                  const std::string &name,
                                  const std::string &path)
{
    // Copy file into archive
    std::ifstream file(path, std::ios::binary);
    if (file.fail()) {
        return PatcherError::createIOError(
                ErrorCode::FileOpenError, path);
    }

    file.seekg(0, std::ios::end);
    auto size = file.tellg();
    file.seekg(0, std::ios::beg);

    bool zip64 = (uint64_t) size >= ((1ull << 32) - 1);

    zip_fileinfo zi;
    memset(&zi, 0, sizeof(zi));

    mzGetFileTime(path, &zi.tmz_date, &zi.dosDate);

    int ret = zipOpenNewFileInZip2_64(
        zf,                     // file
        name.c_str(),           // filename
        &zi,                    // zip_fileinfo
        nullptr,                // extrafield_local
        0,                      // size_extrafield_local
        nullptr,                // extrafield_global
        0,                      // size_extrafield_global
        nullptr,                // comment
        Z_DEFLATED,             // method
        Z_DEFAULT_COMPRESSION,  // level
        0,                      // raw
        zip64                   // zip64
    );

    if (ret != ZIP_OK) {
        FLOGW("minizip: Failed to add file (error code: {}): {}", ret, path);

        return PatcherError::createArchiveError(
                ErrorCode::ArchiveWriteDataError, name);
    }

    // Write data to file
    char buf[32768];
    std::streamsize n;

    while (!file.eof()) {
        file.read(buf, 32768);
        n = file.gcount();

        ret = zipWriteInFileInZip(zf, buf, n);
        if (ret != ZIP_OK) {
            FLOGW("minizip: Failed to write data (error code: {}): {}",
                  ret, path);
            zipCloseFileInZip(zf);

            return PatcherError::createArchiveError(
                    ErrorCode::ArchiveWriteDataError, name);
        }
    }

    if (file.bad()) {
        zipCloseFileInZip(zf);

        return PatcherError::createIOError(
                ErrorCode::FileReadError, path);
    }

    zipCloseFileInZip(zf);

    return PatcherError();
}
コード例 #2
0
ErrorCode FileUtils::mzAddFile(zipFile zf,
                               const std::string &name,
                               const std::string &path)
{
    // Copy file into archive
    io::File file;
    if (!file.open(path, io::File::OpenRead)) {
        FLOGE("%s: Failed to open for reading: %s",
              path.c_str(), file.errorString().c_str());
        return ErrorCode::FileOpenError;
    }

    uint64_t size;
    file.seek(0, io::File::SeekEnd);
    file.tell(&size);
    file.seek(0, io::File::SeekBegin);

    bool zip64 = size >= ((1ull << 32) - 1);

    zip_fileinfo zi;
    memset(&zi, 0, sizeof(zi));

    mzGetFileTime(path, &zi.tmz_date, &zi.dosDate);

    int ret = zipOpenNewFileInZip2_64(
                  zf,                     // file
                  name.c_str(),           // filename
                  &zi,                    // zip_fileinfo
                  nullptr,                // extrafield_local
                  0,                      // size_extrafield_local
                  nullptr,                // extrafield_global
                  0,                      // size_extrafield_global
                  nullptr,                // comment
                  Z_DEFLATED,             // method
                  Z_DEFAULT_COMPRESSION,  // level
                  0,                      // raw
                  zip64                   // zip64
              );

    if (ret != ZIP_OK) {
        FLOGW("minizip: Failed to add file (error code: %d): %s",
              ret, path.c_str());

        return ErrorCode::ArchiveWriteDataError;
    }

    // Write data to file
    char buf[32768];
    uint64_t bytesRead;

    while (file.read(buf, sizeof(buf), &bytesRead)) {
        ret = zipWriteInFileInZip(zf, buf, bytesRead);
        if (ret != ZIP_OK) {
            FLOGW("minizip: Failed to write data (error code: %d): %s",
                  ret, path.c_str());
            zipCloseFileInZip(zf);

            return ErrorCode::ArchiveWriteDataError;
        }
    }
    if (file.error() != io::File::ErrorEndOfFile) {
        zipCloseFileInZip(zf);

        FLOGE("%s: Failed to read file: %s",
              path.c_str(), file.errorString().c_str());
        return ErrorCode::FileReadError;
    }

    zipCloseFileInZip(zf);

    return ErrorCode::NoError;
}