From 7bd54f5a796f6f1276bbd310deaf1f2ac673954d Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sun, 28 Apr 2013 16:44:42 -0500 Subject: Fix retriggering of GPGMe socket notifiers in nested event loops This resolves Bug 825 Add missing GPGMe feature checks to CMake --- libtdenetwork/gpgmepp/callbacks.cpp | 7 ++++--- libtdenetwork/qgpgme/eventloopinteractor.cpp | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) (limited to 'libtdenetwork') diff --git a/libtdenetwork/gpgmepp/callbacks.cpp b/libtdenetwork/gpgmepp/callbacks.cpp index ba9c30bf0..23cc55e82 100644 --- a/libtdenetwork/gpgmepp/callbacks.cpp +++ b/libtdenetwork/gpgmepp/callbacks.cpp @@ -64,9 +64,10 @@ gpgme_error_t passphrase_callback( void * opaque, const char * uid_hint, const c bool canceled = false; gpgme_error_t err = GPG_ERR_NO_ERROR; char * passphrase = provider ? provider->getPassphrase( uid_hint, desc, prev_was_bad, canceled ) : 0 ; - if ( canceled ) + if ( canceled ) { err = makeError( GPG_ERR_CANCELED ); - else + } + else { if ( passphrase && *passphrase ) { size_t passphrase_length = strlen( passphrase ); size_t written = 0; @@ -79,7 +80,7 @@ gpgme_error_t passphrase_callback( void * opaque, const char * uid_hint, const c written += now_written; } while ( written < passphrase_length ); } - + } if ( passphrase && *passphrase ) wipe( passphrase, strlen( passphrase ) ); free( passphrase ); diff --git a/libtdenetwork/qgpgme/eventloopinteractor.cpp b/libtdenetwork/qgpgme/eventloopinteractor.cpp index 3b07189d7..b6d9830d6 100644 --- a/libtdenetwork/qgpgme/eventloopinteractor.cpp +++ b/libtdenetwork/qgpgme/eventloopinteractor.cpp @@ -30,6 +30,11 @@ #include #include +#include + +TQValueList writeActivity; +TQValueList readActivity; + using namespace GpgME; QGpgME::EventLoopInteractor::EventLoopInteractor( TQObject * parent, const char * name ) @@ -77,11 +82,21 @@ void QGpgME::EventLoopInteractor::unregisterWatcher( void * tag ) { } void QGpgME::EventLoopInteractor::slotWriteActivity( int socket ) { + if (writeActivity.contains(socket)) { + return; + } + writeActivity.append(socket); actOn( socket , Write ); + writeActivity.remove(socket); } void QGpgME::EventLoopInteractor::slotReadActivity( int socket ) { + if (readActivity.contains(socket)) { + return; + } + readActivity.append(socket); actOn( socket , Read ); + readActivity.remove(socket); } void QGpgME::EventLoopInteractor::nextTrustItemEvent( GpgME::Context * context, const GpgME::TrustItem & item ) { -- cgit v1.2.1