diff options
Diffstat (limited to '')
-rw-r--r-- | complus/igpgme.c | 859 |
1 files changed, 0 insertions, 859 deletions
diff --git a/complus/igpgme.c b/complus/igpgme.c deleted file mode 100644 index 9aa64a24..00000000 --- a/complus/igpgme.c +++ /dev/null @@ -1,859 +0,0 @@ -/* igpgme.c - COM+ class IGpgme - * Copyright (C) 2001 g10 Code GmbH - * - * This file is part of GPGME. - * - * GPGME is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * GPGME is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <assert.h> -#include <time.h> -#include <windows.h> - -#include "../gpgme/gpgme.h" - -/* FIXME: Put them into an extra header */ -void *_gpgme_malloc (size_t n ); -void *_gpgme_calloc (size_t n, size_t m ); -void *_gpgme_realloc (void *p, size_t n); -char *_gpgme_strdup (const char *p); -void _gpgme_free ( void *a ); - - - -#define INITGUID -#include "igpgme.h" - -/* - * Declare the interface implementation structures - */ -typedef struct IGpgmeImpl IGpgmeImpl; -typedef struct IClassFactoryImpl IClassFactoryImpl; - -static HANDLE my_exit_event; - -struct IGpgmeImpl { - /* IUnknown required stuff */ - ICOM_VFIELD (IGpgme); - DWORD ref; - /* Delegation to IDispatch */ - struct { - IUnknown *disp; - ITypeInfo *tinfo; - } std_disp; - /* Our stuff */ - GpgmeCtx mainctx; - GpgmeData plaintext; - int plaintext_given_as_bstr; - GpgmeData ciphertext; - int ciphertext_is_armored; - GpgmeRecipients rset; -}; - - -struct IClassFactoryImpl { - /* IUnknown fields */ - ICOM_VFIELD(IClassFactory); - DWORD ref; -}; - -/********************************************************** - ************** helper functions ************************ - *********************************************************/ -static HRESULT -map_gpgme_error (GpgmeError err) -{ - HRESULT hr; - - if (!err) - return 0; - if ( err < 0 || err > 0x1000 ) { - fprintf (stderr,"*** GpgmeError `%s' mapped to GPGME_General_Error\n", - gpgme_strerror (err) ); - err = GPGME_General_Error; - } - hr = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 0x1000 + err); - fprintf (stderr,"*** GpgmeError `%s' mapped to %lx\n", - gpgme_strerror (err), (unsigned long)hr ); - return hr; -} - - -/********************************************************** - ************** IGpgme Implementation ******************* - *********************************************************/ - -static HRESULT WINAPI -m_IGpgme_QueryInterface (IGpgme *iface, REFIID refiid, LPVOID *obj) -{ - ICOM_THIS (IGpgmeImpl,iface); - - /*fprintf (stderr,"*** m_IGpgme_QueryInterface(%p,%s)", - This, debugstr_guid(refiid));*/ - if ( IsEqualGUID (&IID_IUnknown, refiid) - || IsEqualGUID (&IID_IGpgme, refiid) ) { - *obj = This; - IGpgme_AddRef (iface); - fprintf (stderr," -> got %p\n", *obj); - return 0; - } - else if ( IsEqualGUID (&IID_IDispatch, refiid) ) { - HRESULT hr = IDispatch_QueryInterface (This->std_disp.disp, - refiid, obj); - /*fprintf (stderr," -> delegated, hr=%lx, got %p\n", - hr, hr? NULL: *obj);*/ - return hr; - } - /*fprintf (stderr," -> none\n");*/ - *obj = NULL; - return E_NOINTERFACE; -} - - -static ULONG WINAPI -m_IGpgme_AddRef (IGpgme *iface) -{ - ICOM_THIS (IGpgmeImpl,iface); - - return ++This->ref; -} - - -static ULONG WINAPI -m_IGpgme_Release (IGpgme *iface) -{ - ICOM_THIS (IGpgmeImpl,iface); - - if (--This->ref) - return This->ref; - - gpgme_release (This->mainctx); This->mainctx = NULL; - gpgme_data_release (This->plaintext); This->plaintext = NULL; - gpgme_data_release (This->ciphertext); This->ciphertext = NULL; - gpgme_recipients_release (This->rset); This->rset = NULL; - if (This->std_disp.disp) - IDispatch_Release (This->std_disp.disp); - if (This->std_disp.tinfo) - ITypeInfo_Release (This->std_disp.tinfo); - HeapFree(GetProcessHeap(),0,iface); - { - ULONG count = CoReleaseServerProcess (); - if (!count && my_exit_event) - SetEvent (my_exit_event); - } - return 0; -} - - -static HRESULT WINAPI -m_stub_IDispatch_GetTypeInfoCount (IGpgme *iface, unsigned int *pctinfo) -{ - return E_NOTIMPL; -} - -static HRESULT WINAPI -m_stub_IDispatch_GetTypeInfo (IGpgme *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - return E_NOTIMPL; -} - -static HRESULT WINAPI -m_stub_IDispatch_GetIDsOfNames (IGpgme *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - return E_NOTIMPL; -} - -static HRESULT WINAPI -m_stub_IDispatch_Invoke (IGpgme *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, - DISPPARAMS *pDispParams, VARIANT *pVarResult, - EXCEPINFO *pExepInfo, UINT *puArgErr) -{ - return E_NOTIMPL; -} - - - -static HRESULT WINAPI -m_IGpgme_GetVersion (IGpgme *iface, BSTR *retvat) -{ - return E_NOTIMPL; -} - -static HRESULT WINAPI -m_IGpgme_GetEngineInfo (IGpgme *iface, BSTR *retval) -{ - return E_NOTIMPL; -} - - -static HRESULT WINAPI -m_IGpgme_Cancel (IGpgme *iface) -{ - return E_NOTIMPL; -} - - -static HRESULT WINAPI -m_IGpgme_SetArmor (IGpgme *iface, BOOL yes) -{ - ICOM_THIS (IGpgmeImpl,iface); - - gpgme_set_armor (This->mainctx, yes); - return 0; -} - -static HRESULT WINAPI -m_IGpgme_GetArmor (IGpgme *iface, BOOL *retval) -{ - ICOM_THIS (IGpgmeImpl,iface); - - *retval = gpgme_get_armor (This->mainctx); - return 0; -} - - -static HRESULT WINAPI -m_IGpgme_SetTextmode (IGpgme *iface, BOOL yes) -{ - ICOM_THIS (IGpgmeImpl,iface); - - gpgme_set_textmode (This->mainctx, yes); - return 0; -} - -static HRESULT WINAPI -m_IGpgme_GetTextmode (IGpgme *iface, BOOL *retval) -{ - ICOM_THIS (IGpgmeImpl,iface); - - *retval = gpgme_get_textmode (This->mainctx); - return 0; -} - - -/* - * Put the data from VAL into a a Gpgme data object, which is passed by - * reference. Valid types of the Variant are: BSTR, SAFEARRAY of BYTE and - * SAFEARRAY of VARIANTS of signed or unsigned integers. - */ -static HRESULT WINAPI -set_data_from_variant (GpgmeData *data, VARIANT val, int *given_as_bstr) -{ - GpgmeError err = 0; - HRESULT hr; - unsigned char *buf; - SAFEARRAY *array; - size_t len; - int i; - - if ( val.vt == VT_BSTR) { - len = bstrtoutf8 (val.u.bstrVal, NULL, 0); - buf = _gpgme_malloc (len); - if (!buf) - return E_OUTOFMEMORY; - - if (bstrtoutf8 (val.u.bstrVal, buf, len) < 0) { - fprintf (stderr,"problem with bstrtoutf8\n"); - _gpgme_free (buf); - return E_FAIL; - } - - #if 0 - fprintf (stderr,"Got a BSTR (utf8):"); - for (i=0; i < len; i++) - fprintf (stderr, " %0X", buf[i] ); - putc ('\n', stderr); - #endif - gpgme_data_release (*data); *data = NULL; - err = gpgme_data_new_from_mem (data, buf, len, 0 /*no need to copy*/ ); - if (!err && given_as_bstr) - *given_as_bstr = 1; - } - else if ( val.vt == (VT_ARRAY|VT_UI1)) { - array = val.u.parray; - - /*fprintf (stderr,"Got an ARRAY of bytes:");*/ - hr = SafeArrayAccessData (array, (void**)&buf); - if (hr) { - fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr); - return hr; - } - len = array->rgsabound[0].cElements; - /*for (i=0; i < len; i++) - fprintf (stderr, " %0X", buf[i] ); - putc ('\n', stderr);*/ - - gpgme_data_release (*data); *data = NULL; - err = gpgme_data_new_from_mem (data, buf, len, 1 ); - SafeArrayUnaccessData (array); - if (given_as_bstr) - *given_as_bstr = 0; - } - else if ( val.vt == (VT_ARRAY|VT_VARIANT)) { - VARIANT *vp; - array = val.u.parray; - - /*fprintf (stderr,"Got an ARRAY of VARIANTS:");*/ - hr = SafeArrayAccessData (array, (void**)&vp); - if (hr) { - fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr); - return hr; - } - len = array->rgsabound[0].cElements; - /* allocate the array using the gpgme allocator so that we can - * later use a new without the copy set*/ - buf = _gpgme_malloc (len); - if (!buf) { - SafeArrayUnaccessData (array); - return E_OUTOFMEMORY; - } - /* coerce all array elements into rawtext */ - for (i=0; i < len; i++) { - switch (vp[i].vt) { - case VT_I1: buf[i] = (BYTE)vp[i].u.cVal; break; - case VT_I2: buf[i] = ((UINT)vp[i].u.iVal) & 0xff; break; - case VT_I4: buf[i] = ((ULONG)vp[i].u.lVal) & 0xff; break; - case VT_INT: buf[i] = ((UINT)vp[i].u.intVal) & 0xff; break; - case VT_UI1: buf[i] = vp[i].u.bVal; break; - case VT_UI2: buf[i] = vp[i].u.uiVal & 0xff; break; - case VT_UI4: buf[i] = vp[i].u.ulVal & 0xff; break; - case VT_UINT: buf[i] = vp[i].u.uintVal & 0xff; break; - default: - fprintf (stderr, "Invalid value in array as pos %d\n", i); - _gpgme_free (buf); - SafeArrayUnaccessData (array); - return E_INVALIDARG; - } - } - - /*for (i=0; i < len; i++) - fprintf (stderr, " %0X", buf[i] ); - putc ('\n', stderr);*/ - - gpgme_data_release (*data); *data = NULL; - err = gpgme_data_new_from_mem (data, buf, len, 0); - SafeArrayUnaccessData (array); - if (given_as_bstr) - *given_as_bstr = 0; - } - else { - fprintf (stderr, "Got a variant type = %d (0x%x)\n", - (int)val.vt, (int)val.vt ); - return E_INVALIDARG; /* not a safearray of bytes */ - } - return map_gpgme_error (err); -} - - -static HRESULT WINAPI -set_data_to_variant (GpgmeData data, VARIANT *retval, int use_bstr) -{ - GpgmeError err; - HRESULT hr; - SAFEARRAY *array; - char *p; - size_t nread, len; - int i; - - /* Get some info on the data */ - err = gpgme_data_rewind (data); - if (err ) { - fprintf (stderr, "*** gpgme_data_rewind failed: %d\n", err); - return map_gpgme_error (err); - } - err = gpgme_data_read (data, NULL, 0, &nread); - if (err && err != GPGME_EOF ) { - fprintf (stderr, "*** gpgme_data_read [length] failed: %d\n", err); - return map_gpgme_error (err); - } - len = nread; /*(eof returns a length of 0)*/ - /*fprintf (stderr,"*** %d bytes are availabe\n", (int)len);*/ - - /* convert it to the target data type */ - if (use_bstr) { - BSTR bs; - unsigned char *helpbuf; - - /* It is easier to allocate some helper storage */ - helpbuf = _gpgme_malloc (len); - if (!helpbuf) - return E_OUTOFMEMORY; - err = gpgme_data_read (data, helpbuf, len, &nread); - if (err ) { - _gpgme_free (helpbuf); - fprintf (stderr, "*** gpgme_data_read [data] failed: %d\n", err); - return map_gpgme_error (err); - } - - bs = SysAllocStringLen (NULL, len+1); - if (!bs) { - _gpgme_free (helpbuf); - return E_OUTOFMEMORY; - } - - for (i=0, p=helpbuf; i < len; i++, p++) - bs[i] = *p; - bs[i] = 0; - _gpgme_free (helpbuf); - - /* Ready */ - VariantInit (retval); - retval->vt = VT_BSTR; - retval->u.bstrVal = bs; - } -#if 0 - else if (use_byte_array) { - array = SafeArrayCreateVector (VT_UI1, 0, len); - if (!array) - return E_OUTOFMEMORY; - - p = NULL; - hr = SafeArrayAccessData (array, (void**)&p); - if (hr) { - fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr); - SafeArrayDestroyData (array); - SafeArrayDestroy (array); - return hr; - } - if (len) { - err = gpgme_data_read (data, p, len, &nread); - if (err ) { - SafeArrayUnaccessData (array); - SafeArrayDestroyData (array); - SafeArrayDestroy (array); - fprintf (stderr, "*** gpgme_data_read [data] failed: %d\n", - err); - return map_gpgme_error (err); - } - } - SafeArrayUnaccessData (array); - - /* pass the data to the caller */ - VariantInit (retval); - retval->vt = (VT_ARRAY|VT_UI1); - retval->u.parray = array; - } -#endif - else { /* Create an array of variants of bytes */ - VARIANT *v; - unsigned char *helpbuf; - - /* It is easier to allocate some helper storage */ - helpbuf = _gpgme_malloc (len); - if (!helpbuf) - return E_OUTOFMEMORY; - err = gpgme_data_read (data, helpbuf, len, &nread); - if (err ) { - _gpgme_free (helpbuf); - fprintf (stderr, "*** gpgme_data_read [data] failed: %d\n", err); - return map_gpgme_error (err); - } - - /* The create the array */ - array = SafeArrayCreateVector (VT_VARIANT, 0, len); - if (!array) { - _gpgme_free (helpbuf); - return E_OUTOFMEMORY; - } - - v = NULL; - hr = SafeArrayAccessData (array, (void**)&v); - if (hr) { - fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr); - _gpgme_free (helpbuf); - SafeArrayDestroyData (array); - SafeArrayDestroy (array); - return hr; - } - - for (p=helpbuf; len; len--, v++) { - VariantInit (v); - v->vt = VT_UI1; - v->u.bVal = *p; - } - SafeArrayUnaccessData (array); - _gpgme_free (helpbuf); - - /* pass the data to the caller */ - VariantInit (retval); - retval->vt = (VT_ARRAY|VT_VARIANT); - retval->u.parray = array; - } - return 0; -} - - -static HRESULT WINAPI -m_IGpgme_SetPlaintext (IGpgme *iface, VARIANT val) -{ - ICOM_THIS (IGpgmeImpl,iface); - - return set_data_from_variant (&This->plaintext, val, - &This->plaintext_given_as_bstr); -} - - -static HRESULT WINAPI -m_IGpgme_GetPlaintext (IGpgme *iface, VARIANT *retval) -{ - ICOM_THIS (IGpgmeImpl,iface); - - /*fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );*/ - return set_data_to_variant (This->plaintext, retval, - This->plaintext_given_as_bstr); -} - -static HRESULT WINAPI -m_IGpgme_SetCiphertext (IGpgme *iface, VARIANT val) -{ - ICOM_THIS (IGpgmeImpl,iface); - - return set_data_from_variant (&This->ciphertext, val, NULL); -} - -static HRESULT WINAPI -m_IGpgme_GetCiphertext (IGpgme *iface, VARIANT *retval) -{ - ICOM_THIS (IGpgmeImpl,iface); - - return set_data_to_variant (This->ciphertext, retval, - This->ciphertext_is_armored); -} - -static HRESULT WINAPI -m_IGpgme_ClearRecipients (IGpgme *iface) -{ - ICOM_THIS (IGpgmeImpl,iface); - - gpgme_recipients_release (This->rset); This->rset = NULL; - return 0; -} - - -static HRESULT WINAPI -m_IGpgme_AddRecipient (IGpgme *iface, BSTR name, signed short int trust) -{ - GpgmeError err; - int n; - char *p; - ICOM_THIS (IGpgmeImpl,iface); - - /*fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p, %d)\n", - This, (int)trust);*/ - if (!This->rset) { - err = gpgme_recipients_new (&This->rset); - if (err) - return map_gpgme_error (err); - } - - n = bstrtoutf8 (name, NULL, 0); - p = HeapAlloc (GetProcessHeap(), 0, n ); - if (!p) { - fprintf (stderr,"HeapAlloc failed: ec=%d\n", (int)GetLastError () ); - return E_OUTOFMEMORY; - } - if (bstrtoutf8 (name, p, n) < 0) { - fprintf (stderr,"problem with bstrtoutf8\n"); - HeapFree (GetProcessHeap(), 0, p); - return E_FAIL; - } - err = gpgme_recipients_add_name (This->rset, p); - HeapFree (GetProcessHeap(), 0, p); - return map_gpgme_error (err); -} - -static HRESULT WINAPI -m_IGpgme_ResetSignKeys (IGpgme *iface) -{ - return E_NOTIMPL; -} - -static HRESULT WINAPI -m_IGpgme_AddSignKey (IGpgme *iface, BSTR name) -{ - return E_NOTIMPL; -} - -static HRESULT WINAPI -m_IGpgme_Encrypt (IGpgme *iface) -{ - GpgmeError err; - ICOM_THIS (IGpgmeImpl,iface); - - gpgme_data_release (This->ciphertext); - err = gpgme_data_new (&This->ciphertext); - if (err) - return map_gpgme_error (err); - - - This->ciphertext_is_armored = gpgme_get_armor (This->mainctx); - err = gpgme_op_encrypt (This->mainctx, This->rset, - This->plaintext, This->ciphertext); -#if 0 - if (!err ) { - char buf[100]; - size_t nread; - - err = gpgme_data_rewind ( This->ciphertext ); - if (err ) - fprintf (stderr, "*** gpgme_data_rewind failed: %d\n", err); - while ( !(err = gpgme_data_read ( This->ciphertext, - buf, 100, &nread )) ) { - fwrite ( buf, nread, 1, stderr ); - } - if (err != GPGME_EOF) - fprintf (stderr, "*** gpgme_data_read failed: %d\n", err); - err = 0; - } -#endif - - return map_gpgme_error (err); -} - -static HRESULT WINAPI -m_IGpgme_Sign (IGpgme *iface, short int signmode) -{ - ICOM_THIS (IGpgmeImpl,iface); - - fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This ); - - return E_NOTIMPL; -} - -static HRESULT WINAPI -m_IGpgme_SignEncrypt (IGpgme *iface, short int signmode) -{ - ICOM_THIS (IGpgmeImpl,iface); - - fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This ); - - return E_NOTIMPL; -} - -#if 0 -static HRESULT WINAPI -m_IGpgme_GetSigStatus(GpgmeCtx c, int idx, - GpgmeSigStat *r_stat, time_t *r_created ); -{ - return 0; -} - - -static HRESULT WINAPI -m_IGpgme_GetSigKey (GpgmeCtx c, int idx, GpgmeKey *r_key); -{ - return 0; -} - -static HRESULT WINAPI -m_IGpgme_GetNotation(IGpgme *c, BSTR *retval) -{ - return 0; -} -#endif - - -static ICOM_VTABLE(IGpgme) igpgme_vtbl = -{ - /* IUnknown methods */ - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - m_IGpgme_QueryInterface, - m_IGpgme_AddRef, - m_IGpgme_Release, - /* IDispatch methods */ - m_stub_IDispatch_GetTypeInfoCount, - m_stub_IDispatch_GetTypeInfo, - m_stub_IDispatch_GetIDsOfNames, - m_stub_IDispatch_Invoke, - /* Our methods */ - m_IGpgme_GetVersion, - m_IGpgme_GetEngineInfo, - m_IGpgme_Cancel, - m_IGpgme_SetArmor, - m_IGpgme_GetArmor, - m_IGpgme_SetTextmode, - m_IGpgme_GetTextmode, - m_IGpgme_SetPlaintext, - m_IGpgme_GetPlaintext, - m_IGpgme_SetCiphertext, - m_IGpgme_GetCiphertext, - m_IGpgme_ClearRecipients, - m_IGpgme_AddRecipient, - m_IGpgme_ResetSignKeys, - m_IGpgme_AddSignKey, - m_IGpgme_Encrypt, - m_IGpgme_Sign, - m_IGpgme_SignEncrypt -}; - - - -/*************************************************************** - ****************** Gpgme Factory **************************** - ***************************************************************/ - -static HRESULT WINAPI -m_GpgmeFactory_QueryInterface (IClassFactory *iface, - REFIID refiid, LPVOID *obj) -{ - ICOM_THIS (IClassFactoryImpl,iface); - - /*fprintf (stderr,"*** m_GpgmeFactory_QueryInterface(%p,%s)", - This, debugstr_guid(refiid));*/ - if ( IsEqualGUID (&IID_IUnknown, refiid) - || IsEqualGUID (&IID_IClassFactory, refiid) ) { - *obj = This; - /*fprintf (stderr," -> got %p\n", obj);*/ - return 0; - } - *obj = NULL; - /*fprintf (stderr," -> none\n");*/ - return E_NOINTERFACE; -} - -static ULONG WINAPI -m_GpgmeFactory_AddRef (IClassFactory *iface) -{ - ICOM_THIS(IClassFactoryImpl,iface); - return ++(This->ref); -} - -static ULONG WINAPI -m_GpgmeFactory_Release (IClassFactory *iface) -{ - ICOM_THIS(IClassFactoryImpl,iface); - return --(This->ref); -} - -static HRESULT WINAPI -m_GpgmeFactory_CreateInstance (IClassFactory *iface, IUnknown *outer, - REFIID refiid, LPVOID *r_obj ) -{ - /*ICOM_THIS(IClassFactoryImpl,iface);*/ - - fprintf (stderr,"*** m_GpgmeFactory_CreateInstance(%s)", - debugstr_guid(refiid) ); - if ( IsEqualGUID (&IID_IUnknown, refiid) - || IsEqualGUID (&IID_IGpgme, refiid) ) { - IGpgmeImpl *obj; - GpgmeCtx ctx; - GpgmeError err; - - - err = gpgme_new (&ctx); - if (err) { - fprintf (stderr," -> gpgme_new failed: %s\n", gpgme_strerror (err)); - return E_OUTOFMEMORY; - } - - obj = HeapAlloc (GetProcessHeap(), 0, sizeof *obj ); - if ( !obj) { - fprintf (stderr," -> out of core\n"); - gpgme_release (ctx); - return E_OUTOFMEMORY; - } - memset (obj, 0, sizeof *obj); - - ICOM_VTBL(obj) = &igpgme_vtbl; - obj->ref = 1; - obj->mainctx = ctx; - { /* Fixme: need to release some stuff on error */ - HRESULT hr; - ITypeLib *pTypeLib; - - hr = LoadRegTypeLib (&TLBID_Gpgcom, 1, 0, LANG_NEUTRAL, &pTypeLib); - if (hr) { - fprintf (stderr," -> LoadRegTypeLib failed: %lx\n", hr); - return hr; - } - hr = ITypeLib_GetTypeInfoOfGuid (pTypeLib, &IID_IGpgme, - &obj->std_disp.tinfo); - ITypeLib_Release (pTypeLib); - if (hr) { - fprintf (stderr," -> GetTypeInfoOfGuid failed: %lx\n", hr); - return hr; - } - hr = CreateStdDispatch ((IUnknown*)obj, obj, obj->std_disp.tinfo, - &obj->std_disp.disp); - if (hr) { - fprintf (stderr," -> CreateStdDispatch failed: %lx\n", hr); - return hr; - } - } - - CoAddRefServerProcess (); - *r_obj = obj; - fprintf (stderr," -> created %p\n", obj ); - return 0; - } - fprintf (stderr," -> no interface\n" ); - *r_obj = NULL; - return E_NOINTERFACE; -} - -static HRESULT WINAPI -m_GpgmeFactory_LockServer (IClassFactory *iface, BOOL dolock ) -{ - if (dolock) { - CoAddRefServerProcess (); - } - else { - ULONG count = CoReleaseServerProcess (); - if (!count && my_exit_event) - SetEvent (my_exit_event); - } - return 0; -} - -static ICOM_VTABLE(IClassFactory) igpgme_factory_vtbl = { - ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE - m_GpgmeFactory_QueryInterface, - m_GpgmeFactory_AddRef, - m_GpgmeFactory_Release, - m_GpgmeFactory_CreateInstance, - m_GpgmeFactory_LockServer -}; -static IClassFactoryImpl igpgme_CF = {&igpgme_factory_vtbl, 1 }; - -void -igpgme_register_exit_event (HANDLE ev) -{ - my_exit_event = ev; -} - - -IClassFactory * -igpgme_factory_new ( CLSID *r_clsid ) -{ - *r_clsid = CLSID_Gpgme; - IClassFactory_AddRef((IClassFactory*)&igpgme_CF); - return (IClassFactory*)&igpgme_CF; -} - -void -igpgme_factory_release ( IClassFactory *factory ) -{ - /* it's static - nothing to do */ -} |