Blame lang/cpp/src/importresult.cpp

Packit d7e8d0
/*
Packit d7e8d0
  importresult.cpp - wraps a gpgme import result
Packit d7e8d0
  Copyright (C) 2004 Klarälvdalens Datakonsult AB
Packit d7e8d0
  2016 Bundesamt für Sicherheit in der Informationstechnik
Packit d7e8d0
  Software engineering by Intevation GmbH
Packit d7e8d0
Packit d7e8d0
  This file is part of GPGME++.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is free software; you can redistribute it and/or
Packit d7e8d0
  modify it under the terms of the GNU Library General Public
Packit d7e8d0
  License as published by the Free Software Foundation; either
Packit d7e8d0
  version 2 of the License, or (at your option) any later version.
Packit d7e8d0
Packit d7e8d0
  GPGME++ is distributed in the hope that it will be useful,
Packit d7e8d0
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d7e8d0
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit d7e8d0
  GNU Library General Public License for more details.
Packit d7e8d0
Packit d7e8d0
  You should have received a copy of the GNU Library General Public License
Packit d7e8d0
  along with GPGME++; see the file COPYING.LIB.  If not, write to the
Packit d7e8d0
  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit d7e8d0
  Boston, MA 02110-1301, USA.
Packit d7e8d0
*/
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
#ifdef HAVE_CONFIG_H
Packit d7e8d0
 #include "config.h"
