summaryrefslogtreecommitdiffstats
path: root/include/orcus/zip_archive.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/orcus/zip_archive.hpp')
-rw-r--r--include/orcus/zip_archive.hpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/include/orcus/zip_archive.hpp b/include/orcus/zip_archive.hpp
new file mode 100644
index 0000000..afc6727
--- /dev/null
+++ b/include/orcus/zip_archive.hpp
@@ -0,0 +1,126 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_ZIP_ARCHIVE_HPP
+#define INCLUDED_ORCUS_ZIP_ARCHIVE_HPP
+
+#include "env.hpp"
+#include "exception.hpp"
+
+#include <string_view>
+#include <vector>
+#include <memory>
+#include <ostream>
+
+namespace orcus {
+
+/**
+ * Structure containing file entry header attributes.
+ */
+struct ORCUS_PSR_DLLPUBLIC zip_file_entry_header
+{
+ uint32_t header_signature = 0;
+ uint16_t required_version = 0;
+ uint16_t flag = 0;
+ uint16_t compression_method = 0;
+ uint16_t last_modified_time = 0;
+ uint16_t last_modified_date = 0;
+ uint32_t crc32 = 0;
+ uint32_t compressed_size = 0;
+ uint32_t uncompressed_size = 0;
+
+ std::string filename;
+ std::vector<uint8_t> extra_field;
+
+ zip_file_entry_header();
+ zip_file_entry_header(const zip_file_entry_header& other);
+ zip_file_entry_header(zip_file_entry_header&& other);
+ ~zip_file_entry_header();
+
+ zip_file_entry_header& operator=(const zip_file_entry_header& other);
+ zip_file_entry_header& operator=(zip_file_entry_header&& other);
+};
+
+ORCUS_PSR_DLLPUBLIC std::ostream& operator<<(std::ostream& os, const zip_file_entry_header& header);
+
+class zip_archive_stream;
+
+class ORCUS_PSR_DLLPUBLIC zip_archive
+{
+ class impl;
+
+ std::unique_ptr<impl> mp_impl;
+
+public:
+ zip_archive() = delete;
+ zip_archive(const zip_archive&) = delete;
+ zip_archive& operator= (const zip_archive) = delete;
+
+ zip_archive(zip_archive_stream* stream);
+ ~zip_archive();
+
+ /**
+ * Loading involves the parsing of the central directory of a zip archive
+ * (located toward the end of the stream) and building of file entry data
+ * which are stored in the central directory.
+ */
+ void load();
+
+ /**
+ * Retrieve the header information for a file entry specified by index.
+ *
+ * @param index file entry index.
+ *
+ * @return header information for a file entry.
+ */
+ zip_file_entry_header get_file_entry_header(std::size_t index) const;
+
+ /**
+ * Retrieve the header information for a file entry specified by name.
+ *
+ * @param name file entry name.
+ *
+ * @return header information for a file entry.
+ */
+ zip_file_entry_header get_file_entry_header(std::string_view name) const;
+
+ /**
+ * Get file entry name from its index.
+ *
+ * @param index file entry index
+ *
+ * @return file entry name
+ */
+ std::string_view get_file_entry_name(std::size_t index) const;
+
+ /**
+ * Return the number of file entries stored in this zip archive. Note
+ * that a file entry may be a directory, so the number of files stored in
+ * the zip archive may not equal the number of file entries.
+ *
+ * @return number of file entries.
+ */
+ size_t get_file_entry_count() const;
+
+ /**
+ * Retrieve data stream of specified file entry. The retrieved data stream
+ * gets uncompressed if the original stream is compressed.
+ *
+ * @param entry_name file entry name.
+ *
+ * @return buffer containing the data stream for specified entry.
+ *
+ * @exception zip_error thrown when any problem is encountered during data
+ * stream retrieval.
+ */
+ std::vector<unsigned char> read_file_entry(std::string_view entry_name) const;
+};
+
+}
+
+#endif
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */