]>
Commit | Line | Data |
---|---|---|
1 | #ifndef LDID_HPP | |
2 | #define LDID_HPP | |
3 | ||
4 | #include <cstdlib> | |
5 | #include <map> | |
6 | #include <sstream> | |
7 | #include <streambuf> | |
8 | #include <string> | |
9 | #include <vector> | |
10 | ||
11 | namespace ldid { | |
12 | ||
13 | // I wish Apple cared about providing quality toolchains :/ | |
14 | ||
15 | template <typename Function_> | |
16 | class Functor; | |
17 | ||
18 | template <typename Type_, typename... Args_> | |
19 | class Functor<Type_ (Args_...)> { | |
20 | public: | |
21 | virtual Type_ operator ()(Args_... args) const = 0; | |
22 | }; | |
23 | ||
24 | template <typename Function_> | |
25 | class FunctorImpl; | |
26 | ||
27 | template <typename Value_, typename Type_, typename... Args_> | |
28 | class FunctorImpl<Type_ (Value_::*)(Args_...) const> : | |
29 | public Functor<Type_ (Args_...)> | |
30 | { | |
31 | private: | |
32 | const Value_ *value_; | |
33 | ||
34 | public: | |
35 | FunctorImpl(const Value_ &value) : | |
36 | value_(&value) | |
37 | { | |
38 | } | |
39 | ||
40 | virtual Type_ operator ()(Args_... args) const { | |
41 | return (*value_)(args...); | |
42 | } | |
43 | }; | |
44 | ||
45 | template <typename Function_> | |
46 | FunctorImpl<decltype(&Function_::operator())> fun(const Function_ &value) { | |
47 | return value; | |
48 | } | |
49 | ||
50 | class Folder { | |
51 | public: | |
52 | virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code) = 0; | |
53 | virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code) = 0; | |
54 | virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code) = 0; | |
55 | }; | |
56 | ||
57 | class DiskFolder : | |
58 | public Folder | |
59 | { | |
60 | private: | |
61 | const std::string path_; | |
62 | std::map<std::string, std::string> commit_; | |
63 | ||
64 | std::string Path(const std::string &path); | |
65 | ||
66 | void Find(const std::string &root, const std::string &base, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)>&code); | |
67 | ||
68 | public: | |
69 | DiskFolder(const std::string &path); | |
70 | ~DiskFolder(); | |
71 | ||
72 | virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code); | |
73 | virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code); | |
74 | virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code); | |
75 | }; | |
76 | ||
77 | class SubFolder : | |
78 | public Folder | |
79 | { | |
80 | private: | |
81 | Folder &parent_; | |
82 | std::string path_; | |
83 | ||
84 | public: | |
85 | SubFolder(Folder &parent, const std::string &path); | |
86 | ||
87 | virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code); | |
88 | virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code); | |
89 | virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code); | |
90 | }; | |
91 | ||
92 | class UnionFolder : | |
93 | public Folder | |
94 | { | |
95 | private: | |
96 | class StringBuffer : | |
97 | public std::stringbuf | |
98 | { | |
99 | public: | |
100 | StringBuffer() { | |
101 | } | |
102 | ||
103 | StringBuffer(const StringBuffer &rhs) : | |
104 | std::stringbuf(rhs.str()) | |
105 | { | |
106 | } | |
107 | }; | |
108 | ||
109 | Folder &parent_; | |
110 | std::map<std::string, StringBuffer> files_; | |
111 | ||
112 | public: | |
113 | UnionFolder(Folder &parent); | |
114 | ||
115 | virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code); | |
116 | virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code); | |
117 | virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code); | |
118 | ||
119 | std::stringbuf &operator [](const std::string &path) { | |
120 | return files_[path]; | |
121 | } | |
122 | }; | |
123 | ||
124 | std::string Bundle(const std::string &root, Folder &folder, const std::string &key, std::map<std::string, std::vector<char>> &remote, const std::string &entitlements); | |
125 | ||
126 | typedef std::map<uint32_t, std::vector<char>> Slots; | |
127 | ||
128 | void Sign(const void *idata, size_t isize, std::streambuf &output, const std::string &identifier, const std::string &entitlements, const std::string &key, const Slots &slots); | |
129 | ||
130 | } | |
131 | ||
132 | #endif//LDID_HPP |