Blame lang/cpp/src/configuration.cpp

Packit Service 672cf4
/*
Packit Service 672cf4
  configuration.cpp - wraps gpgme configuration components
Packit Service 672cf4
  Copyright (C) 2010 Klarälvdalens Datakonsult AB
Packit Service 672cf4
  2016 Bundesamt für Sicherheit in der Informationstechnik
Packit Service 672cf4
  Software engineering by Intevation GmbH
Packit Service 672cf4
Packit Service 672cf4
  This file is part of GPGME++.
Packit Service 672cf4
Packit Service 672cf4
  GPGME++ is free software; you can redistribute it and/or
Packit Service 672cf4
  modify it under the terms of the GNU Library General Public
Packit Service 672cf4
  License as published by the Free Software Foundation; either
Packit Service 672cf4
  version 2 of the License, or (at your option) any later version.
Packit Service 672cf4
Packit Service 672cf4
  GPGME++ is distributed in the hope that it will be useful,
Packit Service 672cf4
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 672cf4
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 672cf4
  GNU Library General Public License for more details.
Packit Service 672cf4
Packit Service 672cf4
  You should have received a copy of the GNU Library General Public License
Packit Service 672cf4
  along with GPGME++; see the file COPYING.LIB.  If not, write to the
Packit Service 672cf4
  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit Service 672cf4
  Boston, MA 02110-1301, USA.
Packit Service 672cf4
*/
Packit Service 672cf4
Packit Service 672cf4
#ifdef HAVE_CONFIG_H
Packit Service 672cf4
 #include "config.h"
