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