2001-11-20 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / engine.c
1 /* engine.c 
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 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include "gpgme.h"
27 #include "util.h"
28
29 #include "engine.h"
30 #include "rungpg.h"
31 #include "engine-gpgsm.h"
32
33 struct engine_object_s
34   {
35     GpgmeProtocol protocol;
36
37     const char *path;
38     const char *version;
39
40     union
41       {
42         GpgObject gpg;
43         GpgsmObject gpgsm;
44       } engine;
45 };
46
47 /* Get the path of the engine for PROTOCOL.  */
48 const char *
49 _gpgme_engine_get_path (GpgmeProtocol proto)
50 {
51   switch (proto)
52     {
53     case GPGME_PROTOCOL_OpenPGP:
54       return _gpgme_get_gpg_path ();
55     case GPGME_PROTOCOL_CMS:
56       return _gpgme_get_gpgsm_path ();
57     default:
58       return NULL;
59     }
60 }
61
62 /* Get the version number of the engine for PROTOCOL.  */
63 const char *
64 _gpgme_engine_get_version (GpgmeProtocol proto)
65 {
66   switch (proto)
67     {
68     case GPGME_PROTOCOL_OpenPGP:
69       return _gpgme_gpg_get_version ();
70     case GPGME_PROTOCOL_CMS:
71       return _gpgme_gpgsm_get_version ();
72     default:
73       return NULL;
74     }
75 }
76
77 GpgmeError
78 gpgme_engine_check_version (GpgmeProtocol proto)
79 {
80   switch (proto)
81     {
82     case GPGME_PROTOCOL_OpenPGP:
83       return _gpgme_gpg_check_version ();
84     case GPGME_PROTOCOL_CMS:
85       return _gpgme_gpgsm_check_version ();
86     default:
87       return mk_error (Invalid_Value);
88     }
89 }
90
91 GpgmeError
92 _gpgme_engine_new (GpgmeProtocol proto, EngineObject *r_engine)
93 {
94   EngineObject engine;
95   GpgmeError err = 0;
96
97   engine = xtrycalloc (1, sizeof *engine);
98   if (!engine)
99     {
100       err = mk_error (Out_Of_Core);
101       goto leave;
102     }
103
104   engine->protocol = proto;
105   switch (proto)
106     {
107     case GPGME_PROTOCOL_OpenPGP:
108       err =_gpgme_gpg_new (&engine->engine.gpg);
109       break;
110     case GPGME_PROTOCOL_CMS:
111       err = _gpgme_gpgsm_new (&engine->engine.gpgsm);
112       if (err)
113         goto leave;
114       break;
115     default:
116       err = mk_error (Invalid_Value);
117     }
118   if (err)
119     goto leave;
120
121   engine->path = _gpgme_engine_get_path (proto);
122   engine->version = _gpgme_engine_get_version (proto);
123
124   if (!engine->path || !engine->version)
125     {
126       err = mk_error (Invalid_Engine);
127       goto leave;
128     }
129
130  leave:
131   if (err)
132     _gpgme_engine_release (engine);
133   else
134     *r_engine = engine;
135   
136   return err;
137 }
138
139 void
140 _gpgme_engine_release (EngineObject engine)
141 {
142   if (!engine)
143     return;
144
145   switch (engine->protocol)
146     {
147     case GPGME_PROTOCOL_OpenPGP:
148       _gpgme_gpg_release (engine->engine.gpg);
149       break;
150     case GPGME_PROTOCOL_CMS:
151       _gpgme_gpgsm_release (engine->engine.gpgsm);
152       break;
153     default:
154       break;
155     }
156   xfree (engine);
157 }