X-Git-Url: https://git.saurik.com/ldid.git/blobdiff_plain/a0c715e9c070b60702407b8713b3874593ff833d..ee5f55567bd457e4c721267a154b796dc679f458:/ldid.hpp diff --git a/ldid.hpp b/ldid.hpp index ad85f03..b603bbd 100644 --- a/ldid.hpp +++ b/ldid.hpp @@ -3,14 +3,156 @@ #include #include +#include #include #include +#include namespace ldid { -typedef std::map Slots; +// I wish Apple cared about providing quality toolchains :/ -void Sign(void *idata, size_t isize, std::streambuf &output, const std::string &name, const std::string &entitlements, const std::string &key, const Slots &slots); +template +class Functor; + +template +class Functor { + public: + virtual Type_ operator ()(Args_... args) const = 0; +}; + +template +class FunctorImpl; + +template +class FunctorImpl : + public Functor +{ + private: + const Value_ *value_; + + public: + FunctorImpl(const Value_ &value) : + value_(&value) + { + } + + virtual Type_ operator ()(Args_... args) const { + return (*value_)(args...); + } +}; + +template +FunctorImpl fun(const Function_ &value) { + return value; +} + +class Folder { + public: + virtual void Save(const std::string &path, const void *flag, const Functor &code) = 0; + virtual bool Look(const std::string &path) = 0; + virtual void Open(const std::string &path, const Functor &code) = 0; + virtual void Find(const std::string &path, const Functor &)> &)> &code, const Functor &)> &link) = 0; +}; + +class DiskFolder : + public Folder +{ + private: + const std::string path_; + std::map commit_; + + std::string Path(const std::string &path); + + void Find(const std::string &root, const std::string &base, const Functor &)> &)> &code, const Functor &)> &link); + + public: + DiskFolder(const std::string &path); + ~DiskFolder(); + + virtual void Save(const std::string &path, const void *flag, const Functor &code); + virtual bool Look(const std::string &path); + virtual void Open(const std::string &path, const Functor &code); + virtual void Find(const std::string &path, const Functor &)> &)> &code, const Functor &)> &link); +}; + +class SubFolder : + public Folder +{ + private: + Folder &parent_; + std::string path_; + + public: + SubFolder(Folder &parent, const std::string &path); + + virtual void Save(const std::string &path, const void *flag, const Functor &code); + virtual bool Look(const std::string &path); + virtual void Open(const std::string &path, const Functor &code); + virtual void Find(const std::string &path, const Functor &)> &)> &code, const Functor &)> &link); +}; + +class UnionFolder : + public Folder +{ + private: + class StringBuffer : + public std::stringbuf + { + public: + StringBuffer() { + } + + StringBuffer(const StringBuffer &rhs) : + std::stringbuf(rhs.str()) + { + } + }; + + Folder &parent_; + std::set deletes_; + + std::map remaps_; + std::map> resets_; + + std::string Map(const std::string &path); + void Map(const std::string &path, const Functor &)> &)> &code, const std::string &file, const Functor &)> &save); + + public: + UnionFolder(Folder &parent); + + virtual void Save(const std::string &path, const void *flag, const Functor &code); + virtual bool Look(const std::string &path); + virtual void Open(const std::string &path, const Functor &code); + virtual void Find(const std::string &path, const Functor &)> &)> &code, const Functor &)> &link); + + 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 &from, const void *flag) { + operator ()(from); + auto &reset(resets_[from]); + reset.second = flag; + return reset.first; + } +}; + +struct Bundle { + std::string path; + std::vector hash; +}; + +Bundle Sign(const std::string &root, Folder &folder, const std::string &key, const std::string &entitlements, const std::string &requirement); + +typedef std::map> Slots; + +std::vector Sign(const void *idata, size_t isize, std::streambuf &output, const std::string &identifier, const std::string &entitlements, const std::string &requirement, const std::string &key, const Slots &slots); }