Previous: I/O Callback Example GDK, Up: Using External Event Loops [Contents][Index]
The I/O callback interface can also be used to integrate GPGME with the Qt event loop. The following code snippets show how this can be done using the appropriate register and remove I/O callback functions. In this example, the private data of the register I/O callback function is unused. The event notifications is missing because it does not require any Qt specific setup.
#include <qsocketnotifier.h>
#include <qapplication.h>
struct IOCB {
IOCB( GpgmeIOCb f, void * d, QSocketNotifier * n )
: func( f ), data( d ), notifier( n ) {}
GpgmeIOCb func;
void * data;
QSocketNotifier * notifier;
}
class MyApp : public QApplication {
// ...
static void registerGpgmeIOCallback( void * data, int fd, int dir,
GpgmeIOCb func, void * func_data,
void ** tag ) {
QSocketNotifier * n =
new QSocketNotifier( fd, dir ? QSocketNotifier::Read
: QSocketNotifier::Write );
connect( n, SIGNAL(activated(int)),
qApp, SLOT(slotGpgmeIOCallback(int)) );
qApp->mIOCBs.push_back( IOCB( func, func_data, n ) );
*tag = (void*)n;
}
static void removeGpgmeIOCallback( void * tag ) {
if ( !tag ) return;
QSocketNotifier * n = static_cast<QSocketNotifier*>( tag );
for ( QValueList<IOCB>::iterator it = qApp->mIOCBs.begin() ;
it != qApp->mIOCBs.end() ; ++it )
if ( it->notifier == n ) {
delete it->notifier;
qApp->mIOCBs.erase( it );
return;
}
}
public slots:
void slotGpgmeIOCallback( int fd ) {
for ( QValueList<IOCB>::const_iterator it = mIOCBs.begin() ;
it != mIOCBs.end() ; ++it )
if ( it->notifier && it->notifier->socket() == fd )
(*(it->func)) ( it->func_data, fd );
}
// ...
private:
QValueList<IOCB> mIOCBs;
// ...
};