Does not manage lifetime

This commit is contained in:
Werner Koch 2001-07-31 09:44:22 +00:00
parent 8c4d2ca609
commit 6ccc42c489
3 changed files with 43 additions and 84 deletions

View File

@ -516,6 +516,7 @@ enter_complus ()
running = CreateEvent (NULL, FALSE, FALSE, NULL ); running = CreateEvent (NULL, FALSE, FALSE, NULL );
fprintf (stderr,"*** CoInitialize() done; event=%lx\n", (unsigned long)running ); fprintf (stderr,"*** CoInitialize() done; event=%lx\n", (unsigned long)running );
igpgme_register_exit_event (running);
factory = igpgme_factory_new ( &clsid ); factory = igpgme_factory_new ( &clsid );
fprintf (stderr,"*** igpgme_factory_new() done; got=%p\n", factory ); fprintf (stderr,"*** igpgme_factory_new() done; got=%p\n", factory );
hr = CoRegisterClassObject (&clsid, (IUnknown*)factory, hr = CoRegisterClassObject (&clsid, (IUnknown*)factory,
@ -532,6 +533,7 @@ enter_complus ()
WaitForSingleObject ( running, INFINITE ); WaitForSingleObject ( running, INFINITE );
fprintf (stderr,"*** shutting down\n" ); fprintf (stderr,"*** shutting down\n" );
igpgme_register_exit_event (NULL);
CloseHandle (running); CloseHandle (running);
CoRevokeClassObject ( reg ); CoRevokeClassObject ( reg );
fprintf (stderr,"*** class object revoked\n" ); fprintf (stderr,"*** class object revoked\n" );

View File

@ -48,6 +48,7 @@ void _gpgme_free ( void *a );
typedef struct IGpgmeImpl IGpgmeImpl; typedef struct IGpgmeImpl IGpgmeImpl;
typedef struct IClassFactoryImpl IClassFactoryImpl; typedef struct IClassFactoryImpl IClassFactoryImpl;
static HANDLE my_exit_event;
struct IGpgmeImpl { struct IGpgmeImpl {
/* IUnknown required stuff */ /* IUnknown required stuff */
@ -153,6 +154,11 @@ m_IGpgme_Release (IGpgme *iface)
if (This->std_disp.tinfo) if (This->std_disp.tinfo)
ITypeInfo_Release (This->std_disp.tinfo); ITypeInfo_Release (This->std_disp.tinfo);
HeapFree(GetProcessHeap(),0,iface); HeapFree(GetProcessHeap(),0,iface);
{
ULONG count = CoReleaseServerProcess ();
if (!count && my_exit_event)
SetEvent (my_exit_event);
}
return 0; return 0;
} }
@ -214,7 +220,6 @@ m_IGpgme_SetArmor (IGpgme *iface, BOOL yes)
{ {
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
gpgme_set_armor (This->mainctx, yes); gpgme_set_armor (This->mainctx, yes);
return 0; return 0;
} }
@ -234,7 +239,6 @@ m_IGpgme_SetTextmode (IGpgme *iface, BOOL yes)
{ {
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
gpgme_set_textmode (This->mainctx, yes); gpgme_set_textmode (This->mainctx, yes);
return 0; return 0;
} }
@ -242,7 +246,10 @@ m_IGpgme_SetTextmode (IGpgme *iface, BOOL yes)
static HRESULT WINAPI static HRESULT WINAPI
m_IGpgme_GetTextmode (IGpgme *iface, BOOL *retval) m_IGpgme_GetTextmode (IGpgme *iface, BOOL *retval)
{ {
return E_NOTIMPL; ICOM_THIS (IGpgmeImpl,iface);
*retval = gpgme_get_textmode (This->mainctx);
return 0;
} }
@ -273,10 +280,12 @@ set_data_from_variant (GpgmeData *data, VARIANT val, int *given_as_bstr)
return E_FAIL; return E_FAIL;
} }
#if 0
fprintf (stderr,"Got a BSTR (utf8):"); fprintf (stderr,"Got a BSTR (utf8):");
for (i=0; i < len; i++) for (i=0; i < len; i++)
fprintf (stderr, " %0X", buf[i] ); fprintf (stderr, " %0X", buf[i] );
putc ('\n', stderr); putc ('\n', stderr);
#endif
gpgme_data_release (*data); *data = NULL; gpgme_data_release (*data); *data = NULL;
err = gpgme_data_new_from_mem (data, buf, len, 0 /*no need to copy*/ ); err = gpgme_data_new_from_mem (data, buf, len, 0 /*no need to copy*/ );
if (!err && given_as_bstr) if (!err && given_as_bstr)
@ -285,16 +294,16 @@ set_data_from_variant (GpgmeData *data, VARIANT val, int *given_as_bstr)
else if ( val.vt == (VT_ARRAY|VT_UI1)) { else if ( val.vt == (VT_ARRAY|VT_UI1)) {
array = val.u.parray; array = val.u.parray;
fprintf (stderr,"Got an ARRAY of bytes:"); /*fprintf (stderr,"Got an ARRAY of bytes:");*/
hr = SafeArrayAccessData (array, (void**)&buf); hr = SafeArrayAccessData (array, (void**)&buf);
if (hr) { if (hr) {
fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr); fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr);
return hr; return hr;
} }
len = array->rgsabound[0].cElements; len = array->rgsabound[0].cElements;
for (i=0; i < len; i++) /*for (i=0; i < len; i++)
fprintf (stderr, " %0X", buf[i] ); fprintf (stderr, " %0X", buf[i] );
putc ('\n', stderr); putc ('\n', stderr);*/
gpgme_data_release (*data); *data = NULL; gpgme_data_release (*data); *data = NULL;
err = gpgme_data_new_from_mem (data, buf, len, 1 ); err = gpgme_data_new_from_mem (data, buf, len, 1 );
@ -306,7 +315,7 @@ set_data_from_variant (GpgmeData *data, VARIANT val, int *given_as_bstr)
VARIANT *vp; VARIANT *vp;
array = val.u.parray; array = val.u.parray;
fprintf (stderr,"Got an ARRAY of VARIANTS:"); /*fprintf (stderr,"Got an ARRAY of VARIANTS:");*/
hr = SafeArrayAccessData (array, (void**)&vp); hr = SafeArrayAccessData (array, (void**)&vp);
if (hr) { if (hr) {
fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr); fprintf (stderr,"*** SafeArrayAccessData failed: hr=%lx\n", hr);
@ -339,9 +348,9 @@ set_data_from_variant (GpgmeData *data, VARIANT val, int *given_as_bstr)
} }
} }
for (i=0; i < len; i++) /*for (i=0; i < len; i++)
fprintf (stderr, " %0X", buf[i] ); fprintf (stderr, " %0X", buf[i] );
putc ('\n', stderr); putc ('\n', stderr);*/
gpgme_data_release (*data); *data = NULL; gpgme_data_release (*data); *data = NULL;
err = gpgme_data_new_from_mem (data, buf, len, 0); err = gpgme_data_new_from_mem (data, buf, len, 0);
@ -380,14 +389,13 @@ set_data_to_variant (GpgmeData data, VARIANT *retval, int use_bstr)
return map_gpgme_error (err); return map_gpgme_error (err);
} }
len = nread; /*(eof returns a length of 0)*/ len = nread; /*(eof returns a length of 0)*/
fprintf (stderr,"*** %d bytes are availabe\n", (int)len); /*fprintf (stderr,"*** %d bytes are availabe\n", (int)len);*/
/* convert it to the target data type */ /* convert it to the target data type */
if (use_bstr) { if (use_bstr) {
BSTR bs; BSTR bs;
unsigned char *helpbuf; unsigned char *helpbuf;
fprintf (stderr," using BSTR\n");
/* It is easier to allocate some helper storage */ /* It is easier to allocate some helper storage */
helpbuf = _gpgme_malloc (len); helpbuf = _gpgme_malloc (len);
if (!helpbuf) if (!helpbuf)
@ -502,7 +510,6 @@ m_IGpgme_SetPlaintext (IGpgme *iface, VARIANT val)
{ {
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
return set_data_from_variant (&This->plaintext, val, return set_data_from_variant (&This->plaintext, val,
&This->plaintext_given_as_bstr); &This->plaintext_given_as_bstr);
} }
@ -513,7 +520,7 @@ m_IGpgme_GetPlaintext (IGpgme *iface, VARIANT *retval)
{ {
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This ); /*fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );*/
return set_data_to_variant (This->plaintext, retval, return set_data_to_variant (This->plaintext, retval,
This->plaintext_given_as_bstr); This->plaintext_given_as_bstr);
} }
@ -523,7 +530,6 @@ m_IGpgme_SetCiphertext (IGpgme *iface, VARIANT val)
{ {
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
return set_data_from_variant (&This->ciphertext, val, NULL); return set_data_from_variant (&This->ciphertext, val, NULL);
} }
@ -532,7 +538,6 @@ m_IGpgme_GetCiphertext (IGpgme *iface, VARIANT *retval)
{ {
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
return set_data_to_variant (This->ciphertext, retval, return set_data_to_variant (This->ciphertext, retval,
This->ciphertext_is_armored); This->ciphertext_is_armored);
} }
@ -542,7 +547,6 @@ m_IGpgme_ClearRecipients (IGpgme *iface)
{ {
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
gpgme_recipients_release (This->rset); This->rset = NULL; gpgme_recipients_release (This->rset); This->rset = NULL;
return 0; return 0;
} }
@ -556,7 +560,8 @@ m_IGpgme_AddRecipient (IGpgme *iface, BSTR name, signed short int trust)
char *p; char *p;
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p, %d)\n", This, (int)trust); /*fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p, %d)\n",
This, (int)trust);*/
if (!This->rset) { if (!This->rset) {
err = gpgme_recipients_new (&This->rset); err = gpgme_recipients_new (&This->rset);
if (err) if (err)
@ -574,7 +579,6 @@ m_IGpgme_AddRecipient (IGpgme *iface, BSTR name, signed short int trust)
HeapFree (GetProcessHeap(), 0, p); HeapFree (GetProcessHeap(), 0, p);
return E_FAIL; return E_FAIL;
} }
fprintf (stderr,"*** adding name `%s'\n", p);
err = gpgme_recipients_add_name (This->rset, p); err = gpgme_recipients_add_name (This->rset, p);
HeapFree (GetProcessHeap(), 0, p); HeapFree (GetProcessHeap(), 0, p);
return map_gpgme_error (err); return map_gpgme_error (err);
@ -583,20 +587,12 @@ m_IGpgme_AddRecipient (IGpgme *iface, BSTR name, signed short int trust)
static HRESULT WINAPI static HRESULT WINAPI
m_IGpgme_ResetSignKeys (IGpgme *iface) m_IGpgme_ResetSignKeys (IGpgme *iface)
{ {
ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI static HRESULT WINAPI
m_IGpgme_AddSignKey (IGpgme *iface, BSTR name) m_IGpgme_AddSignKey (IGpgme *iface, BSTR name)
{ {
ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -606,7 +602,6 @@ m_IGpgme_Encrypt (IGpgme *iface)
GpgmeError err; GpgmeError err;
ICOM_THIS (IGpgmeImpl,iface); ICOM_THIS (IGpgmeImpl,iface);
fprintf (stderr,"*** " __PRETTY_FUNCTION__ "(%p)\n", This );
gpgme_data_release (This->ciphertext); gpgme_data_release (This->ciphertext);
err = gpgme_data_new (&This->ciphertext); err = gpgme_data_new (&This->ciphertext);
if (err) if (err)
@ -658,49 +653,6 @@ m_IGpgme_SignEncrypt (IGpgme *iface, short int signmode)
} }
#if 0 #if 0
static HRESULT WINAPI
m_IGpgme_SetKeylistMode( GpgmeCtx c, BOOL mode )
{
return 0;
}
static HRESULT WINAPI
m_IGpgme_SetPassphraseCB (GpgmeCtx c,
GpgmePassphraseCb cb, void *cb_value)
{
return 0;
}
static HRESULT WINAPI
m_IGpgme_SetProgressCB (GpgmeCtx c, GpgmeProgressCb cb, void *cb_value)
{
return E_NOTIMPL;
}
static HRESULT WINAPI
m_IGpgme_SignersClear (GpgmeCtx c)
{
return 0;
}
static HRESULT WINAPI
m_IGpgme_SignersAdd (GpgmeCtx c, const GpgmeKey key)
{
return 0;
}
static HRESULT WINAPI
m_IGpgme_SignersEnum (const GpgmeCtx c, int seq)
{
return 0;
}
static HRESULT WINAPI static HRESULT WINAPI
m_IGpgme_GetSigStatus(GpgmeCtx c, int idx, m_IGpgme_GetSigStatus(GpgmeCtx c, int idx,
GpgmeSigStat *r_stat, time_t *r_created ); GpgmeSigStat *r_stat, time_t *r_created );
@ -753,17 +705,7 @@ static ICOM_VTABLE(IGpgme) igpgme_vtbl =
m_IGpgme_AddSignKey, m_IGpgme_AddSignKey,
m_IGpgme_Encrypt, m_IGpgme_Encrypt,
m_IGpgme_Sign, m_IGpgme_Sign,
m_IGpgme_SignEncrypt, m_IGpgme_SignEncrypt
/* m_IGpgme_SetKeylistMode,
* m_IGpgme_SetPassphraseCB,
* m_IGpgme_SetProgressCB,
* m_IGpgme_SignersClear,
* m_IGpgme_SignersAdd,
* m_IGpgme_SignersEnum,
* m_IGpgme_GetSigStatus,
* m_IGpgme_GetSigKey,
* m_IGpgme_GetNotation
*/
}; };
@ -861,6 +803,7 @@ m_GpgmeFactory_CreateInstance (IClassFactory *iface, IUnknown *outer,
} }
} }
CoAddRefServerProcess ();
*r_obj = obj; *r_obj = obj;
fprintf (stderr," -> created %p\n", obj ); fprintf (stderr," -> created %p\n", obj );
return 0; return 0;
@ -873,7 +816,14 @@ m_GpgmeFactory_CreateInstance (IClassFactory *iface, IUnknown *outer,
static HRESULT WINAPI static HRESULT WINAPI
m_GpgmeFactory_LockServer (IClassFactory *iface, BOOL dolock ) m_GpgmeFactory_LockServer (IClassFactory *iface, BOOL dolock )
{ {
/*ICOM_THIS(IClassFactoryImpl,iface);*/ if (dolock) {
CoAddRefServerProcess ();
}
else {
ULONG count = CoReleaseServerProcess ();
if (!count && my_exit_event)
SetEvent (my_exit_event);
}
return 0; return 0;
} }
@ -887,6 +837,12 @@ static ICOM_VTABLE(IClassFactory) igpgme_factory_vtbl = {
}; };
static IClassFactoryImpl igpgme_CF = {&igpgme_factory_vtbl, 1 }; static IClassFactoryImpl igpgme_CF = {&igpgme_factory_vtbl, 1 };
void
igpgme_register_exit_event (HANDLE ev)
{
my_exit_event = ev;
}
IClassFactory * IClassFactory *
igpgme_factory_new ( CLSID *r_clsid ) igpgme_factory_new ( CLSID *r_clsid )

View File

@ -45,6 +45,7 @@ DEFINE_GUID(IID_IGpgme, 0x3811fd50, 0x7f72, 0x11d5,
typedef struct IGpgme IGpgme; typedef struct IGpgme IGpgme;
void igpgme_register_exit_event (HANDLE ev);
IClassFactory *igpgme_factory_new( CLSID *r_clsid ); IClassFactory *igpgme_factory_new( CLSID *r_clsid );
void igpgme_factory_release ( IClassFactory *factory ); void igpgme_factory_release ( IClassFactory *factory );