]> git.saurik.com Git - ldid.git/commitdiff
Support renaming files under an ldid::UnionFolder.
authorJay Freeman (saurik) <saurik@saurik.com>
Fri, 29 Jul 2016 07:58:22 +0000 (00:58 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Fri, 29 Jul 2016 07:58:22 +0000 (00:58 -0700)
ldid.cpp
ldid.hpp

index 62b74988e897e4f440a1a2369c164eec267bed10..02e2675df369fa76f8a601d1af0fcd50e0b22a8d 100644 (file)
--- a/ldid.cpp
+++ b/ldid.cpp
@@ -1727,19 +1727,35 @@ void SubFolder::Find(const std::string &path, const Functor<void (const std::str
     return parent_.Find(path_ + path, code);
 }
 
+std::string UnionFolder::Map(const std::string &path) {
+    auto remap(remaps_.find(path));
+    if (remap == remaps_.end())
+        return path;
+    return remap->second;
+}
+
+void UnionFolder::Map(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code, const std::string &file, const Functor<void (std::streambuf &, const Functor<void (std::streambuf &, std::streambuf &)> &)> &save) {
+    if (file.size() >= path.size() && file.substr(0, path.size()) == path)
+        code(file.substr(path.size()), fun([&](const Functor<void (std::streambuf &, std::streambuf &)> &code) {
+            parent_.Save(file, fun([&](std::streambuf &data) {
+                save(data, 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);
+    return parent_.Save(Map(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 file(resets_.find(path));
+    if (file == resets_.end())
+        return parent_.Open(Map(path), code);
 
     auto &data(file->second);
     data.pubseekpos(0, std::ios::in);
@@ -1749,18 +1765,22 @@ bool UnionFolder::Open(const std::string &path, const Functor<void (std::streamb
 
 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(path + name) == files_.end())
+        if (deletes_.find(path + name) == deletes_.end())
             code(name, save);
     }));
 
-    for (auto &file : files_)
-        if (file.first.size() >= path.size() && file.first.substr(0, path.size()) == path)
-            code(file.first.substr(path.size()), 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);
-                }));
+    for (auto &reset : resets_)
+        Map(path, code, reset.first, fun([&](std::streambuf &save, const Functor<void (std::streambuf &, std::streambuf &)> &code) {
+            reset.second.pubseekpos(0, std::ios::in);
+            code(reset.second, save);
+        }));
+
+    for (auto &remap : remaps_)
+        Map(path, code, remap.first, fun([&](std::streambuf &save, const Functor<void (std::streambuf &, std::streambuf &)> &code) {
+            parent_.Open(remap.second, fun([&](std::streambuf &data) {
+                code(data, save);
             }));
+        }));
 }
 
 #ifndef LDID_NOTOOLS
index 40b1c8b1dd13417ec18c91b3c57583bc12e3b0de..5b2efda7a936a92b4c023fc5eb133f4144762bc4 100644 (file)
--- a/ldid.hpp
+++ b/ldid.hpp
@@ -107,7 +107,13 @@ class UnionFolder :
     };
 
     Folder &parent_;
-    std::map<std::string, StringBuffer> files_;
+    std::set<std::string> deletes_;
+
+    std::map<std::string, std::string> remaps_;
+    std::map<std::string, StringBuffer> resets_;
+
+    std::string Map(const std::string &path);
+    void Map(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code, const std::string &file, const Functor<void (std::streambuf &, const Functor<void (std::streambuf &, std::streambuf &)> &)> &save);
 
   public:
     UnionFolder(Folder &parent);
@@ -116,8 +122,18 @@ class UnionFolder :
     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);
 
+    void operator ()(const std::string &from) {
+        deletes_.insert(from);
+    }
+
+    void operator ()(const std::string &from, const std::string &to) {
+        operator ()(from);
+        remaps_[to] = from;
+    }
+
     std::stringbuf &operator [](const std::string &path) {
-        return files_[path];
+        operator ()(path);
+        return resets_[path];
     }
 };