aboutsummaryrefslogtreecommitdiffstats
path: root/lang/cpp/src/configuration.h
diff options
context:
space:
mode:
Diffstat (limited to 'lang/cpp/src/configuration.h')
-rw-r--r--lang/cpp/src/configuration.h297
1 files changed, 297 insertions, 0 deletions
diff --git a/lang/cpp/src/configuration.h b/lang/cpp/src/configuration.h
new file mode 100644
index 00000000..e6e13db4
--- /dev/null
+++ b/lang/cpp/src/configuration.h
@@ -0,0 +1,297 @@
+/*
+ configuration.h - wraps gpgme configuration components
+ Copyright (C) 2010 Klarälvdalens Datakonsult AB
+
+ This file is part of GPGME++.
+
+ GPGME++ is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ GPGME++ is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with GPGME++; see the file COPYING.LIB. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+// -*- c++ -*-
+#ifndef __GPGMEPP_CONFIGURATION_H__
+#define __GPGMEPP_CONFIGURATION_H__
+
+#include "global.h"
+
+#include "gpgmefw.h"
+
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#if 0
+#include <boost/variant.hpp>
+#include <boost/optional.hpp>
+#endif
+
+#include <iosfwd>
+#include <vector>
+#include <string>
+#include <algorithm>
+
+namespace GpgME
+{
+namespace Configuration
+{
+
+typedef boost::shared_ptr< boost::remove_pointer<gpgme_conf_comp_t>::type > shared_gpgme_conf_comp_t;
+typedef boost::weak_ptr< boost::remove_pointer<gpgme_conf_comp_t>::type > weak_gpgme_conf_comp_t;
+
+class Argument;
+class Option;
+class Component;
+
+enum Level {
+ Basic,
+ Advanced,
+ Expert,
+ Invisible,
+ Internal,
+
+ NumLevels
+};
+
+enum Type {
+ NoType,
+ StringType,
+ IntegerType,
+ UnsignedIntegerType,
+
+ FilenameType = 32,
+ LdapServerType,
+ KeyFingerprintType,
+ PublicKeyType,
+ SecretKeyType,
+ AliasListType,
+
+ MaxType
+};
+
+enum Flag {
+ Group = (1 << 0),
+ Optional = (1 << 1),
+ List = (1 << 2),
+ Runtime = (1 << 3),
+ Default = (1 << 4),
+ DefaultDescription = (1 << 5),
+ NoArgumentDescription = (1 << 6),
+ NoChange = (1 << 7),
+
+ LastFlag = NoChange
+};
+
+//
+// class Component
+//
+
+class GPGMEPP_EXPORT Component
+{
+public:
+ Component() : comp() {}
+ explicit Component(const shared_gpgme_conf_comp_t &comp)
+ : comp(comp) {}
+
+ // copy ctor is ok
+
+ const Component &operator=(const Component &other)
+ {
+ if (this != &other) {
+ Component(other).swap(*this);
+ }
+ return *this;
+ }
+
+ void swap(Component &other)
+ {
+ using std::swap;
+ swap(this->comp, other.comp);
+ }
+
+ bool isNull() const
+ {
+ return !comp;
+ }
+
+ static std::vector<Component> load(Error &err);
+ Error save() const;
+
+ const char *name() const;
+ const char *description() const;
+ const char *programName() const;
+
+ Option option(unsigned int index) const;
+ Option option(const char *name) const;
+
+ unsigned int numOptions() const;
+
+ std::vector<Option> options() const;
+
+ GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
+private:
+ shared_gpgme_conf_comp_t comp;
+};
+
+//
+// class Option
+//
+
+class GPGMEPP_EXPORT Option
+{
+public:
+ Option() : comp(), opt(0) {}
+ Option(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt)
+ : comp(comp), opt(opt) {}
+
+ const Option &operator=(const Option &other)
+ {
+ if (this != &other) {
+ Option(other).swap(*this);
+ }
+ return *this;
+ }
+
+ void swap(Option &other)
+ {
+ using std::swap;
+ swap(this->comp, other.comp);
+ swap(this->opt, other.opt);
+ }
+
+ bool isNull() const
+ {
+ return comp.expired() || !opt;
+ }
+
+ Component parent() const;
+
+ unsigned int flags() const;
+
+ Level level() const;
+
+ const char *name() const;
+ const char *description() const;
+ const char *argumentName() const;
+
+ Type type() const;
+ Type alternateType() const;
+
+ Argument defaultValue() const;
+ const char *defaultDescription() const;
+
+ Argument noArgumentValue() const;
+ const char *noArgumentDescription() const;
+
+ /*! The value that is in the config file (or null, if it's not set). */
+ Argument activeValue() const;
+ /*! The value that is in this object, ie. either activeValue(), newValue(), or defaultValue() */
+ Argument currentValue() const;
+
+ Argument newValue() const;
+ bool set() const;
+ bool dirty() const;
+
+ Error setNewValue(const Argument &argument);
+ Error resetToDefaultValue();
+ Error resetToActiveValue();
+
+ Argument createNoneArgument(bool set) const;
+ Argument createStringArgument(const char *value) const;
+ Argument createStringArgument(const std::string &value) const;
+ Argument createIntArgument(int value) const;
+ Argument createUIntArgument(unsigned int value) const;
+
+ Argument createNoneListArgument(unsigned int count) const;
+ Argument createStringListArgument(const std::vector<const char *> &value) const;
+ Argument createStringListArgument(const std::vector<std::string> &value) const;
+ Argument createIntListArgument(const std::vector<int> &values) const;
+ Argument createUIntListArgument(const std::vector<unsigned int> &values) const;
+
+ GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
+private:
+ weak_gpgme_conf_comp_t comp;
+ gpgme_conf_opt_t opt;
+};
+
+//
+// class Argument
+//
+
+class GPGMEPP_EXPORT Argument
+{
+ friend class ::GpgME::Configuration::Option;
+ Argument(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg, bool owns);
+public:
+ Argument() : comp(), opt(0), arg(0) {}
+ //Argument( const shared_gpgme_conf_comp_t & comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg );
+ Argument(const Argument &other);
+ ~Argument();
+
+ const Argument &operator=(const Argument &other)
+ {
+ if (this != &other) {
+ Argument(other).swap(*this);
+ }
+ return *this;
+ }
+
+ void swap(Argument &other)
+ {
+ using std::swap;
+ swap(this->comp, other.comp);
+ swap(this->opt, other.opt);
+ swap(this->arg, other.arg);
+ }
+
+ bool isNull() const
+ {
+ return comp.expired() || !opt || !arg;
+ }
+
+ Option parent() const;
+
+ unsigned int numElements() const;
+
+ bool boolValue() const;
+ const char *stringValue(unsigned int index = 0) const;
+ int intValue(unsigned int index = 0) const;
+ unsigned int uintValue(unsigned int index = 0) const;
+
+ unsigned int numberOfTimesSet() const;
+ std::vector<const char *> stringValues() const;
+ std::vector<int> intValues() const;
+ std::vector<unsigned int> uintValues() const;
+
+ GPGMEPP_MAKE_SAFE_BOOL_OPERATOR(!isNull())
+private:
+ weak_gpgme_conf_comp_t comp;
+ gpgme_conf_opt_t opt;
+ gpgme_conf_arg_t arg;
+};
+
+GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Level level);
+GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Type type);
+GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, Flag flag);
+GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Component &component);
+GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Option &option);
+GPGMEPP_EXPORT std::ostream &operator<<(std::ostream &os, const Argument &argument);
+
+} // namespace Configuration
+} // namespace GpgME
+
+GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Component)
+GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Option)
+GPGMEPP_MAKE_STD_SWAP_SPECIALIZATION(Configuration::Argument)
+
+#endif // __GPGMEPP_CONFIGURATION_H__