aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/unarchiver/archive.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/unarchiver/archive.h')
-rw-r--r--Src/external_dependencies/openmpt-trunk/unarchiver/archive.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/unarchiver/archive.h b/Src/external_dependencies/openmpt-trunk/unarchiver/archive.h
new file mode 100644
index 00000000..87b508b1
--- /dev/null
+++ b/Src/external_dependencies/openmpt-trunk/unarchiver/archive.h
@@ -0,0 +1,96 @@
+/*
+ * archive.h
+ * ---------
+ * Purpose: archive loader
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
+ */
+
+#pragma once
+
+#include "openmpt/all/BuildSettings.hpp"
+
+#include "../common/FileReader.h"
+#include <string>
+#include <vector>
+
+OPENMPT_NAMESPACE_BEGIN
+
+enum class ArchiveFileType
+{
+ Invalid,
+ Normal,
+ Special,
+};
+
+struct ArchiveFileInfo
+{
+ mpt::PathString name;
+ ArchiveFileType type = ArchiveFileType::Invalid;
+ uint64 size = 0;
+ mpt::ustring comment;
+ uint64 cookie1 = 0;
+ uint64 cookie2 = 0;
+};
+
+class IArchive
+{
+public:
+ using const_iterator = std::vector<ArchiveFileInfo>::const_iterator;
+protected:
+ IArchive() {}
+public:
+ virtual ~IArchive() {}
+
+public:
+ virtual bool IsArchive() const = 0;
+ virtual mpt::ustring GetComment() const = 0;
+ virtual bool ExtractFile(std::size_t index) = 0;
+ virtual FileReader GetOutputFile() const = 0;
+ virtual std::size_t size() const = 0;
+ virtual IArchive::const_iterator begin() const = 0;
+ virtual IArchive::const_iterator end() const = 0;
+ virtual const ArchiveFileInfo & operator [] (std::size_t index) const = 0;
+};
+
+class ArchiveBase
+ : public IArchive
+{
+protected:
+ FileReader inFile;
+ mpt::ustring comment;
+ std::vector<ArchiveFileInfo> contents;
+ std::vector<char> data;
+public:
+ ArchiveBase(const FileReader &inFile)
+ : inFile(inFile)
+ {
+ return;
+ }
+ ~ArchiveBase() override
+ {
+ return;
+ }
+ bool ExtractFile(std::size_t index) override { MPT_UNREFERENCED_PARAMETER(index); return false; } // overwrite this
+public:
+ bool IsArchive() const override
+ {
+ return !contents.empty();
+ }
+ mpt::ustring GetComment() const override
+ {
+ return comment;
+ }
+ FileReader GetOutputFile() const override
+ {
+ return FileReader(mpt::byte_cast<mpt::const_byte_span>(mpt::as_span(data)));
+ }
+ std::size_t size() const override { return contents.size(); }
+ IArchive::const_iterator begin() const override { return contents.begin(); }
+ IArchive::const_iterator end() const override { return contents.end(); }
+ const ArchiveFileInfo & operator [] (std::size_t index) const override { return contents[index]; }
+};
+
+
+OPENMPT_NAMESPACE_END