Line data Source code
1 : /*
2 : configuration.h - wraps gpgme configuration components
3 : Copyright (C) 2010 Klarälvdalens Datakonsult AB
4 :
5 : This file is part of GPGME++.
6 :
7 : GPGME++ is free software; you can redistribute it and/or
8 : modify it under the terms of the GNU Library General Public
9 : License as published by the Free Software Foundation; either
10 : version 2 of the License, or (at your option) any later version.
11 :
12 : GPGME++ is distributed in the hope that it will be useful,
13 : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : GNU Library General Public License for more details.
16 :
17 : You should have received a copy of the GNU Library General Public License
18 : along with GPGME++; see the file COPYING.LIB. If not, write to the
19 : Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 : Boston, MA 02110-1301, USA.
21 : */
22 :
23 : // -*- c++ -*-
24 : #ifndef __GPGMEPP_CONFIGURATION_H__
25 : #define __GPGMEPP_CONFIGURATION_H__
26 :
27 : #include "global.h"
28 :
29 : #include "gpgmefw.h"
30 :
31 : #include <iosfwd>
32 : #include <vector>
33 : #include <string>
34 : #include <algorithm>
35 : #include <memory>
36 :
37 : namespace GpgME
38 : {
39 : namespace Configuration
40 : {
41 :
42 : typedef std::shared_ptr< std::remove_pointer<gpgme_conf_comp_t>::type > shared_gpgme_conf_comp_t;
43 : typedef std::weak_ptr< std::remove_pointer<gpgme_conf_comp_t>::type > weak_gpgme_conf_comp_t;
44 :
45 : class Argument;
46 : class Option;
47 : class Component;
48 :
49 : enum Level {
50 : Basic,
51 : Advanced,
52 : Expert,
53 : Invisible,
54 : Internal,
55 :
56 : NumLevels
57 : };
58 :
59 : enum Type {
60 : NoType,
61 : StringType,
62 : IntegerType,
63 : UnsignedIntegerType,
64 :
65 : FilenameType = 32,
66 : LdapServerType,
67 : KeyFingerprintType,
68 : PublicKeyType,
69 : SecretKeyType,
70 : AliasListType,
71 :
72 : MaxType
73 : };
74 :
75 : enum Flag {
76 : Group = (1 << 0),
77 : Optional = (1 << 1),
78 : List = (1 << 2),
79 : Runtime = (1 << 3),
80 : Default = (1 << 4),
81 : DefaultDescription = (1 << 5),
82 : NoArgumentDescription = (1 << 6),
83 : NoChange = (1 << 7),
84 :
85 : LastFlag = NoChange
86 : };
87 :
88 : //
89 : // class Component
90 : //
91 :
92 1044 : class GPGMEPP_EXPORT Component
93 : {
94 : public:
95 252 : Component() : comp() {}
96 0 : explicit Component(const shared_gpgme_conf_comp_t &comp)
97 0 : : comp(comp) {}
98 :
99 : // copy ctor is ok
100 :
101 126 : const Component &operator=(const Component &other)
102 : {
103 126 : if (this != &other) {
104 126 : Component(other).swap(*this);
105 : }
106 126 : return *this;
107 : }
108 :
109 126 : void swap(Component &other)
110 : {
111 : using std::swap;
112 126 : swap(this->comp, other.comp);
113 126 : }
114 :
115 120 : bool isNull() const
116 : {
117 120 : return !comp;
118 : }
119 :
120 : static std::vector<Component> load(Error &err);
121 : Error save() const;
122 :
123 : const char *name() const;
124 : const char *description() const;
125 : const char *programName() const;
126 :
127 : Option option(unsigned int index) const;
128 : Option option(const char *name) const;
129 :
130 : unsigned int numOptions() const;
131 :
132 : std::vector<Option> options() const;
133 :
134 : GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
135 : private:
136 : shared_gpgme_conf_comp_t comp;
137 : };
138 :
139 : //
140 : // class Option
141 : //
142 :
143 50386 : class GPGMEPP_EXPORT Option
144 : {
145 : public:
146 0 : Option() : comp(), opt(0) {}
147 17493 : Option(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt)
148 17493 : : comp(comp), opt(opt) {}
149 :
150 : const Option &operator=(const Option &other)
151 : {
152 : if (this != &other) {
153 : Option(other).swap(*this);
154 : }
155 : return *this;
156 : }
157 :
158 : void swap(Option &other)
159 : {
160 : using std::swap;
161 : swap(this->comp, other.comp);
162 : swap(this->opt, other.opt);
163 : }
164 :
165 58633 : bool isNull() const
166 : {
167 58633 : return comp.expired() || !opt;
168 : }
169 :
170 : Component parent() const;
171 :
172 : unsigned int flags() const;
173 :
174 : Level level() const;
175 :
176 : const char *name() const;
177 : const char *description() const;
178 : const char *argumentName() const;
179 :
180 : Type type() const;
181 : Type alternateType() const;
182 :
183 : Argument defaultValue() const;
184 : const char *defaultDescription() const;
185 :
186 : Argument noArgumentValue() const;
187 : const char *noArgumentDescription() const;
188 :
189 : /*! The value that is in the config file (or null, if it's not set). */
190 : Argument activeValue() const;
191 : /*! The value that is in this object, ie. either activeValue(), newValue(), or defaultValue() */
192 : Argument currentValue() const;
193 :
194 : Argument newValue() const;
195 : bool set() const;
196 : bool dirty() const;
197 :
198 : Error setNewValue(const Argument &argument);
199 : Error resetToDefaultValue();
200 : Error resetToActiveValue();
201 :
202 : Argument createNoneArgument(bool set) const;
203 : Argument createStringArgument(const char *value) const;
204 : Argument createStringArgument(const std::string &value) const;
205 : Argument createIntArgument(int value) const;
206 : Argument createUIntArgument(unsigned int value) const;
207 :
208 : Argument createNoneListArgument(unsigned int count) const;
209 : Argument createStringListArgument(const std::vector<const char *> &value) const;
210 : Argument createStringListArgument(const std::vector<std::string> &value) const;
211 : Argument createIntListArgument(const std::vector<int> &values) const;
212 : Argument createUIntListArgument(const std::vector<unsigned int> &values) const;
213 :
214 : GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
215 : private:
216 : weak_gpgme_conf_comp_t comp;
217 : gpgme_conf_opt_t opt;
218 : };
219 :
220 : //
221 : // class Argument
222 : //
223 :
224 : class GPGMEPP_EXPORT Argument
225 : {
226 : friend class ::GpgME::Configuration::Option;
227 : Argument(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg, bool owns);
228 : public:
229 0 : Argument() : comp(), opt(0), arg(0) {}
230 : //Argument( const shared_gpgme_conf_comp_t & comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg );
231 : Argument(const Argument &other);
232 : ~Argument();
233 :
234 : const Argument &operator=(const Argument &other)
235 : {
236 : if (this != &other) {
237 : Argument(other).swap(*this);
238 : }
239 : return *this;
240 : }
241 :
242 : void swap(Argument &other)
243 : {
244 : using std::swap;
245 : swap(this->comp, other.comp);
246 : swap(this->opt, other.opt);
247 : swap(this->arg, other.arg);
248 : }
249 :
250 13511 : bool isNull() const
251 : {
252 13511 : return comp.expired() || !opt || !arg;
253 : }
254 :
255 : Option parent() const;
256 :
257 : unsigned int numElements() const;
258 :
259 : bool boolValue() const;
260 : const char *stringValue(unsigned int index = 0) const;
261 : int intValue(unsigned int index = 0) const;
262 : unsigned int uintValue(unsigned int index = 0) const;
263 :
264 : unsigned int numberOfTimesSet() const;
265 : std::vector<const char *> stringValues() const;
266 : std::vector<int> intValues() const;
267 : std::vector<unsigned int> uintValues() const;
268 :
269 12495 : GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
270 : private:
271 : weak_gpgme_conf_comp_t comp;
272 : gpgme_conf_opt_t opt;
273 : gpgme_conf_arg_t arg;
274 : };
275 :
276 : GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Level level);
277 : GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Type type);
278 : GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Flag flag);
279 : GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Component &component);
280 : GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Option &option);
281 : GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Argument &argument);
282 :
283 : } // namespace Configuration
284 : } // namespace GpgME
285 :
286 : GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Component)
287 : GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Option)
288 : GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Argument)
289 :
290 : #endif // __GPGMEPP_CONFIGURATION_H__
|