12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- // Copyright 2017 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_
- #define THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_
- #include <memory>
- #include <vector>
- #include "base/files/file_path.h"
- #include "build/build_config.h"
- #include "third_party/zlib/google/zip.h"
- #if defined(USE_SYSTEM_MINIZIP)
- #include <minizip/unzip.h>
- #include <minizip/zip.h>
- #else
- #include "third_party/zlib/contrib/minizip/unzip.h"
- #include "third_party/zlib/contrib/minizip/zip.h"
- #endif
- namespace zip {
- namespace internal {
- // A class used to write entries to a ZIP file and buffering the reading of
- // files to limit the number of calls to the FileAccessor. This is for
- // performance reasons as these calls may be expensive when IPC based).
- // This class is so far internal and only used by zip.cc, but could be made
- // public if needed.
- class ZipWriter {
- public:
- // Creates a writer that will write a ZIP file to |zip_file_fd|/|zip_file|
- // and which entries (specifies with AddEntries) are relative to |root_dir|.
- // All file reads are performed using |file_accessor|.
- #if defined(OS_POSIX)
- static std::unique_ptr<ZipWriter> CreateWithFd(int zip_file_fd,
- const base::FilePath& root_dir,
- FileAccessor* file_accessor);
- #endif
- static std::unique_ptr<ZipWriter> Create(const base::FilePath& zip_file,
- const base::FilePath& root_dir,
- FileAccessor* file_accessor);
- ~ZipWriter();
- // Writes the files at |paths| to the ZIP file and closes this Zip file.
- // Note that the the FilePaths must be relative to |root_dir| specified in the
- // Create method.
- // Returns true if all entries were written successfuly.
- bool WriteEntries(const std::vector<base::FilePath>& paths);
- private:
- ZipWriter(zipFile zip_file,
- const base::FilePath& root_dir,
- FileAccessor* file_accessor);
- // Writes the pending entries to the ZIP file if there are at least
- // |kMaxPendingEntriesCount| of them. If |force| is true, all pending entries
- // are written regardless of how many there are.
- // Returns false if writing an entry fails, true if no entry was written or
- // there was no error writing entries.
- bool FlushEntriesIfNeeded(bool force);
- // Adds the files at |paths| to the ZIP file. These FilePaths must be relative
- // to |root_dir| specified in the Create method.
- bool AddEntries(const std::vector<base::FilePath>& paths);
- // Closes the ZIP file.
- // Returns true if successful, false otherwise (typically if an entry failed
- // to be written).
- bool Close();
- // The entries that have been added but not yet written to the ZIP file.
- std::vector<base::FilePath> pending_entries_;
- // The actual zip file.
- zipFile zip_file_;
- // Path to the directory entry paths are relative to.
- base::FilePath root_dir_;
- // Abstraction over file access methods used to read files.
- FileAccessor* file_accessor_;
- DISALLOW_COPY_AND_ASSIGN(ZipWriter);
- };
- } // namespace internal
- } // namespace zip
- #endif // THIRD_PARTY_ZLIB_GOOGLE_ZIP_WRITER_H_
|