$NetBSD$

libassuan2 support from
http://websvn.kde.org/?view=revision&revision=1078528

--- kleopatra/libkleopatraclient/core/command.cpp.orig	2008-11-19 10:18:55.000000000 +0000
+++ kleopatra/libkleopatraclient/core/command.cpp
@@ -283,19 +283,19 @@ typedef shared_ptr< remove_pointer<assua
 namespace {
     struct AssuanClientContext : AssuanContextBase {
         AssuanClientContext() : AssuanContextBase() {}
-        explicit AssuanClientContext( assuan_context_t ctx ) : AssuanContextBase( ctx, &assuan_disconnect ) {}
-        void reset( assuan_context_t ctx=0 ) { AssuanContextBase::reset( ctx, &assuan_disconnect ); }
+        explicit AssuanClientContext( assuan_context_t ctx ) : AssuanContextBase( ctx, &assuan_release ) {}
+        void reset( assuan_context_t ctx=0 ) { AssuanContextBase::reset( ctx, &assuan_release ); }
     };
 }
 
-static assuan_error_t
+static gpg_error_t
 my_assuan_transact( const AssuanClientContext & ctx,
                     const char *command,
-                    assuan_error_t (*data_cb)( void *, const void *, size_t )=0,
+                    gpg_error_t (*data_cb)( void *, const void *, size_t )=0,
                     void * data_cb_arg=0,
-                    assuan_error_t (*inquire_cb)( void *, const char * )=0,
+                    gpg_error_t (*inquire_cb)( void *, const char * )=0,
                     void * inquire_cb_arg=0,
-                    assuan_error_t (*status_cb)( void *, const char * )=0,
+                    gpg_error_t (*status_cb)( void *, const char * )=0,
                     void * status_cb_arg=0)
 {
     return assuan_transact( ctx.get(), command, data_cb, data_cb_arg, inquire_cb, inquire_cb_arg, status_cb, status_cb_arg );
@@ -337,26 +337,26 @@ static QString start_uiserver() {
     return Command::tr("start_uiserver: not yet implemented");
 }
 
-static assuan_error_t getinfo_pid_cb( void * opaque, const void * buffer, size_t length ) {
+static gpg_error_t getinfo_pid_cb( void * opaque, const void * buffer, size_t length ) {
     qint64 & pid = *static_cast<qint64*>( opaque );
     pid = QByteArray( static_cast<const char*>( buffer ), length ).toLongLong();
     return 0;
 }
 
-static assuan_error_t command_data_cb( void * opaque, const void * buffer, size_t length ) {
+static gpg_error_t command_data_cb( void * opaque, const void * buffer, size_t length ) {
     QByteArray & ba = *static_cast<QByteArray*>( opaque );
     ba.append( QByteArray( static_cast<const char*>(buffer), length ) );
     return 0;
 }
 
-static assuan_error_t send_option( const AssuanClientContext & ctx, const char * name, const QVariant & value ) {
+static gpg_error_t send_option( const AssuanClientContext & ctx, const char * name, const QVariant & value ) {
     if ( value.isValid() )
         return my_assuan_transact( ctx, QString().sprintf( "OPTION %s=%s", name, value.toString().toUtf8().constData() ).toUtf8().constData() );
     else
         return my_assuan_transact( ctx, QString().sprintf( "OPTION %s", name ).toUtf8().constData() );
 }
 
-static assuan_error_t send_file( const AssuanClientContext & ctx, const QString & file ) {
+static gpg_error_t send_file( const AssuanClientContext & ctx, const QString & file ) {
     return my_assuan_transact( ctx, QString().sprintf( "FILE %s", hexencode( QFile::encodeName( file ) ).constData() ).toUtf8().constData() );
 }
 
@@ -373,21 +373,32 @@ void Command::Private::run() {
 
     out.canceled = false;
 
-    assuan_error_t err = 0;
-
-    assuan_context_t naked_ctx = 0;
-    AssuanClientContext ctx;
-
     if ( out.serverLocation.isEmpty() )
         out.serverLocation = default_socket_name();
 
+    AssuanClientContext ctx;
+    gpg_error_t err = 0;
+
     const QString socketName = out.serverLocation;
     if ( socketName.isEmpty() ) {
         out.errorString = tr("Invalid socket name!");
         goto leave;
     }
 
-    err = assuan_socket_connect( &naked_ctx, QFile::encodeName( socketName ).constData(), -1 );
+    {
+        assuan_context_t naked_ctx = 0;
+        err = assuan_new( &naked_ctx );
+        if ( err ) {
+            out.errorString = tr( "Could not allocate resources to connect to Kleopatra UI server at %1: %2" )
+                .arg( socketName, to_error_string( err ) );
+            goto leave;
+        }
+
+        ctx.reset( naked_ctx );
+    }
+
+
+    err = assuan_socket_connect( ctx.get(), QFile::encodeName( socketName ).constData(), -1, 0 );
     if ( err ) {
         qDebug( "UI server not running, starting it" );
         
@@ -400,7 +411,7 @@ void Command::Private::run() {
         // give it a bit of time to start up and try a couple of times
         for ( int i = 0 ; err && i < 20 ; ++i ) {
             msleep( 500 );
-            err = assuan_socket_connect( &naked_ctx, QFile::encodeName( socketName ).constData(), -1 );
+            err = assuan_socket_connect( ctx.get(), QFile::encodeName( socketName ).constData(), -1, 0 );
         }
     }
 
@@ -410,9 +421,6 @@ void Command::Private::run() {
         goto leave;
     }
 
-    ctx.reset( naked_ctx );
-    naked_ctx = 0;
-
     out.serverPid = -1;
     err = my_assuan_transact( ctx, "GETINFO pid", &getinfo_pid_cb, &out.serverPid );
     if ( err || out.serverPid <= 0 ) {
