Path: blob/master/Common/File/VFS/SevenZipFileReader.h
10523 views
#pragma once12#include <cstdint>3#include <mutex>4#include <set>5#include <string>6#include <string_view>7#include <vector>89#include "Common/CommonWindows.h"1011#include "ext/lzma-sdk/7z.h"12#include "ext/lzma-sdk/7zFile.h"1314#include "Common/File/VFS/VFS.h"15#include "Common/File/FileUtil.h"16#include "Common/File/Path.h"1718class SevenZipFileReader : public VFSBackend {19public:20static SevenZipFileReader *Create(const Path &archivePath, std::string_view inArchivePath, bool logErrors = true);21~SevenZipFileReader();2223bool IsValid() const { return valid_; }2425// Use delete[] on the returned value.26uint8_t *ReadFile(std::string_view path, size_t *size) override;2728VFSFileReference *GetFile(std::string_view path) override;29bool GetFileInfo(VFSFileReference *vfsReference, File::FileInfo *fileInfo) override;30void ReleaseFile(VFSFileReference *vfsReference) override;3132VFSOpenFile *OpenFileForRead(VFSFileReference *vfsReference, size_t *size) override;33void Rewind(VFSOpenFile *vfsOpenFile) override;34size_t Read(VFSOpenFile *vfsOpenFile, void *buffer, size_t length) override;35void CloseFile(VFSOpenFile *vfsOpenFile) override;3637bool GetFileListing(std::string_view path, std::vector<File::FileInfo> *listing, const char *filter) override;38bool GetFileInfo(std::string_view path, File::FileInfo *info) override;39std::string toString() const override {40std::string retval = archivePath_.ToVisualString();41if (!inArchivePath_.empty()) {42retval += ": ";43retval += inArchivePath_;44}45return retval;46}4748private:49struct SevenZipEntry {50std::string path;51bool isDirectory = false;52uint64_t size = 0;53};5455SevenZipFileReader(const Path &archivePath, const std::string &inArchivePath);56bool OpenArchive(bool logErrors);57void CloseArchive();58bool BuildEntryCache();59bool FindEntry(std::string_view path, UInt32 *index, bool *isDirectory = nullptr) const;60std::string ResolvePath(std::string_view path) const;61std::string ReadEntryPath(UInt32 index) const;62uint8_t *ExtractFile(UInt32 fileIndex, size_t *size);6364static void *Alloc(ISzAllocPtr p, size_t size);65static void Free(ISzAllocPtr p, void *address);6667Path archivePath_;68std::string inArchivePath_;6970mutable std::mutex lock_;71CFileInStream archiveStream_;72CLookToRead2 lookStream_;73ISzAlloc allocImp_;74ISzAlloc allocTempImp_;75CSzArEx db_;76Byte *lookStreamBuf_ = nullptr;77Byte *cachedBlock_ = nullptr;78size_t cachedBlockSize_ = 0;79UInt32 blockIndex_ = 0xFFFFFFFF;80bool valid_ = false;8182std::vector<SevenZipEntry> entries_;83};848586