43c8592edfa9b8a2a52adc50f705c3eda3caec00
[gpgme.git] / lang / cpp / src / gpgadduserideditinteractor.cpp
1 /*
2   gpgadduserideditinteractor.cpp - Edit Interactor to add a new UID to an OpenPGP key
3   Copyright (C) 2008 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 #include "gpgadduserideditinteractor.h"
24
25 #include "error.h"
26
27 #include <gpgme.h>
28
29 #include <cstring>
30
31 using std::strcmp;
32
33 // avoid conflict (msvc)
34 #ifdef ERROR
35 # undef ERROR
36 #endif
37
38 using namespace GpgME;
39
40 GpgAddUserIDEditInteractor::GpgAddUserIDEditInteractor()
41     : EditInteractor(),
42       m_name(),
43       m_email(),
44       m_comment()
45 {
46
47 }
48
49 GpgAddUserIDEditInteractor::~GpgAddUserIDEditInteractor() {}
50
51 void GpgAddUserIDEditInteractor::setNameUtf8(const std::string &name)
52 {
53     m_name = name;
54 }
55
56 void GpgAddUserIDEditInteractor::setEmailUtf8(const std::string &email)
57 {
58     m_email = email;
59 }
60
61 void GpgAddUserIDEditInteractor::setCommentUtf8(const std::string &comment)
62 {
63     m_comment = comment;
64 }
65
66 // work around --enable-final
67 namespace GpgAddUserIDEditInteractor_Private
68 {
69 enum {
70     START = EditInteractor::StartState,
71     COMMAND,
72     NAME,
73     EMAIL,
74     COMMENT,
75     QUIT,
76     SAVE,
77
78     ERROR = EditInteractor::ErrorState
79 };
80 }
81
82 const char *GpgAddUserIDEditInteractor::action(Error &err) const
83 {
84
85     using namespace GpgAddUserIDEditInteractor_Private;
86
87     switch (state()) {
88     case COMMAND:
89         return "adduid";
90     case NAME:
91         return m_name.c_str();
92     case EMAIL:
93         return m_email.c_str();
94     case COMMENT:
95         return m_comment.c_str();
96     case QUIT:
97         return "quit";
98     case SAVE:
99         return "Y";
100     case START:
101     case ERROR:
102         return 0;
103     default:
104         err = Error::fromCode(GPG_ERR_GENERAL);
105         return 0;
106     }
107 }
108
109 unsigned int GpgAddUserIDEditInteractor::nextState(unsigned int status, const char *args, Error &err) const
110 {
111
112     static const Error GENERAL_ERROR     = Error::fromCode(GPG_ERR_GENERAL);
113     static const Error INV_NAME_ERROR    = Error::fromCode(GPG_ERR_INV_NAME);
114     static const Error INV_EMAIL_ERROR   = Error::fromCode(GPG_ERR_INV_USER_ID);
115     static const Error INV_COMMENT_ERROR = Error::fromCode(GPG_ERR_INV_USER_ID);
116
117     if (needsNoResponse(status)) {
118         return state();
119     }
120
121     using namespace GpgAddUserIDEditInteractor_Private;
122
123     switch (state()) {
124     case START:
125         if (status == GPGME_STATUS_GET_LINE &&
126                 strcmp(args, "keyedit.prompt") == 0) {
127             return COMMAND;
128         }
129         err = GENERAL_ERROR;
130         return ERROR;
131     case COMMAND:
132         if (status == GPGME_STATUS_GET_LINE &&
133                 strcmp(args, "keygen.name") == 0) {
134             return NAME;
135         }
136         err = GENERAL_ERROR;
137         return ERROR;
138     case NAME:
139         if (status == GPGME_STATUS_GET_LINE &&
140                 strcmp(args, "keygen.email") == 0) {
141             return EMAIL;
142         }
143         err = GENERAL_ERROR;
144         if (status == GPGME_STATUS_GET_LINE &&
145                 strcmp(args, "keygen.name") == 0) {
146             err = INV_NAME_ERROR;
147         }
148         return ERROR;
149     case EMAIL:
150         if (status == GPGME_STATUS_GET_LINE &&
151                 strcmp(args, "keygen.comment") == 0) {
152             return COMMENT;
153         }
154         err = GENERAL_ERROR;
155         if (status == GPGME_STATUS_GET_LINE &&
156                 strcmp(args, "keygen.email") == 0) {
157             err = INV_EMAIL_ERROR;
158         }
159         return ERROR;
160     case COMMENT:
161         if (status == GPGME_STATUS_GET_LINE &&
162                 strcmp(args, "keyedit.prompt") == 0) {
163             return QUIT;
164         }
165         err = GENERAL_ERROR;
166         if (status == GPGME_STATUS_GET_LINE &&
167                 strcmp(args, "keygen.comment") == 0) {
168             err = INV_COMMENT_ERROR;
169         }
170         return ERROR;
171     case QUIT:
172         if (status == GPGME_STATUS_GET_BOOL &&
173                 strcmp(args, "keyedit.save.okay") == 0) {
174             return SAVE;
175         }
176         err = GENERAL_ERROR;
177         return ERROR;
178     case ERROR:
179         if (status == GPGME_STATUS_GET_LINE &&
180                 strcmp(args, "keyedit.prompt") == 0) {
181             return QUIT;
182         }
183         err = lastError();
184         return ERROR;
185     default:
186         err = GENERAL_ERROR;
187         return ERROR;
188     }
189 }