// 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_
