Previous: I/O Callback Example GDK, Up: Using External Event Loops


7.7.2.6 I/O Callback Example Qt

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;
       // ...
     };