Add required Android includes
[project/make_ext4fs.git] / unencrypted_properties.h
1 #include <string>
2 #include <fstream>
3
4 // key names for properties we use
5 namespace properties {
6     extern const char* key;
7     extern const char* ref;
8     extern const char* type;
9     extern const char* password;
10 }
11
12 /**
13  * Class to store data on the unencrypted folder of a device.
14  * Note that the folder must exist before this class is constructed.
15  * All names must be valid single level (no '/') file or directory names
16  * Data is organized hierarchically so we can get a child folder
17  */
18 class UnencryptedProperties
19 {
20 public:
21     // Opens properties folder on named device.
22     // If folder does not exist, construction will succeed, but all
23     // getters will return default properties and setters will fail.
24     UnencryptedProperties(const char* device);
25
26     // Get named object. Return default if object does not exist or error.
27     template<typename t> t Get(const char* name, t default_value = t());
28
29     // Set named object. Return true if success, false otherwise
30     template<typename t> bool Set(const char* name, t const& value);
31
32     // Get child properties
33     UnencryptedProperties GetChild(const char* name);
34
35     // Remove named object
36     bool Remove(const char* name);
37
38     // Get path of folder
39     std::string const& GetPath() const {return folder_;}
40 private:
41     UnencryptedProperties();
42     bool OK() const;
43     std::string folder_;
44 };
45
46
47 template<typename t> t UnencryptedProperties::Get(const char* name,
48                                                   t default_value)
49 {
50     if (!OK()) return default_value;
51     t value = default_value;
52     std::ifstream(folder_ + "/" + name) >> value;
53     return value;
54 }
55
56 template<typename t> bool UnencryptedProperties::Set(const char* name,
57                                                      t const& value)
58 {
59     if (!OK()) return false;
60     std::ofstream o(folder_ + "/" + name);
61     o << value;
62     return !o.fail();
63 }
64
65 // Specialized getters/setters for strings
66 template<> std::string UnencryptedProperties::Get(const char* name,
67                                       std::string default_value);
68
69 template<> bool UnencryptedProperties::Set(const char* name,
70                                            std::string const& value);