1//
2// Copyright (C) 2011 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef SHILL_STORE_INTERFACE_H_
18#define SHILL_STORE_INTERFACE_H_
19
20#include <set>
21#include <string>
22#include <vector>
23
24namespace shill {
25
26class KeyValueStore;
27
28// An interface to a persistent store implementation.
29class StoreInterface {
30 public:
31  virtual ~StoreInterface() {}
32
33  // Returns true if the store exists and is non-empty.
34  virtual bool IsNonEmpty() const = 0;
35
36  // Opens the store. Returns true on success. The effects of
37  // re-opening an open store are undefined. The effects of calling a
38  // getter or setter on an unopened store are also undefined.
39  virtual bool Open() = 0;
40
41  // Closes the store and flushes it to persistent storage. Returns
42  // true on success. Note that the store is considered closed even if
43  // Close returns false. The effects of closing and already closed
44  // store are undefined.
45  virtual bool Close() = 0;
46
47  // Flush current in-memory data to disk.
48  virtual bool Flush() = 0;
49
50  // Mark the underlying file store as corrupted, moving the data file
51  // to a new filename.  This will prevent the file from being re-opened
52  // the next time Open() is called.
53  virtual bool MarkAsCorrupted() = 0;
54
55  // Returns a set of all groups contained in the store.
56  virtual std::set<std::string> GetGroups() const = 0;
57
58  // Returns the names of all groups that contain the named |key|.
59  virtual std::set<std::string> GetGroupsWithKey(
60      const std::string& key) const = 0;
61
62  // Returns the names of all groups that contain the named |properties|.
63  // Only the Bool, Int and String properties are checked.
64  virtual std::set<std::string> GetGroupsWithProperties(
65      const KeyValueStore& properties) const = 0;
66
67  // Returns true if the store contains |group|, false otherwise.
68  virtual bool ContainsGroup(const std::string& group) const = 0;
69
70  // Deletes |group|:|key|. Returns true on success. It is an error to
71  // delete from a group that does not exist. It is, however,
72  // permitted to delete a non-existent key from a group that does
73  // exist.
74  virtual bool DeleteKey(const std::string& group, const std::string& key) = 0;
75
76  // Deletes |group|. Returns true on success. It is not an error to
77  // delete a group that does not exist.
78  virtual bool DeleteGroup(const std::string& group) = 0;
79
80  // Sets a descriptive header on the key file.
81  virtual bool SetHeader(const std::string& header) = 0;
82
83  // Gets a string |value| associated with |group|:|key|. Returns true on
84  // success and false on failure (including when |group|:|key| is not present
85  // in the store).  It is not an error to pass NULL as |value| to simply
86  // test for the presence of this value.
87  virtual bool GetString(const std::string& group,
88                         const std::string& key,
89                         std::string* value) const = 0;
90
91  // Associates |group|:|key| with a string |value|. Returns true on success,
92  // false otherwise.
93  virtual bool SetString(const std::string& group,
94                         const std::string& key,
95                         const std::string& value) = 0;
96
97  // Gets a boolean |value| associated with |group|:|key|. Returns true on
98  // success and false on failure (including when the |group|:|key| is not
99  // present in the store).  It is not an error to pass NULL as |value| to
100  // simply test for the presence of this value.
101
102  virtual bool GetBool(const std::string& group,
103                       const std::string& key,
104                       bool* value) const = 0;
105
106  // Associates |group|:|key| with a boolean |value|. Returns true on success,
107  // false otherwise.
108  virtual bool SetBool(const std::string& group,
109                       const std::string& key,
110                       bool value) = 0;
111
112  // Gets a integer |value| associated with |group|:|key|. Returns true on
113  // success and false on failure (including when the |group|:|key| is not
114  // present in the store).  It is not an error to pass NULL as |value| to
115  // simply test for the presence of this value.
116  virtual bool GetInt(const std::string& group,
117                      const std::string& key,
118                      int* value) const = 0;
119
120  // Associates |group|:|key| with an integer |value|. Returns true on success,
121  // false otherwise.
122  virtual bool SetInt(const std::string& group,
123                      const std::string& key,
124                      int value) = 0;
125
126  // Gets a 64-bit unsigned integer |value| associated with |group|:|key|.
127  // Returns true on success and false on failure (including when the
128  // |group|:|key| is not present in the store).  It is not an error to
129  // pass NULL as |value| to simply test for the presence of this value.
130  virtual bool GetUint64(const std::string& group,
131                         const std::string& key,
132                         uint64_t* value) const = 0;
133
134  // Associates |group|:|key| with a 64-bit unsigned integer |value|. Returns
135  // true on success, false otherwise.
136  virtual bool SetUint64(const std::string& group,
137                         const std::string& key,
138                         uint64_t value) = 0;
139
140  // Gets a string list |value| associated with |group|:|key|. Returns true on
141  // success and false on failure (including when |group|:|key| is not present
142  // in the store).  It is not an error to pass NULL as |value| to simply test
143  // for the presence of this value.
144  virtual bool GetStringList(const std::string& group,
145                             const std::string& key,
146                             std::vector<std::string>* value) const = 0;
147
148  // Associates |group|:|key| with a string list |value|. Returns true on
149  // success, false otherwise.
150  virtual bool SetStringList(const std::string& group,
151                             const std::string& key,
152                             const std::vector<std::string>& value) = 0;
153
154  // Gets and decrypts string |value| associated with |group|:|key|. Returns
155  // true on success and false on failure (including when |group|:|key| is not
156  // present in the store).  It is not an error to pass NULL as |value| to
157  // simply test for the presence of this value.
158  virtual bool GetCryptedString(const std::string& group,
159                                const std::string& key,
160                                std::string* value) = 0;
161
162  // Associates |group|:|key| with a string |value| after encrypting it. Returns
163  // true on success, false otherwise.
164  virtual bool SetCryptedString(const std::string& group,
165                                const std::string& key,
166                                const std::string& value) = 0;
167};
168
169}  // namespace shill
170
171#endif  // SHILL_STORE_INTERFACE_H_
172