009d5db17c6a041ed3b7fdedb39e26cece5687f7
[gpgme.git] / complus / ignupg.c
1 /* ignupg.c - COM+ class IGnuPG
2  *      Copyright (C) 2000 Werner Koch (dd9jn)
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify
7  * it 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,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21
22 #include <config.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <errno.h>
27 #include <assert.h>
28 #include <time.h>
29 #include <windows.h>
30
31 #define INITGUID
32 #include "ignupg.h"
33
34 /*
35  * Declare the interface implementation structures
36  */
37 typedef struct IGnuPGImpl IGnuPGImpl;
38 typedef struct IClassFactoryImpl IClassFactoryImpl;
39
40
41 struct IGnuPGImpl {
42     /* IUnknown required stuff */
43     ICOM_VFIELD (IGnuPG);
44     DWORD        ref;
45     /* Our stuff */
46     int foo;
47 };
48
49
50 struct IClassFactoryImpl {
51     /* IUnknown fields */
52     ICOM_VFIELD(IClassFactory);
53     DWORD       ref;
54 };
55
56
57
58 /**********************************************************
59  **************  IGnuPG Implementation  *******************
60  **********************************************************/
61
62 static HRESULT WINAPI
63 IGnuPGImpl_QueryInterface (IGnuPG *iface, REFIID refiid, LPVOID *obj)
64 {
65     ICOM_THIS (IGnuPGImpl,iface);
66
67     fprintf (stderr,"(%p)->QueryInterface(%s,%p)\n",
68              This, "debugstr_guid(refiid)", obj);
69     if ( IsEqualGUID (&IID_IUnknown, refiid)
70          || !IsEqualGUID (&IID_IGnuPG, refiid) ) {
71         *obj = iface;
72         return 0;
73     }
74     *obj = NULL;
75     return E_NOINTERFACE;
76 }
77
78
79 static ULONG WINAPI
80 IGnuPGImpl_AddRef (IGnuPG *iface)
81 {
82     ICOM_THIS (IGnuPGImpl,iface);
83         
84     return ++This->ref;
85 }
86
87
88 static ULONG WINAPI
89 IGnuPGImpl_Release (IGnuPG *iface)
90 {
91     ICOM_THIS (IGnuPGImpl,iface);
92         
93     if (--This->ref)
94         return This->ref;
95
96     HeapFree(GetProcessHeap(),0,iface);
97     return 0;
98 }
99
100
101
102
103 static ICOM_VTABLE(IGnuPG) gnupg_vtbl = 
104 {
105     /* IUnknow methods */
106     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
107     IGnuPGImpl_QueryInterface,
108     IGnuPGImpl_AddRef,
109     IGnuPGImpl_Release,
110     /* Our methods */
111
112 };
113
114
115
116 /***************************************************************
117  ******************  GnuPG Factory  ****************************
118  ***************************************************************/
119
120 static HRESULT WINAPI 
121 GnuPGFactory_QueryInterface (IClassFactory *iface, REFIID refiid, LPVOID *obj)
122 {
123     /*ICOM_THIS(IClassFactoryImpl,iface);*/
124     return E_NOINTERFACE;
125 }
126
127 static ULONG WINAPI
128 GnuPGFactory_AddRef (IClassFactory *iface)
129 {
130     ICOM_THIS(IClassFactoryImpl,iface);
131     return ++(This->ref);
132 }
133
134 static ULONG WINAPI
135 GnuPGFactory_Release (IClassFactory *iface)
136 {
137     ICOM_THIS(IClassFactoryImpl,iface);
138     return --(This->ref);
139 }
140
141 static HRESULT WINAPI
142 GnuPGFactory_CreateInstance (IClassFactory *iface, IUnknown *outer,
143                              REFIID refiid, LPVOID *r_obj )
144 {
145     /*ICOM_THIS(IClassFactoryImpl,iface);*/
146
147     if ( IsEqualGUID (&IID_IGnuPG, refiid) ) {
148         IGnuPGImpl *obj;
149
150         obj = HeapAlloc (GetProcessHeap(), 0, sizeof *obj );
151         if ( !obj)
152             return E_OUTOFMEMORY;
153
154         ICOM_VTBL(obj) = &gnupg_vtbl;
155         obj->ref = 1;
156         *r_obj = obj;
157         return 0;
158     }
159     *r_obj = NULL;
160     return E_NOINTERFACE;
161 }
162
163 static HRESULT WINAPI
164 GnuPGFactory_LockServer (IClassFactory *iface, BOOL dolock )
165 {
166     /*ICOM_THIS(IClassFactoryImpl,iface);*/
167     return 0;
168 }
169
170 static ICOM_VTABLE(IClassFactory) gnupg_factory_vtbl = {
171     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
172     GnuPGFactory_QueryInterface,
173     GnuPGFactory_AddRef,
174     GnuPGFactory_Release,
175     GnuPGFactory_CreateInstance,
176     GnuPGFactory_LockServer
177 };
178 static IClassFactoryImpl GnuPG_CF = {&gnupg_factory_vtbl, 1 };
179
180
181 IClassFactory *
182 gnupg_factory_new ( CLSID *r_clsid )
183 {
184     *r_clsid = CLSID_GnuPG;
185     IClassFactory_AddRef((IClassFactory*)&GnuPG_CF);
186     return (IClassFactory*)&GnuPG_CF;
187 }
188
189 void
190 gnupg_factory_release ( IClassFactory *factory )
191 {
192     /* it's static - nothing to do */
193 }
194
195
196
197
198
199
200
201
202