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 */ +} + + + + + + + + + | 
