bb67fc8cd6b2a5c72bc8ff4da16fdb6cd0f57660
[gpgme.git] / lang / cpp / src / tofuinfo.cpp
1 /* tofuinfo.cpp - wraps gpgme tofu info
2   Copyright (C) 2016 Intevation GmbH
3
4   This file is part of GPGME++.
5
6   GPGME++ is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Library General Public
8   License as published by the Free Software Foundation; either
9   version 2 of the License, or (at your option) any later version.
10
11   GPGME++ is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU Library General Public License for more details.
15
16   You should have received a copy of the GNU Library General Public License
17   along with GPGME++; see the file COPYING.LIB.  If not, write to the
18   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19   Boston, MA 02110-1301, USA.
20 */
21
22 #include "tofuinfo.h"
23
24 #include <istream>
25 #include "util.h"
26
27 class GpgME::TofuInfo::Private
28 {
29 public:
30     Private() {}
31     Private(gpgme_tofu_info_t info)
32         : mInfo(info ? new _gpgme_tofu_info(*info) : nullptr)
33     {
34         if (mInfo && mInfo->description) {
35             mInfo->description = strdup(mInfo->description);
36         }
37     }
38
39     Private(const Private &other)
40         : mInfo(other.mInfo)
41     {
42         if (mInfo && mInfo->description) {
43             mInfo->description = strdup(mInfo->description);
44         }
45     }
46
47     ~Private()
48     {
49         if (mInfo) {
50             std::free(mInfo->description);
51             mInfo->description = nullptr;
52
53             delete mInfo;
54         }
55     }
56
57     gpgme_tofu_info_t mInfo;
58 };
59
60 GpgME::TofuInfo::TofuInfo(gpgme_tofu_info_t info)
61     : d(new Private(info))
62 {
63 }
64
65 GpgME::TofuInfo::TofuInfo() : d()
66 {
67 }
68
69 bool GpgME::TofuInfo::isNull() const
70 {
71     return !d || !d->mInfo;
72 }
73
74 GpgME::TofuInfo::Validity GpgME::TofuInfo::validity() const
75 {
76     if (isNull()) {
77         return ValidityUnknown;
78     }
79     switch (d->mInfo->validity) {
80         case 0:
81             return Conflict;
82         case 1:
83             return NoHistory;
84         case 2:
85             return LittleHistory;
86         case 3:
87             return BasicHistory;
88         case 4:
89             return LargeHistory;
90         default:
91             return ValidityUnknown;
92     }
93 }
94
95 GpgME::TofuInfo::Policy GpgME::TofuInfo::policy() const
96 {
97     if (isNull()) {
98         return PolicyUnknown;
99     }
100     switch (d->mInfo->policy) {
101         case GPGME_TOFU_POLICY_NONE:
102             return PolicyNone;
103         case GPGME_TOFU_POLICY_AUTO:
104             return PolicyAuto;
105         case GPGME_TOFU_POLICY_GOOD:
106             return PolicyGood;
107         case GPGME_TOFU_POLICY_BAD:
108             return PolicyBad;
109         case GPGME_TOFU_POLICY_ASK:
110             return PolicyAsk;
111         case GPGME_TOFU_POLICY_UNKNOWN:
112             return PolicyUnknown;
113     }
114 }
115
116 const char *GpgME::TofuInfo::description() const
117 {
118     return isNull() ? nullptr : d->mInfo->description;
119 }
120
121 unsigned short GpgME::TofuInfo::signCount() const
122 {
123     return isNull() ? 0 : d->mInfo->signcount;
124 }
125
126 unsigned short GpgME::TofuInfo::encrCount() const
127 {
128     return isNull() ? 0 : d->mInfo->encrcount;
129 }
130
131 unsigned long GpgME::TofuInfo::signFirst() const
132 {
133     return isNull() ? 0 : d->mInfo->signfirst;
134 }
135
136 unsigned long GpgME::TofuInfo::signLast() const
137 {
138     return isNull() ? 0 : d->mInfo->signlast;
139 }
140
141 unsigned long GpgME::TofuInfo::encrFirst() const
142 {
143     return isNull() ? 0 : d->mInfo->encrfirst;
144 }
145
146 unsigned long GpgME::TofuInfo::encrLast() const
147 {
148     return isNull() ? 0 : d->mInfo->encrlast;
149 }
150
151 std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::TofuInfo &info)
152 {
153     os << "GpgME::Signature::TofuInfo(";
154     if (!info.isNull()) {
155         os << "\n desc: "     << protect(info.description())
156            << "\n validity: " << info.validity()
157            << "\n policy: "   << info.policy()
158            << "\n signcount: "<< info.signCount()
159            << "\n signfirst: "<< info.signFirst()
160            << "\n signlast: " << info.signLast()
161            << "\n encrcount: "<< info.encrCount()
162            << "\n encrfirst: "<< info.encrFirst()
163            << "\n encrlast: " << info.encrLast()
164            << '\n';
165     }
166     return os << ")";
167 }