]> git.saurik.com Git - ldid.git/commitdiff
UnionFolder (code for Impactor) should be in ldid.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 10 Oct 2015 21:04:44 +0000 (14:04 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 10 Oct 2015 21:04:44 +0000 (14:04 -0700)
ldid.cpp
ldid.hpp

index eb535fd82f808ce2a979469e15bf83a36f97673a..33b1859ada7bad3631999cc5c0fa0cca2a769331 100644 (file)
--- 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 (;;) {
index 4320befef7c3ffde2a2a637997c5e9ff0da733f2..b7bbdaf8b25041182680bd09de72bdfc5f8c525a 100644 (file)
--- 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;