e661b3b1c238d74a8f4a513c4babab6e7dd9189b
[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         default:
113             return PolicyUnknown;
114     }
115 }
116
117 const char *GpgME::TofuInfo::description() const
118 {
119     return isNull() ? nullptr : d->mInfo->description;
120 }
121
122 unsigned short GpgME::TofuInfo::signCount() const
123 {
124     return isNull() ? 0 : d->mInfo->signcount;
125 }
126
127 unsigned short GpgME::TofuInfo::encrCount() const
128 {
129     return isNull() ? 0 : d->mInfo->encrcount;
130 }
131
132 unsigned long GpgME::TofuInfo::signFirst() const
133 {
134     return isNull() ? 0 : d->mInfo->signfirst;
135 }
136
137 unsigned long GpgME::TofuInfo::signLast() const
138 {
139     return isNull() ? 0 : d->mInfo->signlast;
140 }
141
142 unsigned long GpgME::TofuInfo::encrFirst() const
143 {
144     return isNull() ? 0 : d->mInfo->encrfirst;
145 }
146
147 unsigned long GpgME::TofuInfo::encrLast() const
148 {
149     return isNull() ? 0 : d->mInfo->encrlast;
150 }
151
152 std::ostream &GpgME::operator<<(std::ostream &os, const GpgME::TofuInfo &info)
153 {
154     os << "GpgME::Signature::TofuInfo(";
155     if (!info.isNull()) {
156         os << "\n desc: "     << protect(info.description())
157            << "\n validity: " << info.validity()
158            << "\n policy: "   << info.policy()
159            << "\n signcount: "<< info.signCount()
160            << "\n signfirst: "<< info.signFirst()
161            << "\n signlast: " << info.signLast()
162            << "\n encrcount: "<< info.encrCount()
163            << "\n encrfirst: "<< info.encrFirst()
164            << "\n encrlast: " << info.encrLast()
165            << '\n';
166     }
167     return os << ")";
168 }