Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/FileLoaders/ZipFileLoader.h
3186 views
1
#pragma once
2
3
#include <mutex>
4
5
#ifdef SHARED_LIBZIP
6
#include <zip.h>
7
#else
8
#include "ext/libzip/zip.h"
9
#endif
10
11
#include "Common/CommonTypes.h"
12
#include "Common/Log.h"
13
#include "Common/File/Path.h"
14
#include "Common/StringUtils.h"
15
#include "Core/Loaders.h"
16
17
// Exposes a single (chosen) file from a zip file as another file loader.
18
// Useful in a bunch of possible chains.
19
class ZipFileLoader : public ProxiedFileLoader {
20
public:
21
ZipFileLoader(FileLoader *sourceLoader);
22
~ZipFileLoader() override;
23
24
zip_t *GetZip() const {
25
return zipArchive_;
26
}
27
28
bool Initialize(int fileIndex);
29
30
bool Exists() override {
31
return dataFile_ != nullptr;
32
}
33
34
bool IsDirectory() override {
35
return false;
36
}
37
38
s64 FileSize() override {
39
return dataFileSize_;
40
}
41
42
Path GetPath() const override {
43
return backend_->GetPath();
44
}
45
46
size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) override {
47
return ReadAt(absolutePos, bytes * count, data, flags) / bytes;
48
}
49
size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) override;
50
51
std::string GetFileExtension() const override {
52
return fileExtension_;
53
}
54
55
private:
56
zip_int64_t ZipSourceCallback(void* data, zip_uint64_t len, zip_source_cmd_t cmd);
57
58
enum {
59
BLOCK_SIZE = 65536,
60
};
61
zip_t *zipArchive_ = nullptr;
62
s64 zipReadPos_ = 0;
63
64
zip_file_t *dataFile_ = nullptr;
65
uint8_t *data_ = nullptr; // malloc/free
66
s64 dataReadPos_ = 0;
67
s64 dataFileSize_ = 0;
68
std::string fileExtension_;
69
};
70
71