diff options
Diffstat (limited to 'complus/ignupg.c')
-rw-r--r-- | complus/ignupg.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/complus/ignupg.c b/complus/ignupg.c new file mode 100644 index 00000000..009d5db1 --- /dev/null +++ b/complus/ignupg.c @@ -0,0 +1,202 @@ +/* ignupg.c - COM+ class IGnuPG + * Copyright (C) 2000 Werner Koch (dd9jn) + * + * 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> + +#define INITGUID +#include "ignupg.h" + +/* + * Declare the interface implementation structures + */ +typedef struct IGnuPGImpl IGnuPGImpl; +typedef struct IClassFactoryImpl IClassFactoryImpl; + + +struct IGnuPGImpl { + /* IUnknown required stuff */ + ICOM_VFIELD (IGnuPG); + DWORD ref; + /* Our stuff */ + int foo; +}; + + +struct IClassFactoryImpl { + /* IUnknown fields */ + ICOM_VFIELD(IClassFactory); + DWORD ref; +}; + + + +/********************************************************** + ************** IGnuPG Implementation ******************* + **********************************************************/ + +static HRESULT WINAPI +IGnuPGImpl_QueryInterface (IGnuPG *iface, REFIID refiid, LPVOID *obj) +{ + ICOM_THIS (IGnuPGImpl,iface); + + fprintf (stderr,"(%p)->QueryInterface(%s,%p)\n", + This, "debugstr_guid(refiid)", obj); + if ( IsEqualGUID (&IID_IUnknown, refiid) + || !IsEqualGUID (&IID_IGnuPG, refiid) ) { + *obj = iface; + return 0; + } + *obj = NULL; + return E_NOINTERFACE; +} + + +static ULONG WINAPI +IGnuPGImpl_AddRef (IGnuPG *iface) +{ + ICOM_THIS (IGnuPGImpl,iface); + + return ++This->ref; +} + + +static ULONG WINAPI +IGnuPGImpl_Release (IGnuPG *iface) +{ + ICOM_THIS (IGnuPGImpl,iface); + + if (--This->ref) + return This->ref; + + HeapFree(GetProcessHeap(),0,iface); + return 0; +} + + + + +static ICOM_VTABLE(IGnuPG) gnupg_vtbl = +{ + /* IUnknow methods */ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IGnuPGImpl_QueryInterface, + IGnuPGImpl_AddRef, + IGnuPGImpl_Release, + /* Our methods */ + +}; + + + +/*************************************************************** + ****************** GnuPG Factory **************************** + ***************************************************************/ + +static HRESULT WINAPI +GnuPGFactory_QueryInterface (IClassFactory *iface, REFIID refiid, LPVOID *obj) +{ + /*ICOM_THIS(IClassFactoryImpl,iface);*/ + return E_NOINTERFACE; +} + +static ULONG WINAPI +GnuPGFactory_AddRef (IClassFactory *iface) +{ + ICOM_THIS(IClassFactoryImpl,iface); + return ++(This->ref); +} + +static ULONG WINAPI +GnuPGFactory_Release (IClassFactory *iface) +{ + ICOM_THIS(IClassFactoryImpl,iface); + return --(This->ref); +} + +static HRESULT WINAPI +GnuPGFactory_CreateInstance (IClassFactory *iface, IUnknown *outer, + REFIID refiid, LPVOID *r_obj ) +{ + /*ICOM_THIS(IClassFactoryImpl,iface);*/ + + if ( IsEqualGUID (&IID_IGnuPG, refiid) ) { + IGnuPGImpl *obj; + + obj = HeapAlloc (GetProcessHeap(), 0, sizeof *obj ); + if ( !obj) + return E_OUTOFMEMORY; + + ICOM_VTBL(obj) = &gnupg_vtbl; + obj->ref = 1; + *r_obj = obj; + return 0; + } + *r_obj = NULL; + return E_NOINTERFACE; +} + +static HRESULT WINAPI +GnuPGFactory_LockServer (IClassFactory *iface, BOOL dolock ) +{ + /*ICOM_THIS(IClassFactoryImpl,iface);*/ + return 0; +} + +static ICOM_VTABLE(IClassFactory) gnupg_factory_vtbl = { + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + GnuPGFactory_QueryInterface, + GnuPGFactory_AddRef, + GnuPGFactory_Release, + GnuPGFactory_CreateInstance, + GnuPGFactory_LockServer +}; +static IClassFactoryImpl GnuPG_CF = {&gnupg_factory_vtbl, 1 }; + + +IClassFactory * +gnupg_factory_new ( CLSID *r_clsid ) +{ + *r_clsid = CLSID_GnuPG; + IClassFactory_AddRef((IClassFactory*)&GnuPG_CF); + return (IClassFactory*)&GnuPG_CF; +} + +void +gnupg_factory_release ( IClassFactory *factory ) +{ + /* it's static - nothing to do */ +} + + + + + + + + + |