Cpp / Qt: Reduce boost usage (memory and tuple)
[gpgme.git] / lang / cpp / src / importresult.cpp
1 /*
2   importresult.cpp - wraps a gpgme import result
3   Copyright (C) 2004 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
24 #include <importresult.h>
25 #include "result_p.h"
26
27 #include <gpgme.h>
28 #include <cstdlib>
29 #include <cstring>
30
31 #include <string.h>
32
33 class GpgME::ImportResult::Private
34 {
35 public:
36     Private(const _gpgme_op_import_result &r) : res(r)
37     {
38         // copy recursively, using compiler-generated copy ctor.
39         // We just need to handle the pointers in the structs:
40         for (gpgme_import_status_t is = r.imports ; is ; is = is->next) {
41             gpgme_import_status_t copy = new _gpgme_import_status(*is);
42             copy->fpr = strdup(is->fpr);
43             copy->next = 0;
44             imports.push_back(copy);
45         }
46         res.imports = 0;
47     }
48     ~Private()
49     {
50         for (std::vector<gpgme_import_status_t>::iterator it = imports.begin() ; it != imports.end() ; ++it) {
51             std::free((*it)->fpr);
52             delete *it; *it = 0;
53         }
54     }
55
56     _gpgme_op_import_result res;
57     std::vector<gpgme_import_status_t> imports;
58 };
59
60 GpgME::ImportResult::ImportResult(gpgme_ctx_t ctx, int error)
61     : GpgME::Result(error), d()
62 {
63     init(ctx);
64 }
65
66 GpgME::ImportResult::ImportResult(gpgme_ctx_t ctx, const Error &error)
67     : GpgME::Result(error), d()
68 {
69     init(ctx);
70 }
71
72 void GpgME::ImportResult::init(gpgme_ctx_t ctx)
73 {
74     if (!ctx) {
75         return;
76     }
77     gpgme_import_result_t res = gpgme_op_import_result(ctx);
78     if (!res) {
79         return;
80     }
81     d.reset(new Private(*res));
82 }
83
84 make_standard_stuff(ImportResult)
85
86 int GpgME::ImportResult::numConsidered() const
87 {
88     return d ? d->res.considered : 0 ;
89 }
90
91 int GpgME::ImportResult::numKeysWithoutUserID() const
92 {
93     return d ? d->res.no_user_id : 0 ;
94 }
95
96 int GpgME::ImportResult::numImported() const
97 {
98     return d ? d->res.imported : 0 ;
99 }
100
101 int GpgME::ImportResult::numRSAImported() const
102 {
103     return d ? d->res.imported_rsa : 0 ;
104 }
105
106 int GpgME::ImportResult::numUnchanged() const
107 {
108     return d ? d->res.unchanged : 0 ;
109 }
110
111 int GpgME::ImportResult::newUserIDs() const
112 {
113     return d ? d->res.new_user_ids : 0 ;
114 }
115
116 int GpgME::ImportResult::newSubkeys() const
117 {
118     return d ? d->res.new_sub_keys : 0 ;
119 }
120
121 int GpgME::ImportResult::newSignatures() const
122 {
123     return d ? d->res.new_signatures : 0 ;
124 }
125
126 int GpgME::ImportResult::newRevocations() const
127 {
128     return d ? d->res.new_revocations : 0 ;
129 }
130
131 int GpgME::ImportResult::numSecretKeysConsidered() const
132 {
133     return d ? d->res.secret_read : 0 ;
134 }
135
136 int GpgME::ImportResult::numSecretKeysImported() const
137 {
138     return d ? d->res.secret_imported : 0 ;
139 }
140
141 int GpgME::ImportResult::numSecretKeysUnchanged() const
142 {
143     return d ? d->res.secret_unchanged : 0 ;
144 }
145
146 int GpgME::ImportResult::notImported() const
147 {
148     return d ? d->res.not_imported : 0 ;
149 }
150
151 GpgME::Import GpgME::ImportResult::import(unsigned int idx) const
152 {
153     return Import(d, idx);
154 }
155
156 std::vector<GpgME::Import> GpgME::ImportResult::imports() const
157 {
158     if (!d) {
159         return std::vector<Import>();
160     }
161     std::vector<Import> result;
162     result.reserve(d->imports.size());
163     for (unsigned int i = 0 ; i < d->imports.size() ; ++i) {
164         result.push_back(Import(d, i));
165     }
166     return result;
167 }
168
169 GpgME::Import::Import(const std::shared_ptr<ImportResult::Private> &parent, unsigned int i)
170     : d(parent), idx(i)
171 {
172
173 }
174
175 GpgME::Import::Import() : d(), idx(0) {}
176
177 bool GpgME::Import::isNull() const
178 {
179     return !d || idx >= d->imports.size() ;
180 }
181
182 const char *GpgME::Import::fingerprint() const
183 {
184     return isNull() ? 0 : d->imports[idx]->fpr ;
185 }
186
187 GpgME::Error GpgME::Import::error() const
188 {
189     return Error(isNull() ? 0 : d->imports[idx]->result);
190 }
191
192 GpgME::Import::Status GpgME::Import::status() const
193 {
194     if (isNull()) {
195         return Unknown;
196     }
197     const unsigned int s = d->imports[idx]->status;
198     unsigned int result = Unknown;
199     if (s & GPGME_IMPORT_NEW) {
200         result |= NewKey;
201     }
202     if (s & GPGME_IMPORT_UID) {
203         result |= NewUserIDs;
204     }
205     if (s & GPGME_IMPORT_SIG) {
206         result |= NewSignatures;
207     }
208     if (s & GPGME_IMPORT_SUBKEY) {
209         result |= NewSubkeys;
210     }
211     if (s & GPGME_IMPORT_SECRET) {
212         result |= ContainedSecretKey;
213     }
214     return static_cast<Status>(result);
215 }