Packit Service 672cf4
#endif
Packit Service 672cf4
Packit Service 672cf4
#include "configuration.h"
Packit Service 672cf4
#include "error.h"
Packit Service 672cf4
#include "util.h"
Packit Service 672cf4
Packit Service 672cf4
#include <gpgme.h>
Packit Service 672cf4
Packit Service 672cf4
#include <iterator>
Packit Service 672cf4
#include <algorithm>
Packit Service 672cf4
#include <ostream>
Packit Service 672cf4
#include <cstring>
Packit Service 672cf4
#include <assert.h>
Packit Service 672cf4
Packit Service 672cf4
using namespace GpgME;
Packit Service 672cf4
using namespace GpgME::Configuration;
Packit Service 672cf4
Packit Service 672cf4
typedef std::shared_ptr< std::remove_pointer<gpgme_conf_opt_t>::type > shared_gpgme_conf_opt_t;
Packit Service 672cf4
typedef std::weak_ptr< std::remove_pointer<gpgme_conf_opt_t>::type > weak_gpgme_conf_opt_t;
Packit Service 672cf4
Packit Service 672cf4
typedef std::shared_ptr< std::remove_pointer<gpgme_conf_arg_t>::type > shared_gpgme_conf_arg_t;
Packit Service 672cf4
typedef std::weak_ptr< std::remove_pointer<gpgme_conf_arg_t>::type > weak_gpgme_conf_arg_t;
Packit Service 672cf4
Packit Service 672cf4
typedef std::shared_ptr< std::remove_pointer<gpgme_ctx_t>::type > shared_gpgme_ctx_t;
Packit Service 672cf4
typedef std::weak_ptr< std::remove_pointer<gpgme_ctx_t>::type > weak_gpgme_ctx_t;
Packit Service 672cf4
Packit Service 672cf4
namespace
Packit Service 672cf4
{
Packit Service 672cf4
struct nodelete {
Packit Service 672cf4
    template <typename T> void operator()(T *) {}
Packit Service 672cf4
};
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
// static
Packit Service 672cf4
std::vector<Component> Component::load(Error &returnedError)
Packit Service 672cf4
{
Packit Service 672cf4
Packit Service 672cf4
    //
Packit Service 672cf4
    // 1. get a context:
Packit Service 672cf4
    //
Packit Service 6c01f9
    gpgme_ctx_t ctx_native = 0;
Packit Service 672cf4
    if (const gpgme_error_t err = gpgme_new(&ctx_native)) {
Packit Service 672cf4
        returnedError = Error(err);
Packit Service 672cf4
        return std::vector<Component>();
Packit Service 672cf4
    }
Packit Service 672cf4
    const shared_gpgme_ctx_t ctx(ctx_native, &gpgme_release);
Packit Service 672cf4
Packit Service 672cf4
    //
Packit Service 672cf4
    // 2. load the config:
Packit Service 672cf4
    //
Packit Service 6c01f9
    gpgme_conf_comp_t conf_list_native = 0;
Packit Service 672cf4
    if (const gpgme_error_t err = gpgme_op_conf_load(ctx_native, &conf_list_native)) {
Packit Service 672cf4
        returnedError = Error(err);
Packit Service 672cf4
        return std::vector<Component>();
Packit Service 672cf4
    }
Packit Service 672cf4
    shared_gpgme_conf_comp_t head(conf_list_native, &gpgme_conf_release);
Packit Service 672cf4
Packit Service 672cf4
    //
Packit Service 672cf4
    // 3. convert to vector<Component>:
Packit Service 672cf4
    //
Packit Service 672cf4
    std::vector<Component> result;
Packit Service 672cf4
Packit Service 672cf4
    while (head) {
Packit Service 672cf4
        // secure 'head->next' (if any) against memleaks:
Packit Service 672cf4
        shared_gpgme_conf_comp_t next;
Packit Service 672cf4
        if (head->next) {
Packit Service 672cf4
            next.reset(head->next, &gpgme_conf_release);
Packit Service 672cf4
        }
Packit Service 672cf4
Packit Service 672cf4
        // now prevent double-free of next.get() and following:
Packit Service 6c01f9
        head->next = 0;
Packit Service 672cf4
Packit Service 672cf4
        // now add a new Component to 'result' (may throw):
Packit Service 672cf4
        result.resize(result.size() + 1);
Packit Service 672cf4
        result.back().comp.swap(head);   // .comp = std::move( head );
Packit Service 672cf4
        head.swap(next);                 //  head = std::move( next );
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Error Component::save() const
Packit Service 672cf4
{
Packit Service 672cf4
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Error(make_error(GPG_ERR_INV_ARG));
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    //
Packit Service 672cf4
    // 1. get a context:
Packit Service 672cf4
    //
Packit Service 6c01f9
    gpgme_ctx_t ctx_native = 0;
Packit Service 672cf4
    if (const gpgme_error_t err = gpgme_new(&ctx_native)) {
Packit Service 672cf4
        return Error(err);
Packit Service 672cf4
    }
Packit Service 672cf4
    const shared_gpgme_ctx_t ctx(ctx_native, &gpgme_release);
Packit Service 672cf4
Packit Service 672cf4
    //
Packit Service 672cf4
    // 2. save the config:
Packit Service 672cf4
    //
Packit Service 672cf4
    return Error(gpgme_op_conf_save(ctx.get(), comp.get()));
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Component::name() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return comp ? comp->name : 0 ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Component::description() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return comp ? comp->description : 0 ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Component::programName() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return comp ? comp->program_name : 0 ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Option Component::option(unsigned int idx) const
Packit Service 672cf4
{
Packit Service 6c01f9
    gpgme_conf_opt_t opt = 0;
Packit Service 672cf4
    if (comp) {
Packit Service 672cf4
        opt = comp->options;
Packit Service 672cf4
    }
Packit Service 672cf4
    while (opt && idx) {
Packit Service 672cf4
        opt = opt->next;
Packit Service 672cf4
        --idx;
Packit Service 672cf4
    }
Packit Service 672cf4
    if (opt) {
Packit Service 672cf4
        return Option(comp, opt);
Packit Service 672cf4
    }
Packit Service 672cf4
    return Option();
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Option Component::option(const char *name) const
Packit Service 672cf4
{
Packit Service 6c01f9
    gpgme_conf_opt_t opt = 0;
Packit Service 672cf4
    if (comp) {
Packit Service 672cf4
        opt = comp->options;
Packit Service 672cf4
    }
Packit Service 672cf4
    using namespace std; // for strcmp
Packit Service 672cf4
    while (opt && strcmp(name, opt->name) != 0) {
Packit Service 672cf4
        opt = opt->next;
Packit Service 672cf4
    }
Packit Service 672cf4
    if (opt) {
Packit Service 672cf4
        return Option(comp, opt);
Packit Service 672cf4
    }
Packit Service 672cf4
    return Option();
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
unsigned int Component::numOptions() const
Packit Service 672cf4
{
Packit Service 672cf4
    unsigned int result = 0;
Packit Service 6c01f9
    for (gpgme_conf_opt_t opt = comp ? comp->options : 0 ; opt ; opt = opt->next) {
Packit Service 672cf4
        ++result;
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::vector<Option> Component::options() const
Packit Service 672cf4
{
Packit Service 672cf4
    std::vector<Option> result;
Packit Service 6c01f9
    for (gpgme_conf_opt_t opt = comp ? comp->options : 0 ; opt ; opt = opt->next) {
Packit Service 672cf4
        result.push_back(Option(comp, opt));
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
static gpgme_conf_arg_t mygpgme_conf_arg_copy(gpgme_conf_arg_t other, gpgme_conf_type_t type)
Packit Service 672cf4
{
Packit Service 6c01f9
    gpgme_conf_arg_t result = 0, last = 0;
Packit Service 672cf4
    for (gpgme_conf_arg_t a = other ; a ; a = a->next) {
Packit Service 6c01f9
        gpgme_conf_arg_t arg = 0;
Packit Service 672cf4
        const gpgme_error_t err
Packit Service 672cf4
            = gpgme_conf_arg_new(&arg, type,
Packit Service 6c01f9
                                 a->no_arg                 ? 0 :
Packit Service 672cf4
                                 type == GPGME_CONF_STRING ? a->value.string :
Packit Service 672cf4
                                 /* else */                  static_cast<void *>(&a->value));
Packit Service 672cf4
        if (err) {
Packit Service 672cf4
            gpgme_conf_arg_release(result, type);
Packit Service 6c01f9
            return 0;
Packit Service 672cf4
        }
Packit Service 672cf4
        assert(arg);
Packit Service 672cf4
        if (result) {
Packit Service 672cf4
            last->next = arg;
Packit Service 672cf4
        } else {
Packit Service 672cf4
            result = arg;
Packit Service 672cf4
        }
Packit Service 672cf4
        last = arg;
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Component Option::parent() const
Packit Service 672cf4
{
Packit Service 672cf4
    return Component(comp.lock());
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
unsigned int Option::flags() const
Packit Service 672cf4
{
Packit Service 672cf4
    return isNull() ? 0 : opt->flags;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Level Option::level() const
Packit Service 672cf4
{
Packit Service 672cf4
    return isNull() ? Internal : static_cast<Level>(opt->level) ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Option::name() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return isNull() ? 0 : opt->name ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Option::description() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return isNull() ? 0 : opt->description ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Option::argumentName() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return isNull() ? 0 : opt->argname ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Type Option::type() const
Packit Service 672cf4
{
Packit Service 672cf4
    return isNull() ? NoType : static_cast<Type>(opt->type) ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Type Option::alternateType() const
Packit Service 672cf4
{
Packit Service 672cf4
    return isNull() ? NoType : static_cast<Type>(opt->alt_type) ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
#if 0
Packit Service 672cf4
static Option::Variant argument_to_variant(gpgme_conf_type_t type, bool list, gpgme_conf_arg_t arg)
Packit Service 672cf4
{
Packit Service 672cf4
    assert(arg);
Packit Service 672cf4
    switch (type) {
Packit Service 672cf4
    case GPGME_CONF_NONE:
Packit Service 672cf4
        if (list) {
Packit Service 672cf4
            // return the count (number of times set):
Packit Service 672cf4
            return arg->value.count;
Packit Service 672cf4
        } else {
Packit Service 672cf4
            return none;
Packit Service 672cf4
        }
Packit Service 672cf4
    case GPGME_CONF_INT32:
Packit Service 672cf4
        if (list) {
Packit Service 672cf4
            std::vector<int> result;
Packit Service 672cf4
            for (gpgme_conf_arg_t a = arg ; a ; a = a->next) {
Packit Service 672cf4
                result.push_back(a->value.int32);
Packit Service 672cf4
            }
Packit Service 672cf4
            return result;
Packit Service 672cf4
        } else {
Packit Service 672cf4
            return arg->value.int32;
Packit Service 672cf4
        }
Packit Service 672cf4
    case GPGME_CONF_UINT32:
Packit Service 672cf4
        if (list) {
Packit Service 672cf4
            std::vector<unsigned int> result;
Packit Service 672cf4
            for (gpgme_conf_arg_t a = arg ; a ; a = a->next) {
Packit Service 672cf4
                result.push_back(a->value.uint32);
Packit Service 672cf4
            }
Packit Service 672cf4
            return result;
Packit Service 672cf4
        } else {
Packit Service 672cf4
            return arg->value.uint32;
Packit Service 672cf4
        }
Packit Service 672cf4
    case GPGME_CONF_FILENAME:
Packit Service 672cf4
    case GPGME_CONF_LDAP_SERVER:
Packit Service 672cf4
    case GPGME_CONF_KEY_FPR:
Packit Service 672cf4
    case GPGME_CONF_PUB_KEY:
Packit Service 672cf4
    case GPGME_CONF_SEC_KEY:
Packit Service 672cf4
    case GPGME_CONF_ALIAS_LIST:
Packit Service 672cf4
    // these should not happen in alt_type, but fall through
Packit Service 672cf4
    case GPGME_CONF_STRING:
Packit Service 672cf4
        if (list) {
Packit Service 672cf4
            std::vector<const char *> result;
Packit Service 672cf4
            for (gpgme_conf_arg_t a = arg ; a ; a = a->next) {
Packit Service 672cf4
                result.push_back(a->value.string);
Packit Service 672cf4
            }
Packit Service 672cf4
            return result;
Packit Service 672cf4
        } else {
Packit Service 672cf4
            return arg->value.string;
Packit Service 672cf4
        }
Packit Service 672cf4
    }
Packit Service 672cf4
    assert(!"Option: unknown alt_type!");
Packit Service 672cf4
    return Option::Variant();
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
namespace
Packit Service 672cf4
{
Packit Service 672cf4
inline const void *to_void_star(const char *s)
Packit Service 672cf4
{
Packit Service 672cf4
    return s;
Packit Service 672cf4
}
Packit Service 672cf4
inline const void *to_void_star(const std::string &s)
Packit Service 672cf4
{
Packit Service 672cf4
    return s.c_str();
Packit Service 672cf4
}
Packit Service 672cf4
inline const void *to_void_star(const int &i)
Packit Service 672cf4
{
Packit Service 672cf4
    return &i;    // const-&: sic!
Packit Service 672cf4
}
Packit Service 672cf4
inline const void *to_void_star(const unsigned int &i)
Packit Service 672cf4
{
Packit Service 672cf4
    return &i;    // const-&: sic!
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
struct VariantToArgumentVisitor : boost::static_visitor<gpgme_conf_arg_t> {
Packit Service 672cf4
    static gpgme_conf_arg_t make_argument(gpgme_conf_type_t type, const void *value)
Packit Service 672cf4
    {
Packit Service 672cf4
        gpgme_conf_arg_t arg = 0;
Packit Service 672cf4
#ifdef HAVE_GPGME_CONF_ARG_NEW_WITH_CONST_VALUE
Packit Service 672cf4
        if (const gpgme_error_t err = gpgme_conf_arg_new(&arg, type, value)) {
Packit Service 672cf4
            return 0;
Packit Service 672cf4
        }
Packit Service 672cf4
#else
Packit Service 672cf4
        if (const gpgme_error_t err = gpgme_conf_arg_new(&arg, type, const_cast<void *>(value))) {
Packit Service 672cf4
            return 0;
Packit Service 672cf4
        }
Packit Service 672cf4
#endif
Packit Service 672cf4
        else {
Packit Service 672cf4
            return arg;
Packit Service 672cf4
        }
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    gpgme_conf_arg_t operator()(bool v) const
Packit Service 672cf4
    {
Packit Service 672cf4
        return v ? make_argument(0) : 0 ;
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    gpgme_conf_arg_t operator()(const char *s) const
Packit Service 672cf4
    {
Packit Service 672cf4
        return make_argument(s ? s : "");
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    gpgme_conf_arg_t operator()(const std::string &s) const
Packit Service 672cf4
    {
Packit Service 672cf4
        return operator()(s.c_str());
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    gpgme_conf_arg_t operator()(int i) const
Packit Service 672cf4
    {
Packit Service 672cf4
        return make_argument(&i);
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    gpgme_conf_arg_t operator()(unsigned int i) const
Packit Service 672cf4
    {
Packit Service 672cf4
        return make_argument(&i);
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
    template <typename T>
Packit Service 672cf4
    gpgme_conf_arg_t operator()(const std::vector<T> &value) const
Packit Service 672cf4
    {
Packit Service 672cf4
        gpgme_conf_arg_t result = 0;
Packit Service 672cf4
        gpgme_conf_arg_t last = 0;
Packit Service 672cf4
        for (typename std::vector<T>::const_iterator it = value.begin(), end = value.end() ; it != end ; ++it) {
Packit Service 672cf4
            if (gpgme_conf_arg_t arg = make_argument(to_void_star(*it))) {
Packit Service 672cf4
                if (last) {
Packit Service 672cf4
                    last = last->next = arg;
Packit Service 672cf4
                } else {
Packit Service 672cf4
                    result = last = arg;
Packit Service 672cf4
                }
Packit Service 672cf4
            }
Packit Service 672cf4
        }
Packit Service 672cf4
        return result;
Packit Service 672cf4
    }
Packit Service 672cf4
Packit Service 672cf4
};
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
static gpgme_conf_arg_t variant_to_argument(const Option::Variant &value)
Packit Service 672cf4
{
Packit Service 672cf4
    VariantToArgumentVisitor v;
Packit Service 672cf4
    return apply_visitor(v, value);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
optional<Option::Variant> Option::defaultValue() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return optional<Variant>();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return argument_to_variant(opt->alt_type, opt->flags & GPGME_CONF_LIST, opt->default_value);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
#endif
Packit Service 672cf4
Packit Service 672cf4
Argument Option::defaultValue() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, opt->default_value, false);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Option::defaultDescription() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return isNull() ? 0 : opt->default_description ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::noArgumentValue() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, opt->no_arg_value, false);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Option::noArgumentDescription() const
Packit Service 672cf4
{
Packit Service 6c01f9
    return isNull() ? 0 : opt->no_arg_description ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::activeValue() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, opt->value, false);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::currentValue() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    }
Packit Service 672cf4
    const gpgme_conf_arg_t arg =
Packit Service 672cf4
        opt->change_value ? opt->new_value ? opt->new_value : opt->default_value :
Packit Service 672cf4
        opt->value        ? opt->value :
Packit Service 672cf4
        /* else */          opt->default_value ;
Packit Service 672cf4
    return Argument(comp.lock(), opt, arg, false);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::newValue() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, opt->new_value, false);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
bool Option::set() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return false;
Packit Service 672cf4
    } else if (opt->change_value) {
Packit Service 672cf4
        return opt->new_value;
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return opt->value;
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
bool Option::dirty() const
Packit Service 672cf4
{
Packit Service 672cf4
    return !isNull() && opt->change_value ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Error Option::setNewValue(const Argument &argument)
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Error(make_error(GPG_ERR_INV_ARG));
Packit Service 672cf4
    } else if (argument.isNull()) {
Packit Service 672cf4
        return resetToDefaultValue();
Packit Service 672cf4
    } else if (const gpgme_conf_arg_t arg = mygpgme_conf_arg_copy(argument.arg, opt->alt_type)) {
Packit Service 672cf4
        return Error(gpgme_conf_opt_change(opt, 0, arg));
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Error(make_error(GPG_ERR_ENOMEM));
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Error Option::resetToActiveValue()
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Error(make_error(GPG_ERR_INV_ARG));
Packit Service 672cf4
    } else {
Packit Service 6c01f9
        return Error(gpgme_conf_opt_change(opt, 1, 0));
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Error Option::resetToDefaultValue()
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return Error(make_error(GPG_ERR_INV_ARG));
Packit Service 672cf4
    } else {
Packit Service 6c01f9
        return Error(gpgme_conf_opt_change(opt, 0, 0));
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
static gpgme_conf_arg_t make_argument(gpgme_conf_type_t type, const void *value)
Packit Service 672cf4
{
Packit Service 6c01f9
    gpgme_conf_arg_t arg = 0;
Packit Service 672cf4
    if (const gpgme_error_t err = gpgme_conf_arg_new(&arg, type, value)) {
Packit Service 6c01f9
        return 0;
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return arg;
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createNoneArgument(bool set) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || alternateType() != NoType) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        if (set) {
Packit Service 672cf4
            return createNoneListArgument(1);
Packit Service 672cf4
        }
Packit Service 672cf4
    }
Packit Service 672cf4
    return Argument();
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createStringArgument(const char *value) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || alternateType() != StringType) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, make_argument(GPGME_CONF_STRING, value), true);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createStringArgument(const std::string &value) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || alternateType() != StringType) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, make_argument(GPGME_CONF_STRING, value.c_str()), true);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createIntArgument(int value) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || alternateType() != IntegerType) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, make_argument(GPGME_CONF_INT32, &value), true);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createUIntArgument(unsigned int value) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || alternateType() != UnsignedIntegerType) {
Packit Service 672cf4
        return Argument();
Packit Service 672cf4
    } else {
Packit Service 672cf4
        return Argument(comp.lock(), opt, make_argument(GPGME_CONF_UINT32, &value), true);
Packit Service 672cf4
    }
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
namespace
Packit Service 672cf4
{
Packit Service 672cf4
const void *to_void_star(const char *s)
Packit Service 672cf4
{
Packit Service 672cf4
    return s;
Packit Service 672cf4
}
Packit Service 672cf4
const void *to_void_star(const std::string &s)
Packit Service 672cf4
{
Packit Service 672cf4
    return s.c_str();
Packit Service 672cf4
}
Packit Service 672cf4
const void *to_void_star(const int &i)
Packit Service 672cf4
{
Packit Service 672cf4
    return &i;    // const-&: sic!
Packit Service 672cf4
}
Packit Service 672cf4
const void *to_void_star(const unsigned int &i)
Packit Service 672cf4
{
Packit Service 672cf4
    return &i;    // const-&: sic!
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
template <typename T>
Packit Service 672cf4
gpgme_conf_arg_t make_argument(gpgme_conf_type_t type, const std::vector<T> &value)
Packit Service 672cf4
{
Packit Service 6c01f9
    gpgme_conf_arg_t result = 0;
Packit Service 6c01f9
    gpgme_conf_arg_t last = 0;
Packit Service 672cf4
    for (typename std::vector<T>::const_iterator it = value.begin(), end = value.end() ; it != end ; ++it) {
Packit Service 672cf4
        if (gpgme_conf_arg_t arg = make_argument(type, to_void_star(*it))) {
Packit Service 672cf4
            if (last) {
Packit Service 672cf4
                last = last->next = arg;
Packit Service 672cf4
            } else {
Packit Service 672cf4
                result = last = arg;
Packit Service 672cf4
            }
Packit Service 672cf4
        }
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createNoneListArgument(unsigned int value) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (value) {
Packit Service 672cf4
        return Argument(comp.lock(), opt, make_argument(GPGME_CONF_NONE, &value), true);
Packit Service 672cf4
    }
Packit Service 672cf4
    return Argument();
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createStringListArgument(const std::vector<const char *> &value) const
Packit Service 672cf4
{
Packit Service 672cf4
    return Argument(comp.lock(), opt, make_argument(GPGME_CONF_STRING, value), true);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createStringListArgument(const std::vector<std::string> &value) const
Packit Service 672cf4
{
Packit Service 672cf4
    return Argument(comp.lock(), opt, make_argument(GPGME_CONF_STRING, value), true);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createIntListArgument(const std::vector<int> &value) const
Packit Service 672cf4
{
Packit Service 672cf4
    return Argument(comp.lock(), opt, make_argument(GPGME_CONF_INT32, value), true);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument Option::createUIntListArgument(const std::vector<unsigned int> &value) const
Packit Service 672cf4
{
Packit Service 672cf4
    return Argument(comp.lock(), opt, make_argument(GPGME_CONF_UINT32, value), true);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument::Argument(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg, bool owns)
Packit Service 672cf4
    : comp(comp),
Packit Service 672cf4
      opt(opt),
Packit Service 672cf4
      arg(owns ? arg : mygpgme_conf_arg_copy(arg, opt ? opt->alt_type : GPGME_CONF_NONE))
Packit Service 672cf4
{
Packit Service 672cf4
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
#if 0
Packit Service 672cf4
Argument::Argument(const shared_gpgme_conf_comp_t &comp, gpgme_conf_opt_t opt, gpgme_conf_arg_t arg)
Packit Service 672cf4
    : comp(comp),
Packit Service 672cf4
      opt(opt),
Packit Service 672cf4
      arg(mygpgme_conf_arg_copy(arg, opt ? opt->alt_type : GPGME_CONF_NONE))
Packit Service 672cf4
{
Packit Service 672cf4
Packit Service 672cf4
}
Packit Service 672cf4
#endif
Packit Service 672cf4
Packit Service 672cf4
Argument::Argument(const Argument &other)
Packit Service 672cf4
    : comp(other.comp),
Packit Service 672cf4
      opt(other.opt),
Packit Service 672cf4
      arg(mygpgme_conf_arg_copy(other.arg, opt ? opt->alt_type : GPGME_CONF_NONE))
Packit Service 672cf4
{
Packit Service 672cf4
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Argument::~Argument()
Packit Service 672cf4
{
Packit Service 672cf4
    gpgme_conf_arg_release(arg, opt ? opt->alt_type : GPGME_CONF_NONE);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
Option Argument::parent() const
Packit Service 672cf4
{
Packit Service 672cf4
    return Option(comp.lock(), opt);
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
bool Argument::boolValue() const
Packit Service 672cf4
{
Packit Service 672cf4
    return numberOfTimesSet();
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
unsigned int Argument::numElements() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull()) {
Packit Service 672cf4
        return 0;
Packit Service 672cf4
    }
Packit Service 672cf4
    unsigned int result = 0;
Packit Service 672cf4
    for (gpgme_conf_arg_t a = arg ; a ; a = a->next) {
Packit Service 672cf4
        ++result;
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
const char *Argument::stringValue(unsigned int idx) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || opt->alt_type != GPGME_CONF_STRING) {
Packit Service 6c01f9
        return 0;
Packit Service 672cf4
    }
Packit Service 672cf4
    gpgme_conf_arg_t a = arg;
Packit Service 672cf4
    while (a && idx) {
Packit Service 672cf4
        a = a->next;
Packit Service 672cf4
        --idx;
Packit Service 672cf4
    }
Packit Service 6c01f9
    return a ? a->value.string : 0 ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
int Argument::intValue(unsigned int idx) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || opt->alt_type != GPGME_CONF_INT32) {
Packit Service 672cf4
        return 0;
Packit Service 672cf4
    }
Packit Service 672cf4
    gpgme_conf_arg_t a = arg;
Packit Service 672cf4
    while (a && idx) {
Packit Service 672cf4
        a = a->next;
Packit Service 672cf4
        --idx;
Packit Service 672cf4
    }
Packit Service 672cf4
    return a ? a->value.int32 : 0 ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
unsigned int Argument::uintValue(unsigned int idx) const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || opt->alt_type != GPGME_CONF_UINT32) {
Packit Service 672cf4
        return 0;
Packit Service 672cf4
    }
Packit Service 672cf4
    gpgme_conf_arg_t a = arg;
Packit Service 672cf4
    while (a && idx) {
Packit Service 672cf4
        a = a->next;
Packit Service 672cf4
        --idx;
Packit Service 672cf4
    }
Packit Service 672cf4
    return a ? a->value.uint32 : 0 ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
unsigned int Argument::numberOfTimesSet() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || opt->alt_type != GPGME_CONF_NONE) {
Packit Service 672cf4
        return 0;
Packit Service 672cf4
    }
Packit Service 672cf4
    return arg->value.count;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::vector<const char *> Argument::stringValues() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || opt->alt_type != GPGME_CONF_STRING) {
Packit Service 672cf4
        return std::vector<const char *>();
Packit Service 672cf4
    }
Packit Service 672cf4
    std::vector<const char *> result;
Packit Service 672cf4
    for (gpgme_conf_arg_t a = arg ; a ; a = a->next) {
Packit Service 672cf4
        result.push_back(a->value.string);
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::vector<int> Argument::intValues() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || opt->alt_type != GPGME_CONF_INT32) {
Packit Service 672cf4
        return std::vector<int>();
Packit Service 672cf4
    }
Packit Service 672cf4
    std::vector<int> result;
Packit Service 672cf4
    for (gpgme_conf_arg_t a = arg ; a ; a = a->next) {
Packit Service 672cf4
        result.push_back(a->value.int32);
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::vector<unsigned int> Argument::uintValues() const
Packit Service 672cf4
{
Packit Service 672cf4
    if (isNull() || opt->alt_type != GPGME_CONF_UINT32) {
Packit Service 672cf4
        return std::vector<unsigned int>();
Packit Service 672cf4
    }
Packit Service 672cf4
    std::vector<unsigned int> result;
Packit Service 672cf4
    for (gpgme_conf_arg_t a = arg ; a ; a = a->next) {
Packit Service 672cf4
        result.push_back(a->value.uint32);
Packit Service 672cf4
    }
Packit Service 672cf4
    return result;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::ostream &Configuration::operator<<(std::ostream &os, Level level)
Packit Service 672cf4
{
Packit Service 672cf4
    switch (level) {
Packit Service 672cf4
    case Basic:     return os << "Basic";
Packit Service 672cf4
    case Advanced:  return os << "Advanced";
Packit Service 672cf4
    case Expert:    return os << "Expert";
Packit Service 672cf4
    case Invisible: return os << "Invisible";
Packit Service 672cf4
    case Internal:  return os << "Internal";
Packit Service 672cf4
    case NumLevels: ;
Packit Service 672cf4
    }
Packit Service 672cf4
    return os << "<unknown>";
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::ostream &Configuration::operator<<(std::ostream &os, Type type)
Packit Service 672cf4
{
Packit Service 672cf4
    switch (type) {
Packit Service 672cf4
    case NoType:              return os << "None";
Packit Service 672cf4
    case StringType:          return os << "String";
Packit Service 672cf4
    case IntegerType:         return os << "Integer";
Packit Service 672cf4
    case UnsignedIntegerType: return os << "UnsignedInteger";
Packit Service 672cf4
    case FilenameType:        return os << "Filename";
Packit Service 672cf4
    case LdapServerType:      return os << "LdapServer";
Packit Service 672cf4
    case KeyFingerprintType:  return os << "KeyFingerprint";
Packit Service 672cf4
    case PublicKeyType:       return os << "PublicKey";
Packit Service 672cf4
    case SecretKeyType:       return os << "SecretKey";
Packit Service 672cf4
    case AliasListType:       return os << "AliasList";
Packit Service 672cf4
    case MaxType: ;
Packit Service 672cf4
    }
Packit Service 672cf4
    return os << "<unknown>";
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::ostream &Configuration::operator<<(std::ostream &os, Flag f)
Packit Service 672cf4
{
Packit Service 672cf4
    unsigned int flags = f;
Packit Service 672cf4
    std::vector<const char *> s;
Packit Service 672cf4
    if (flags & Group) {
Packit Service 672cf4
        s.push_back("Group");
Packit Service 672cf4
    }
Packit Service 672cf4
    if (flags & Optional) {
Packit Service 672cf4
        s.push_back("Optional");
Packit Service 672cf4
    }
Packit Service 672cf4
    if (flags & List) {
Packit Service 672cf4
        s.push_back("List");
Packit Service 672cf4
    }
Packit Service 672cf4
    if (flags & Runtime) {
Packit Service 672cf4
        s.push_back("Runtime");
Packit Service 672cf4
    }
Packit Service 672cf4
    if (flags & Default) {
Packit Service 672cf4
        s.push_back("Default");
Packit Service 672cf4
    }
Packit Service 672cf4
    if (flags & DefaultDescription) {
Packit Service 672cf4
        s.push_back("DefaultDescription");
Packit Service 672cf4
    }
Packit Service 672cf4
    if (flags & NoArgumentDescription) {
Packit Service 672cf4
        s.push_back("NoArgumentDescription");
Packit Service 672cf4
    }
Packit Service 672cf4
    if (flags & NoChange) {
Packit Service 672cf4
        s.push_back("NoChange");
Packit Service 672cf4
    }
Packit Service 672cf4
    flags &= ~(Group | Optional | List | Runtime | Default | DefaultDescription | NoArgumentDescription | NoChange);
Packit Service 672cf4
    if (flags) {
Packit Service 672cf4
        s.push_back("other flags(");
Packit Service 672cf4
    }
Packit Service 672cf4
    std::copy(s.begin(), s.end(),
Packit Service 672cf4
              std::ostream_iterator<const char *>(os, "|"));
Packit Service 672cf4
    if (flags) {
Packit Service 672cf4
        os << flags << ')';
Packit Service 672cf4
    }
Packit Service 672cf4
    return os;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::ostream &Configuration::operator<<(std::ostream &os, const Component &c)
Packit Service 672cf4
{
Packit Service 672cf4
    os << "Component["
Packit Service 672cf4
       << "\n  name       : " << protect(c.name())
Packit Service 672cf4
       << "\n  description: " << protect(c.description())
Packit Service 672cf4
       << "\n  programName: " << protect(c.programName())
Packit Service 672cf4
       << "\n  options    : \n";
Packit Service 672cf4
    const std::vector<Option> options = c.options();
Packit Service 672cf4
    std::copy(options.begin(), options.end(),
Packit Service 672cf4
              std::ostream_iterator<Option>(os, "\n"));
Packit Service 672cf4
    os << "\n]";
Packit Service 672cf4
    return os;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::ostream &Configuration::operator<<(std::ostream &os, const Option &o)
Packit Service 672cf4
{
Packit Service 672cf4
    return os << "Option["
Packit Service 672cf4
           << "\n  name:       : " << protect(o.name())
Packit Service 672cf4
           << "\n  description : " << protect(o.description())
Packit Service 672cf4
           << "\n  argName     : " << protect(o.argumentName())
Packit Service 672cf4
           << "\n  flags       : " << static_cast<Flag>(o.flags())
Packit Service 672cf4
           << "\n  level       : " << o.level()
Packit Service 672cf4
           << "\n  type        : " << o.type()
Packit Service 672cf4
           << "\n  alt_type    : " << o.alternateType()
Packit Service 672cf4
           << "\n  default_val : " << o.defaultValue()
Packit Service 672cf4
           << "\n  default_desc: " << protect(o.defaultDescription())
Packit Service 672cf4
           << "\n  no_arg_value: " << o.noArgumentValue()
Packit Service 672cf4
           << "\n  no_arg_desc : " << protect(o.noArgumentDescription())
Packit Service 672cf4
           << "\n  active_value: " << o.activeValue()
Packit Service 672cf4
           << "\n  new_value   : " << o.newValue()
Packit Service 672cf4
           << "\n  --> cur_val : " << o.currentValue()
Packit Service 672cf4
           << "\n  set         : " << o.set()
Packit Service 672cf4
           << "\n  dirty       : " << o.dirty()
Packit Service 672cf4
           << "\n]"
Packit Service 672cf4
           ;
Packit Service 672cf4
}
Packit Service 672cf4
Packit Service 672cf4
std::ostream &Configuration::operator<<(std::ostream &os, const Argument &a)
Packit Service 672cf4
{
Packit Service 672cf4
    const Option o = a.parent();
Packit Service 672cf4
    const bool list = o.flags() & List;
Packit Service 672cf4
    os << "Argument[";
Packit Service 672cf4
    if (a) {
Packit Service 672cf4
        switch (o.alternateType()) {
Packit Service 672cf4
        case NoType:
Packit Service 672cf4
            if (list) {
Packit Service 672cf4
                os << a.numberOfTimesSet() << 'x';
Packit Service 672cf4
            } else {
Packit Service 672cf4
                os << a.boolValue();
Packit Service 672cf4
            }
Packit Service 672cf4
            break;
Packit Service 672cf4
        default:
Packit Service 672cf4
        case StringType:
Packit Service 672cf4
            if (list) {
Packit Service 672cf4
                const std::vector<const char *> v = a.stringValues();
Packit Service 672cf4
                os << v.size() << ':';
Packit Service 672cf4
                // can't use std::copy + ostream_iterator here, since we need the protect() call
Packit Service 672cf4
                bool first = true;
Packit Service 672cf4
                std::for_each(v.begin(), v.end(), [&first, &os](const char *s) {
Packit Service 672cf4
                    if (first) {
Packit Service 672cf4
                        first = false;
Packit Service 672cf4
                    } else {
Packit Service 672cf4
                        os << ',';
Packit Service 672cf4
                    }
Packit Service 672cf4
                    os << protect(s);
Packit Service 672cf4
                });
Packit Service 672cf4
            } else {
Packit Service 672cf4
                os << protect(a.stringValue());
Packit Service 672cf4
            }
Packit Service 672cf4
            break;
Packit Service 672cf4
        case IntegerType:
Packit Service 672cf4
            if (list) {
Packit Service 672cf4
                const std::vector<int> v = a.intValues();
Packit Service 672cf4
                os << v.size() << ':';
Packit Service 672cf4
                std::copy(v.begin(), v.end(),
Packit Service 672cf4
                          std::ostream_iterator<int>(os, ","));
Packit Service 672cf4
            } else {
Packit Service 672cf4
                os << a.intValue();
Packit Service 672cf4
            }
Packit Service 672cf4
            break;
Packit Service 672cf4
        case UnsignedIntegerType:
Packit Service 672cf4
            if (list) {
Packit Service 672cf4
                const std::vector<unsigned int> v = a.uintValues();
Packit Service 672cf4
                os << v.size() << ':';
Packit Service 672cf4
                std::copy(v.begin(), v.end(),
Packit Service 672cf4
                          std::ostream_iterator<unsigned int>(os, ","));
Packit Service 672cf4
            } else {
Packit Service 672cf4
                os << a.intValue();
Packit Service 672cf4
            }
Packit Service 672cf4
            break;
Packit Service 672cf4
        }
Packit Service 672cf4
    }
Packit Service 672cf4
    return os << ']';
Packit Service 672cf4
}