693a486c0fba73c50ddc16e7cde86a5aaaeaeee9
[gpgme.git] / gpgme / recipient.c
1 /* recipient.c - mainatin recipient sets
2    Copyright (C) 2000 Werner Koch (dd9jn)
3    Copyright (C) 2001, 2002, 2003 g10 Code GmbH
4  
5    This file is part of GPGME.
6  
7    GPGME is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11  
12    GPGME is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16  
17    You should have received a copy of the GNU General Public License
18    along with GPGME; if not, write to the Free Software Foundation,
19    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 #if HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 #include <stdlib.h>
25 #include <string.h>
26
27 #include "context.h"
28
29 \f
30 /* Create a new uninitialized recipient object and return it in R_RSET.  */
31 GpgmeError
32 gpgme_recipients_new (GpgmeRecipients *r_rset)
33 {
34   GpgmeRecipients rset;
35     
36   rset = calloc (1, sizeof *rset);
37   if (!rset)
38     return GPGME_Out_Of_Core;
39   *r_rset = rset;
40   return 0;
41 }
42
43
44 /* Release the recipient object RSET.  */
45 void
46 gpgme_recipients_release (GpgmeRecipients rset)
47 {
48   GpgmeUserID uid = rset->list;
49
50   while (uid)
51     {
52       GpgmeUserID next_uid = uid->next;
53
54       free (uid);
55       uid = next_uid;
56     }
57   free (rset);
58 }
59
60
61 /* Add the name NAME to the recipient set RSET with the given key
62    validity VALIDITY.  */
63 GpgmeError
64 gpgme_recipients_add_name_with_validity (GpgmeRecipients rset,
65                                          const char *name,
66                                          GpgmeValidity validity)
67 {
68   GpgmeUserID uid;
69
70   if (!name || !rset)
71     return GPGME_Invalid_Value;
72   uid = malloc (sizeof (*uid) + strlen (name));
73   if (!uid)
74     return GPGME_Out_Of_Core;
75   uid->validity = validity;
76   uid->name = "";
77   uid->email = "";
78   uid->comment = "";
79   uid->uid = ((char *) uid) + sizeof (*uid);
80   strcpy (uid->uid, name);
81   uid->next = rset->list;
82   rset->list = uid;
83   return 0;
84 }
85
86
87 /* Add the name NAME to the recipient set RSET.  Same as
88    gpgme_recipients_add_name_with_validity with validitiy
89    GPGME_VALIDITY_UNKNOWN.  */
90 GpgmeError
91 gpgme_recipients_add_name (GpgmeRecipients rset, const char *name)
92 {
93   return gpgme_recipients_add_name_with_validity (rset, name,
94                                                   GPGME_VALIDITY_UNKNOWN);
95 }
96
97
98 /* Return the number of recipients in the set.  */
99 unsigned int 
100 gpgme_recipients_count (const GpgmeRecipients rset)
101 {
102   GpgmeUserID uid = rset->list;
103   unsigned int count = 0;
104     
105   while (uid)
106     {
107       count++;
108       uid = uid->next;
109     }
110
111   return count;
112 }
113
114
115 /* Start an enumeration on the recipient set RSET.  The caller must
116    pass the address of a void pointer which is used as the iterator
117    object.  */
118 GpgmeError
119 gpgme_recipients_enum_open (const GpgmeRecipients rset, void **iter)
120 {
121   *iter = rset->list;
122   return 0;
123 }
124
125 /* Return the name of the next recipient in the set RSET.  */
126 const char *
127 gpgme_recipients_enum_read (const GpgmeRecipients rset, void **iter)
128 {
129   GpgmeUserID uid;
130
131   uid = *iter;
132   if (!uid)
133     return NULL;
134
135   *iter = uid->next;
136   return uid->name;
137 }
138
139 /* Release the iterator for this object.  */
140 GpgmeError
141 gpgme_recipients_enum_close (const GpgmeRecipients rset, void **iter)
142 {
143   /* Not really needed, but might catch the occasional mistake.  */
144   *iter = NULL;
145
146   return 0;
147 }
148
149
150 int
151 _gpgme_recipients_all_valid (const GpgmeRecipients rset)
152 {
153   GpgmeUserID uid = rset->list;
154
155   while (uid)
156     {
157       if (uid->validity != GPGME_VALIDITY_FULL
158           && uid->validity != GPGME_VALIDITY_ULTIMATE )
159         return 0;
160       uid = uid->next;
161     }
162   return 1;
163 }