e29ad8e09c36771b552b81e251e67fc6a3bedc8e
[gpgme.git] / gpgme / delete.c
1 /* delete.c - Delete a key.
2    Copyright (C) 2001, 2002 g10 Code GmbH
3
4    This file is part of GPGME.
5  
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10  
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    General Public License for more details.
15  
16    You should have received a copy of the GNU General Public License
17    along with GPGME; if not, write to the Free Software Foundation,
18    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20 #if HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23 #include <stdlib.h>
24
25 #include "util.h"
26 #include "context.h"
27 #include "ops.h"
28 #include "key.h"
29
30
31 enum delete_problem
32   {
33     DELETE_No_Problem = 0,
34     DELETE_No_Such_Key = 1,
35     DELETE_Must_Delete_Secret_Key = 2,
36     DELETE_Ambiguous_Specification = 3
37   };
38
39
40 struct delete_result_s
41 {
42   enum delete_problem problem;
43 };
44
45
46 void
47 _gpgme_release_delete_result (DeleteResult result)
48 {
49   if (!result)
50     return;
51   free (result);
52 }
53
54
55 static GpgmeError
56 delete_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
57 {
58   test_and_allocate_result (ctx, delete);
59
60   switch (code)
61     {
62     case GPGME_STATUS_EOF:
63       switch (ctx->result.delete->problem)
64         {
65         case DELETE_No_Problem:
66           break;
67         case DELETE_No_Such_Key:
68           return mk_error(Invalid_Key);
69           break;
70         case DELETE_Must_Delete_Secret_Key:
71           return mk_error(Conflict);
72           break;
73         case DELETE_Ambiguous_Specification:
74           /* XXX Need better error value.  Fall through.  */
75         default:
76           return mk_error(General_Error);
77           break;
78         }
79       break;
80
81     case GPGME_STATUS_DELETE_PROBLEM:
82       ctx->result.delete->problem = atoi (args);
83       break;
84
85     default:
86       break;
87     }
88   return 0;
89 }
90
91
92 static GpgmeError
93 _gpgme_op_delete_start (GpgmeCtx ctx, int synchronous,
94                         const GpgmeKey key, int allow_secret)
95 {
96   GpgmeError err = 0;
97
98   err = _gpgme_op_reset (ctx, synchronous);
99   if (err)
100     goto leave;
101
102   _gpgme_engine_set_status_handler (ctx->engine, delete_status_handler, ctx);
103   _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
104
105   err = _gpgme_engine_op_delete (ctx->engine, key, allow_secret);
106
107  leave:
108   if (err)
109     {
110       ctx->pending = 0; 
111       _gpgme_engine_release (ctx->engine);
112       ctx->engine = NULL;
113     }
114   return err;
115 }
116
117
118 GpgmeError
119 gpgme_op_delete_start (GpgmeCtx ctx, const GpgmeKey key, int allow_secret)
120 {
121   return _gpgme_op_delete_start (ctx, 0, key, allow_secret);
122 }
123
124
125 /**
126  * gpgme_op_delete:
127  * @c: Context 
128  * @key: A Key Object
129  * @allow_secret: Allow secret key delete
130  * 
131  * Delete the give @key from the key database.  To delete a secret
132  * along with the public key, @allow_secret must be true.
133  * 
134  * Return value: 0 on success or an error code.
135  **/
136 GpgmeError
137 gpgme_op_delete (GpgmeCtx ctx, const GpgmeKey key, int allow_secret)
138 {
139   GpgmeError err = _gpgme_op_delete_start (ctx, 1, key, allow_secret);
140   if (!err)
141     err = _gpgme_wait_one (ctx);
142   return err;
143 }