Cpp / Qt: Reduce boost usage (memory and tuple)
[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 <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 class GPGMEPP_EXPORT Component
93 {
94 public:
95     Component() : comp() {}
96     explicit Component(const shared_gpgme_conf_comp_t &comp)
97         : comp(comp) {}
98
99     // copy ctor is ok
100
101     const Component &operator=(const Component &other)
102     {
103         if (this != &other) {
104             Component(other).swap(*this);
105         }
106         return *this;
107     }
108
109     void swap(Component &other)
110     {
111         using std::swap;
112         swap(this->comp, other.comp);
113     }
114
115     bool isNull() const
116     {
117         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 class GPGMEPP_EXPORT Option
144 {
145 public:
146     Option() : comp(), opt(0) {}
147     Option(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt)
148         : 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     bool isNull() const
166     {
167         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     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     bool isNull() const
251     {
252         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     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__