2004-09-30 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / trust-item.c
1 /* trust-item.c - Trust item objects.
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 #include <assert.h>
27 #include <errno.h>
28
29 #include "util.h"
30 #include "ops.h"
31 #include "sema.h"
32
33
34 /* Protects all reference counters in trust items.  All other accesses
35    to a trust item are either read only or happen before the trust
36    item is available to the user.  */
37 DEFINE_STATIC_LOCK (trust_item_ref_lock);
38
39 \f
40 /* Create a new trust item.  */
41 gpgme_error_t
42 _gpgme_trust_item_new (gpgme_trust_item_t *r_item)
43 {
44   gpgme_trust_item_t item;
45
46   item = calloc (1, sizeof *item);
47   if (!item)
48     return gpg_error_from_errno (errno);
49   item->_refs = 1;
50   item->keyid = item->_keyid;
51   item->_keyid[16] = '\0';
52   item->owner_trust = item->_owner_trust;
53   item->_owner_trust[1] = '\0';
54   item->validity = item->_validity;
55   item->_validity[1] = '\0';
56   *r_item = item;
57   return 0;
58 }
59
60 \f
61 /* Acquire a reference to ITEM.  */
62 void
63 gpgme_trust_item_ref (gpgme_trust_item_t item)
64 {
65   LOCK (trust_item_ref_lock);
66   item->_refs++;
67   UNLOCK (trust_item_ref_lock);
68 }
69
70
71 /* gpgme_trust_item_unref releases the trust item object. Note that
72    this function may not do an actual release if there are other
73    shallow copies of the object.  You have to call this function for
74    every newly created trust item object as well as for every
75    gpgme_trust_item_ref() done on the trust item object.  */
76 void
77 gpgme_trust_item_unref (gpgme_trust_item_t item)
78 {
79   LOCK (trust_item_ref_lock);
80   assert (item->_refs > 0);
81   if (--item->_refs)
82     {
83       UNLOCK (trust_item_ref_lock);
84       return;
85     }
86   UNLOCK (trust_item_ref_lock);
87
88   if (item->name)
89     free (item->name);
90   free (item);
91 }
92
93 \f
94 /* Compatibility interfaces.  */
95 void
96 gpgme_trust_item_release (gpgme_trust_item_t item)
97 {
98   gpgme_trust_item_unref (item);
99 }
100
101 /* Return the value of the attribute WHAT of ITEM, which has to be
102    representable by a string.  */
103 const char *gpgme_trust_item_get_string_attr (gpgme_trust_item_t item,
104                                               _gpgme_attr_t what,
105                                               const void *reserved, int idx)
106 {
107   const char *val = NULL;
108
109   if (!item)
110     return NULL;
111   if (reserved)
112     return NULL;
113   if (idx)
114     return NULL;
115
116   switch (what)
117     {
118     case GPGME_ATTR_KEYID:
119       val = item->keyid;
120       break;
121
122     case GPGME_ATTR_OTRUST:  
123       val = item->owner_trust;
124       break;
125
126     case GPGME_ATTR_VALIDITY:
127       val = item->validity;
128       break;
129
130     case GPGME_ATTR_USERID:  
131       val = item->name;
132       break;
133
134     default:
135       break;
136     }
137   return val;
138 }
139
140
141 /* Return the value of the attribute WHAT of KEY, which has to be
142    representable by an integer.  IDX specifies a running index if the
143    attribute appears more than once in the key.  */
144 int gpgme_trust_item_get_int_attr (gpgme_trust_item_t item, _gpgme_attr_t what,
145                                    const void *reserved, int idx)
146 {
147   int val = 0;
148
149   if (!item)
150     return 0;
151   if (reserved)
152     return 0;
153   if (idx)
154     return 0;
155
156   switch (what)
157     {
158     case GPGME_ATTR_LEVEL:    
159       val = item->level;
160       break;
161
162     case GPGME_ATTR_TYPE:    
163       val = item->type;
164       break;
165
166     default:
167       break;
168     }
169   return val;
170 }