Packit d7e8d0
#endif
Packit d7e8d0
Packit d7e8d0
#include <importresult.h>
Packit d7e8d0
#include "result_p.h"
Packit d7e8d0
Packit d7e8d0
#include <gpgme.h>
Packit d7e8d0
#include <cstdlib>
Packit d7e8d0
#include <cstring>
Packit d7e8d0
Packit d7e8d0
#include <string.h>
Packit Service 30b792
#include <strings.h>
Packit Service 30b792
#include <istream>
Packit Service 30b792
#include <iterator>
Packit d7e8d0
Packit d7e8d0
class GpgME::ImportResult::Private
Packit d7e8d0
{
Packit d7e8d0
public:
Packit d7e8d0
    Private(const _gpgme_op_import_result &r) : res(r)
Packit d7e8d0
    {
Packit d7e8d0
        // copy recursively, using compiler-generated copy ctor.
Packit d7e8d0
        // We just need to handle the pointers in the structs:
Packit d7e8d0
        for (gpgme_import_status_t is = r.imports ; is ; is = is->next) {
Packit d7e8d0
            gpgme_import_status_t copy = new _gpgme_import_status(*is);
Packit d7e8d0
            copy->fpr = strdup(is->fpr);
Packit Service 30b792
            copy->next = nullptr;
Packit d7e8d0
            imports.push_back(copy);
Packit d7e8d0
        }
Packit Service 30b792
        res.imports = nullptr;
Packit d7e8d0
    }
Packit d7e8d0
    ~Private()
Packit d7e8d0
    {
Packit d7e8d0
        for (std::vector<gpgme_import_status_t>::iterator it = imports.begin() ; it != imports.end() ; ++it) {
Packit d7e8d0
            std::free((*it)->fpr);
Packit Service 30b792
            delete *it; *it = nullptr;
Packit d7e8d0
        }
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
    _gpgme_op_import_result res;
Packit d7e8d0
    std::vector<gpgme_import_status_t> imports;
Packit d7e8d0
};
Packit d7e8d0
Packit d7e8d0
GpgME::ImportResult::ImportResult(gpgme_ctx_t ctx, int error)
Packit d7e8d0
    : GpgME::Result(error), d()
Packit d7e8d0
{
Packit d7e8d0
    init(ctx);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::ImportResult::ImportResult(gpgme_ctx_t ctx, const Error &error)
Packit d7e8d0
    : GpgME::Result(error), d()
Packit d7e8d0
{
Packit d7e8d0
    init(ctx);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
void GpgME::ImportResult::init(gpgme_ctx_t ctx)
Packit d7e8d0
{
Packit d7e8d0
    if (!ctx) {
Packit d7e8d0
        return;
Packit d7e8d0
    }
Packit d7e8d0
    gpgme_import_result_t res = gpgme_op_import_result(ctx);
Packit d7e8d0
    if (!res) {
Packit d7e8d0
        return;
Packit d7e8d0
    }
Packit d7e8d0
    d.reset(new Private(*res));
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
make_standard_stuff(ImportResult)
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numConsidered() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.considered : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numKeysWithoutUserID() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.no_user_id : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numImported() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.imported : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numRSAImported() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.imported_rsa : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numUnchanged() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.unchanged : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::newUserIDs() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.new_user_ids : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::newSubkeys() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.new_sub_keys : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::newSignatures() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.new_signatures : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::newRevocations() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.new_revocations : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numSecretKeysConsidered() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.secret_read : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numSecretKeysImported() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.secret_imported : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::numSecretKeysUnchanged() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.secret_unchanged : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
int GpgME::ImportResult::notImported() const
Packit d7e8d0
{
Packit d7e8d0
    return d ? d->res.not_imported : 0 ;
Packit d7e8d0
}
Packit d7e8d0
Packit Service 30b792
int GpgME::ImportResult::numV3KeysSkipped() const
Packit Service 30b792
{
Packit Service 30b792
    return d ? d->res.skipped_v3_keys : 0 ;
Packit Service 30b792
}
Packit Service 30b792
Packit d7e8d0
GpgME::Import GpgME::ImportResult::import(unsigned int idx) const
Packit d7e8d0
{
Packit d7e8d0
    return Import(d, idx);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
std::vector<GpgME::Import> GpgME::ImportResult::imports() const
Packit d7e8d0
{
Packit d7e8d0
    if (!d) {
Packit d7e8d0
        return std::vector<Import>();
Packit d7e8d0
    }
Packit d7e8d0
    std::vector<Import> result;
Packit d7e8d0
    result.reserve(d->imports.size());
Packit d7e8d0
    for (unsigned int i = 0 ; i < d->imports.size() ; ++i) {
Packit d7e8d0
        result.push_back(Import(d, i));
Packit d7e8d0
    }
Packit d7e8d0
    return result;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Import::Import(const std::shared_ptr<ImportResult::Private> &parent, unsigned int i)
Packit d7e8d0
    : d(parent), idx(i)
Packit d7e8d0
{
Packit d7e8d0
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Import::Import() : d(), idx(0) {}
Packit d7e8d0
Packit d7e8d0
bool GpgME::Import::isNull() const
Packit d7e8d0
{
Packit d7e8d0
    return !d || idx >= d->imports.size() ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
const char *GpgME::Import::fingerprint() const
Packit d7e8d0
{
Packit Service 30b792
    return isNull() ? nullptr : d->imports[idx]->fpr ;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Error GpgME::Import::error() const
Packit d7e8d0
{
Packit d7e8d0
    return Error(isNull() ? 0 : d->imports[idx]->result);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
GpgME::Import::Status GpgME::Import::status() const
Packit d7e8d0
{
Packit d7e8d0
    if (isNull()) {
Packit d7e8d0
        return Unknown;
Packit d7e8d0
    }
Packit d7e8d0
    const unsigned int s = d->imports[idx]->status;
Packit d7e8d0
    unsigned int result = Unknown;
Packit d7e8d0
    if (s & GPGME_IMPORT_NEW) {
Packit d7e8d0
        result |= NewKey;
Packit d7e8d0
    }
Packit d7e8d0
    if (s & GPGME_IMPORT_UID) {
Packit d7e8d0
        result |= NewUserIDs;
Packit d7e8d0
    }
Packit d7e8d0
    if (s & GPGME_IMPORT_SIG) {
Packit d7e8d0
        result |= NewSignatures;
Packit d7e8d0
    }
Packit d7e8d0
    if (s & GPGME_IMPORT_SUBKEY) {
Packit d7e8d0
        result |= NewSubkeys;
Packit d7e8d0
    }
Packit d7e8d0
    if (s & GPGME_IMPORT_SECRET) {
Packit d7e8d0
        result |= ContainedSecretKey;
Packit d7e8d0
    }
Packit d7e8d0
    return static_cast<Status>(result);
Packit d7e8d0
}
Packit Service 30b792
Packit Service 30b792
std::ostream &GpgME::operator<<(std::ostream &os,
Packit Service 30b792
                                const GpgME::ImportResult &result)
Packit Service 30b792
{
Packit Service 30b792
    os << "GpgME::ImportResult(";
Packit Service 30b792
    if (!result.isNull()) {
Packit Service 30b792
        os << "\n considered:          " << result.numConsidered()
Packit Service 30b792
           << "\n without UID:         " << result.numKeysWithoutUserID()
Packit Service 30b792
           << "\n imported:            " << result.numImported()
Packit Service 30b792
           << "\n RSA Imported:        " << result.numRSAImported()
Packit Service 30b792
           << "\n unchanged:           " << result.numUnchanged()
Packit Service 30b792
           << "\n newUserIDs:          " << result.newUserIDs()
Packit Service 30b792
           << "\n newSubkeys:          " << result.newSubkeys()
Packit Service 30b792
           << "\n newSignatures:       " << result.newSignatures()
Packit Service 30b792
           << "\n newRevocations:      " << result.newRevocations()
Packit Service 30b792
           << "\n numSecretKeysConsidered: " << result.numSecretKeysConsidered()
Packit Service 30b792
           << "\n numSecretKeysImported:   " << result.numSecretKeysImported()
Packit Service 30b792
           << "\n numSecretKeysUnchanged:  " << result.numSecretKeysUnchanged()
Packit Service 30b792
           << "\n"
Packit Service 30b792
           << "\n notImported:         " << result.notImported()
Packit Service 30b792
           << "\n numV3KeysSkipped:    " << result.numV3KeysSkipped()
Packit Service 30b792
           << "\n imports:\n";
Packit Service 30b792
        const std::vector<Import> imp = result.imports();
Packit Service 30b792
        std::copy(imp.begin(), imp.end(),
Packit Service 30b792
                  std::ostream_iterator<Import>(os, "\n"));
Packit Service 30b792
    }
Packit Service 30b792
    return os << ')';
Packit Service 30b792
}
Packit Service 30b792
Packit Service 30b792
std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::Import &imp)
Packit Service 30b792
{
Packit Service 30b792
    os << "GpgME::Import(";
Packit Service 30b792
    if (!imp.isNull()) {
Packit Service 30b792
        os << "\n fpr:       " << (imp.fingerprint() ? imp.fingerprint() : "null")
Packit Service 30b792
           << "\n status:    " << imp.status()
Packit Service 30b792
           << "\n err:       " << imp.error();
Packit Service 30b792
    }
Packit Service 30b792
    return os << ')';
Packit Service 30b792
}