e6e13db4dfe10d70bb07f840d46b6f4f446f3399
[gpgme.git] / lang / cpp / src / configuration.h
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 <boost/shared_ptr.hpp>
32 #include <boost/weak_ptr.hpp>
33 #include <boost/type_traits/remove_pointer.hpp>
34 #if 0
35 #include <boost/variant.hpp>
36 #include <boost/optional.hpp>
37 #endif
38
39 #include <iosfwd>
40 #include <vector>
41 #include <string>
42 #include <algorithm>
43
44 namespace GpgME
45 {
46 namespace Configuration
47 {
48
49 typedef boost::shared_ptr< boost::remove_pointer<gpgme_conf_comp_t>::type > shared_gpgme_conf_comp_t;
50 typedef boost::weak_ptr< boost::remove_pointer<gpgme_conf_comp_t>::type > weak_gpgme_conf_comp_t;
51
52 class Argument;
53 class Option;
54 class Component;
55
56 enum Level {
57     Basic,
58     Advanced,
59     Expert,
60     Invisible,
61     Internal,
62
63     NumLevels
64 };
65
66 enum Type {
67     NoType,
68     StringType,
69     IntegerType,
70     UnsignedIntegerType,
71
72     FilenameType = 32,
73     LdapServerType,
74     KeyFingerprintType,
75     PublicKeyType,
76     SecretKeyType,
77     AliasListType,
78
79     MaxType
80 };
81
82 enum Flag {
83     Group    = (1 << 0),
84     Optional = (1 << 1),
85     List     = (1 << 2),
86     Runtime  = (1 << 3),
87     Default  = (1 << 4),
88     DefaultDescription = (1 << 5),
89     NoArgumentDescription = (1 << 6),
90     NoChange = (1 << 7),
91
92     LastFlag = NoChange
93 };
94
95 //
96 // class Component
97 //
98
99 class GPGMEPP_EXPORT Component
100 {
101 public:
102     Component() : comp() {}
103     explicit Component(const shared_gpgme_conf_comp_t &comp)
104         : comp(comp) {}
105
106     // copy ctor is ok
107
108     const Component &operator=(const Component &other)
109     {
110         if (this != &other) {
111             Component(other).swap(*this);
112         }
113         return *this;
114     }
115
116     void swap(Component &other)
117     {
118         using std::swap;
119         swap(this->comp, other.comp);
120     }
121
122     bool isNull() const
123     {
124         return !comp;
125     }
126
127     static std::vector<Component> load(Error &err);
128     Error save() const;
129
130     const char *name() const;
131     const char *description() const;
132     const char *programName() const;
133
134     Option option(unsigned int index) const;
135     Option option(const char *name) const;
136
137     unsigned int numOptions() const;
138
139     std::vector<Option> options() const;
140
141     GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
142 private:
143     shared_gpgme_conf_comp_t comp;
144 };
145
146 //
147 // class Option
148 //
149
150 class GPGMEPP_EXPORT Option
151 {
152 public:
153     Option() : comp(), opt(0) {}
154     Option(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt)
155         : comp(comp), opt(opt) {}
156
157     const Option &operator=(const Option &other)
158     {
159         if (this != &other) {
160             Option(other).swap(*this);
161         }
162         return *this;
163     }
164
165     void swap(Option &other)
166     {
167         using std::swap;
168         swap(this->comp, other.comp);
169         swap(this->opt,  other.opt);
170     }
171
172     bool isNull() const
173     {
174         return comp.expired() || !opt;
175     }
176
177     Component parent() const;
178
179     unsigned int flags() const;
180
181     Level level() const;
182
183     const char *name() const;
184     const char *description() const;
185     const char *argumentName() const;
186
187     Type type() const;
188     Type alternateType() const;
189
190     Argument defaultValue() const;
191     const char *defaultDescription() const;
192
193     Argument noArgumentValue() const;
194     const char *noArgumentDescription() const;
195
196     /*! The value that is in the config file (or null, if it's not set). */
197     Argument activeValue() const;
198     /*! The value that is in this object, ie. either activeValue(), newValue(), or defaultValue() */
199     Argument currentValue() const;
200
201     Argument newValue() const;
202     bool set() const;
203     bool dirty() const;
204
205     Error setNewValue(const Argument &argument);
206     Error resetToDefaultValue();
207     Error resetToActiveValue();
208
209     Argument createNoneArgument(bool set) const;
210     Argument createStringArgument(const char *value) const;
211     Argument createStringArgument(const std::string &value) const;
212     Argument createIntArgument(int value) const;
213     Argument createUIntArgument(unsigned int value) const;
214
215     Argument createNoneListArgument(unsigned int count) const;
216     Argument createStringListArgument(const std::vector<const char *> &value) const;
217     Argument createStringListArgument(const std::vector<std::string> &value) const;
218     Argument createIntListArgument(const std::vector<int> &values) const;
219     Argument createUIntListArgument(const std::vector<unsigned int> &values) const;
220
221     GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
222 private:
223     weak_gpgme_conf_comp_t  comp;
224     gpgme_conf_opt_t opt;
225 };
226
227 //
228 // class Argument
229 //
230
231 class GPGMEPP_EXPORT Argument
232 {
233     friend class ::GpgME::Configuration::Option;
234     Argument(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg, bool owns);
235 public:
236     Argument() : comp(), opt(0), arg(0) {}
237     //Argument( const shared_gpgme_conf_comp_t & comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg );
238     Argument(const Argument &other);
239     ~Argument();
240
241     const Argument &operator=(const Argument &other)
242     {
243         if (this != &other) {
244             Argument(other).swap(*this);
245         }
246         return *this;
247     }
248
249     void swap(Argument &other)
250     {
251         using std::swap;
252         swap(this->comp, other.comp);
253         swap(this->opt,  other.opt);
254         swap(this->arg,  other.arg);
255     }
256
257     bool isNull() const
258     {
259         return comp.expired() || !opt || !arg;
260     }
261
262     Option parent() const;
263
264     unsigned int numElements() const;
265
266     bool boolValue() const;
267     const char *stringValue(unsigned int index = 0) const;
268     int          intValue(unsigned int index = 0) const;
269     unsigned int uintValue(unsigned int index = 0) const;
270
271     unsigned int numberOfTimesSet() const;
272     std::vector<const char *> stringValues() const;
273     std::vector<int>          intValues() const;
274     std::vector<unsigned int> uintValues() const;
275
276     GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
277 private:
278     weak_gpgme_conf_comp_t comp;
279     gpgme_conf_opt_t opt;
280     gpgme_conf_arg_t arg;
281 };
282
283 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Level level);
284 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Type type);
285 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Flag flag);
286 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Component &component);
287 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Option &option);
288 GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Argument &argument);
289
290 } // namespace Configuration
291 } // namespace GpgME
292
293 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Component)
294 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Option)
295 GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Argument)
296
297 #endif // __GPGMEPP_CONFIGURATION_H__