summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2015-10-10 14:04:44 -0700
committerJay Freeman (saurik) <saurik@saurik.com>2015-10-10 14:04:44 -0700
commit886cb3f1cf485d307519e2024ef141314d42e713 (patch)
treef43aaf8afc736976148cb47c691498bde868f132
parent2443500c8f002df2641e55c26a6a7882906a42da (diff)
downloadldid-886cb3f1cf485d307519e2024ef141314d42e713.tar.gz
ldid-886cb3f1cf485d307519e2024ef141314d42e713.tar.zst
ldid-886cb3f1cf485d307519e2024ef141314d42e713.zip
UnionFolder (code for Impactor) should be in ldid.
-rw-r--r--ldid.cpp35
-rw-r--r--ldid.hpp19
2 files changed, 54 insertions, 0 deletions
diff --git a/ldid.cpp b/ldid.cpp
index eb535fd..33b1859 100644
--- a/ldid.cpp
+++ b/ldid.cpp
@@ -1661,6 +1661,41 @@ void SubFolder::Find(const std::string &path, const Functor<void (const std::str
return parent_.Find(path_ + path, code);
}
+UnionFolder::UnionFolder(Folder &parent) :
+ parent_(parent)
+{
+}
+
+void UnionFolder::Save(const std::string &path, const Functor<void (std::streambuf &)> &code) {
+ return parent_.Save(path, code);
+}
+
+bool UnionFolder::Open(const std::string &path, const Functor<void (std::streambuf &)> &code) {
+ auto file(files_.find(path));
+ if (file == files_.end())
+ return parent_.Open(path, code);
+
+ auto &data(file->second);
+ data.pubseekpos(0, std::ios::in);
+ code(data);
+ return true;
+}
+
+void UnionFolder::Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code) {
+ parent_.Find(path, fun([&](const std::string &name, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &save) {
+ if (files_.find(name) == files_.end())
+ code(name, save);
+ }));
+
+ for (auto &file : files_)
+ code(file.first, fun([&](const Functor<void (std::streambuf &, std::streambuf &)> &code) {
+ parent_.Save(file.first, fun([&](std::streambuf &save) {
+ file.second.pubseekpos(0, std::ios::in);
+ code(file.second, save);
+ }));
+ }));
+}
+
static size_t copy(std::streambuf &source, std::streambuf &target) {
size_t total(0);
for (;;) {
diff --git a/ldid.hpp b/ldid.hpp
index 4320bef..b7bbdaf 100644
--- a/ldid.hpp
+++ b/ldid.hpp
@@ -87,6 +87,25 @@ class SubFolder :
virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code);
};
+class UnionFolder :
+ public Folder
+{
+ private:
+ Folder &parent_;
+ std::map<std::string, std::stringbuf> files_;
+
+ public:
+ UnionFolder(Folder &parent);
+
+ virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code);
+ virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code);
+ virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code);
+
+ std::stringbuf &operator [](const std::string &path) {
+ return files_[path];
+ }
+};
+
std::string Bundle(const std::string &root, Folder &folder, const std::string &key, std::map<std::string, std::vector<char>> &remote);
typedef std::map<uint32_t, std::vector<char>> Slots;