Files
comaps/coding/zip_reader.hpp
Konstantin Pastbin e3e4a1985a Organic Maps sources as of 02.04.2025 (fad26bbf22ac3da75e01e62aa01e5c8e11861005)
To expand with full Organic Maps and Maps.ME commits history run:
  git remote add om-historic [om-historic.git repo url]
  git fetch --tags om-historic
  git replace squashed-history historic-commits
2025-05-08 21:10:51 +07:00

58 lines
1.8 KiB
C++

#pragma once
#include "coding/file_reader.hpp"
#include "coding/file_writer.hpp"
#include "base/exception.hpp"
#include <cstddef>
#include <cstdint>
#include <functional>
#include <string>
#include <utility>
#include <vector>
class ZipFileReader : public FileReader
{
public:
struct Delegate
{
virtual ~Delegate() = default;
// When |size| is zero, end of file is reached.
virtual void OnBlockUnzipped(size_t size, char const * data) = 0;
virtual void OnStarted() {}
virtual void OnCompleted() {}
};
using ProgressFn = std::function<void(uint64_t, uint64_t)>;
/// Contains file name inside zip and it's uncompressed size
using FileList = std::vector<std::pair<std::string, uint32_t>>;
DECLARE_EXCEPTION(OpenZipException, OpenException);
DECLARE_EXCEPTION(LocateZipException, OpenException);
DECLARE_EXCEPTION(InvalidZipException, OpenException);
ZipFileReader(std::string const & container, std::string const & file,
uint32_t logPageSize = FileReader::kDefaultLogPageSize,
uint32_t logPageCount = FileReader::kDefaultLogPageCount);
/// @note Size() returns compressed file size inside zip
uint64_t UncompressedSize() const { return m_uncompressedFileSize; }
/// @warning Can also throw Writer::OpenException and Writer::WriteException
static void UnzipFile(std::string const & zipContainer, std::string const & fileInZip,
Delegate & delegate);
static void UnzipFile(std::string const & zipContainer, std::string const & fileInZip,
std::string const & outPath);
static void FilesList(std::string const & zipContainer, FileList & filesList);
/// Quick version without exceptions
static bool IsZip(std::string const & zipContainer);
private:
uint64_t m_uncompressedFileSize;
};