2003-01-30 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / delete.c
1 /* delete.c - Delete a key.
2    Copyright (C) 2001, 2002, 2003 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 static GpgmeError
41 delete_status_handler (GpgmeCtx ctx, GpgmeStatusCode code, char *args)
42 {
43   if (code == GPGME_STATUS_DELETE_PROBLEM)
44     {
45       enum delete_problem problem = atoi (args);
46       switch (problem)
47         {
48         case DELETE_No_Problem:
49           break;
50
51         case DELETE_No_Such_Key:
52           return GPGME_Invalid_Key;
53
54         case DELETE_Must_Delete_Secret_Key:
55           return GPGME_Conflict;
56
57         case DELETE_Ambiguous_Specification:
58           /* XXX Need better error value.  Fall through.  */
59         default:
60           return GPGME_General_Error;
61         }
62     }
63   return 0;
64 }
65
66
67 static GpgmeError
68 _gpgme_op_delete_start (GpgmeCtx ctx, int synchronous,
69                         const GpgmeKey key, int allow_secret)
70 {
71   GpgmeError err = 0;
72
73   err = _gpgme_op_reset (ctx, synchronous);
74   if (err)
75     goto leave;
76
77   _gpgme_engine_set_status_handler (ctx->engine, delete_status_handler, ctx);
78   _gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
79
80   err = _gpgme_engine_op_delete (ctx->engine, key, allow_secret);
81
82  leave:
83   if (err)
84     {
85       ctx->pending = 0; 
86       _gpgme_engine_release (ctx->engine);
87       ctx->engine = NULL;
88     }
89   return err;
90 }
91
92
93 GpgmeError
94 gpgme_op_delete_start (GpgmeCtx ctx, const GpgmeKey key, int allow_secret)
95 {
96   return _gpgme_op_delete_start (ctx, 0, key, allow_secret);
97 }
98
99
100 /**
101  * gpgme_op_delete:
102  * @c: Context 
103  * @key: A Key Object
104  * @allow_secret: Allow secret key delete
105  * 
106  * Delete the give @key from the key database.  To delete a secret
107  * along with the public key, @allow_secret must be true.
108  * 
109  * Return value: 0 on success or an error code.
110  **/
111 GpgmeError
112 gpgme_op_delete (GpgmeCtx ctx, const GpgmeKey key, int allow_secret)
113 {
114   GpgmeError err = _gpgme_op_delete_start (ctx, 1, key, allow_secret);
115   if (!err)
116     err = _gpgme_wait_one (ctx);
117   return err;
118 }