Some changes
[gpgme.git] / gpgme / recipient.c
1 /* recipient.c - mainatin recipient sets
2  *      Copyright (C) 2000 Werner Koch (dd9jn)
3  *      Copyright (C) 2001 g10 Code GmbH
4  *
5  * This file is part of GPGME.
6  *
7  * GPGME is free software; you can redistribute it and/or modify
8  * it 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,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  */
21
22 #include <config.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <assert.h>
26
27 #include "util.h"
28 #include "context.h"
29 #include "rungpg.h"
30
31 GpgmeError
32 gpgme_recipients_new (GpgmeRecipients *r_rset)
33 {
34     GpgmeRecipients rset;
35
36     rset = xtrycalloc ( 1, sizeof *rset  );
37     if (!rset)
38         return mk_error (Out_Of_Core);
39     *r_rset = rset;
40     return 0;
41 }
42
43 void
44 gpgme_recipients_release ( GpgmeRecipients rset )
45 {
46     if (rset) {
47         struct user_id_s *u, *u2;
48
49         for (u = rset->list; u; u = u2) {
50             u2 = u->next;
51             xfree(u);
52         }
53     }
54     xfree ( rset );
55 }
56
57
58 GpgmeError
59 gpgme_recipients_add_name (GpgmeRecipients rset, const char *name )
60 {
61     return gpgme_recipients_add_name_with_validity (
62         rset, name, GPGME_VALIDITY_UNKNOWN
63         );
64 }
65
66 GpgmeError
67 gpgme_recipients_add_name_with_validity (GpgmeRecipients rset,
68                                          const char *name,
69                                          GpgmeValidity val )
70 {
71     struct user_id_s *r;
72
73     if (!name || !rset )
74         return mk_error (Invalid_Value);
75     r = xtrymalloc ( sizeof *r + strlen (name) );
76     if (!r)
77         return mk_error (Out_Of_Core);
78     r->validity = val;
79     r->name_part = "";
80     r->email_part = "";
81     r->comment_part = "";
82     strcpy (r->name, name );
83     r->next = rset->list;
84     rset->list = r;
85     return 0;
86 }
87
88
89
90 unsigned int 
91 gpgme_recipients_count ( const GpgmeRecipients rset )
92 {
93     struct user_id_s *r;
94     unsigned int count = 0;
95     
96     if ( rset ) {
97         for (r=rset->list ; r; r = r->next )
98             count++;
99     }
100     return count;
101 }
102
103
104
105 GpgmeError
106 gpgme_recipients_enum_open ( const GpgmeRecipients rset, void **ctx )
107 {
108     if (!rset || !ctx)
109         return mk_error (Invalid_Value);
110
111     *ctx = rset->list;
112     return 0;
113 }
114
115 const char *
116 gpgme_recipients_enum_read ( const GpgmeRecipients rset, void **ctx )
117 {
118     struct user_id_s *r;
119
120     if (!rset || !ctx)
121         return NULL; /* oops */
122     
123     r = *ctx;
124     if ( r ) {
125         const char *s = r->name;
126         r = r->next;
127         *ctx = r;
128         return s;
129     }
130
131     return NULL;
132 }
133
134 GpgmeError
135 gpgme_recipients_enum_close ( const GpgmeRecipients rset, void **ctx )
136 {
137     if (!rset || !ctx)
138         return mk_error (Invalid_Value);
139     *ctx = NULL;
140     return 0;
141 }
142
143
144 void
145 _gpgme_append_gpg_args_from_recipients (
146     const GpgmeRecipients rset,
147     GpgObject gpg )
148 {
149     struct user_id_s *r;
150
151     assert (rset);
152     for (r=rset->list ; r; r = r->next ) {
153         _gpgme_gpg_add_arg ( gpg, "-r" );
154         _gpgme_gpg_add_arg ( gpg, r->name );
155     }    
156 }
157
158 int
159 _gpgme_recipients_all_valid ( const GpgmeRecipients rset )
160 {
161     struct user_id_s *r;
162
163     assert (rset);
164     for (r=rset->list ; r; r = r->next ) {
165         if (r->validity != GPGME_VALIDITY_FULL
166             && r->validity != GPGME_VALIDITY_ULTIMATE )
167             return 0; /*no*/
168     }
169     return 1; /*yes*/
170 }
171
172
173