certmanager/lib Library API Documentation

qgpgmesecretkeyexportjob.cpp

00001 /*
00002     qgpgmesecretexportjob.cpp
00003 
00004     This file is part of libkleopatra, the KDE keymanagement library
00005     Copyright (c) 2004 Klarälvdalens Datakonsult AB
00006 
00007     Libkleopatra is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU General Public License as
00009     published by the Free Software Foundation; either version 2 of the
00010     License, or (at your option) any later version.
00011 
00012     Libkleopatra is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     General Public License for more details.
00016 
00017     You should have received a copy of the GNU General Public License
00018     along with this program; if not, write to the Free Software
00019     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020 
00021     In addition, as a special exception, the copyright holders give
00022     permission to link the code of this program with any edition of
00023     the Qt library by Trolltech AS, Norway (or with modified versions
00024     of Qt that use the same license as Qt), and distribute linked
00025     combinations including the two.  You must obey the GNU General
00026     Public License in all respects for all of the code used other than
00027     Qt.  If you modify this file, you may extend this exception to
00028     your version of the file, but you are not obligated to do so.  If
00029     you do not wish to do so, delete this exception statement from
00030     your version.
00031 */
00032 
00033 #ifdef HAVE_CONFIG_H
00034 #include <config.h>
00035 #endif
00036 
00037 #include "qgpgmesecretkeyexportjob.h"
00038 
00039 #include "gnupgprocessbase.h"
00040 #include "qgpgmeprogresstokenmapper.h"
00041 
00042 #include <kdebug.h>
00043 
00044 #include <gpgmepp/context.h>
00045 #include <gpgmepp/data.h>
00046 
00047 #include <qgpgme/eventloopinteractor.h>
00048 
00049 #include <qstringlist.h>
00050 
00051 #include <gpg-error.h>
00052 
00053 #include <string.h>
00054 #include <assert.h>
00055 
00056 Kleo::QGpgMESecretKeyExportJob::QGpgMESecretKeyExportJob( bool armour )
00057   : ExportJob( QGpgME::EventLoopInteractor::instance(), "Kleo::QGpgMESecretKeyExportJob" ),
00058     mProcess( 0 ),
00059     mError( 0 ),
00060     mArmour( armour )
00061 {
00062 
00063 }
00064 
00065 Kleo::QGpgMESecretKeyExportJob::~QGpgMESecretKeyExportJob() {
00066 
00067 }
00068 
00069 GpgME::Error Kleo::QGpgMESecretKeyExportJob::start( const QStringList & patterns ) {
00070   assert( mKeyData.isEmpty() );
00071 
00072   if ( patterns.size() != 1 || patterns.front().isEmpty() )
00073     return mError = gpg_err_make( GPG_ERR_SOURCE_GPGSM, GPG_ERR_INV_VALUE );
00074 
00075   // create and start gpgsm process:
00076   mProcess = new GnuPGProcessBase( this, "gpgsm --export-secret-key-p12" );
00077 
00078   // FIXME: obbtain the path to gpgsm from gpgme, so we use the same instance.
00079   *mProcess << "gpgsm" << "--export-secret-key-p12";
00080   if ( mArmour )
00081     *mProcess << "--armor";
00082   *mProcess << patterns.front().utf8();
00083 
00084   mProcess->setUseStatusFD( true );
00085 
00086   connect( mProcess, SIGNAL(processExited(KProcess*)),
00087        SLOT(slotProcessExited(KProcess*)) );
00088   connect( mProcess, SIGNAL(receivedStdout(KProcess*,char*,int)),
00089        SLOT(slotStdout(KProcess*,char*,int)) );
00090   connect( mProcess, SIGNAL(receivedStderr(KProcess*,char*,int)),
00091        SLOT(slotStderr(KProcess*,char*,int)) );
00092   connect( mProcess, SIGNAL(status(Kleo::GnuPGProcessBase*,const QString&,const QStringList&)),
00093        SLOT(slotStatus(Kleo::GnuPGProcessBase*,const QString&,const QStringList&)) );
00094 
00095   if ( !mProcess->start( KProcess::NotifyOnExit, KProcess::AllOutput ) ) {
00096     mError = gpg_err_make( GPG_ERR_SOURCE_GPGSM, GPG_ERR_ENOENT ); // what else?
00097     deleteLater();
00098     return mError;
00099   } else
00100     return 0;
00101 }
00102 
00103 void Kleo::QGpgMESecretKeyExportJob::slotCancel() {
00104   if ( mProcess )
00105     mProcess->kill();
00106   mProcess = 0;
00107   mError = gpg_err_make( GPG_ERR_SOURCE_GPGSM, GPG_ERR_CANCELED );
00108 }
00109 
00110 void Kleo::QGpgMESecretKeyExportJob::slotStatus( GnuPGProcessBase * proc, const QString & type, const QStringList & args ) {
00111   if ( proc != mProcess )
00112     return;
00113   QStringList::const_iterator it = args.begin();
00114   bool ok = false;
00115 
00116   if ( type == "ERROR" ) {
00117 
00118 
00119     if ( args.size() < 2 ) {
00120       kdDebug( 5150 ) << "Kleo::QGpgMESecretKeyExportJob::slotStatus() not recognising ERROR with < 2 args!" << endl;
00121       return;
00122     }
00123     const int source = (*++it).toInt( &ok );
00124     if ( !ok ) {
00125       kdDebug( 5150 ) << "Kleo::QGpgMESecretKeyExportJob::slotStatus() expected number for first ERROR arg, got something else" << endl;
00126       return;
00127     }
00128     ok = false;
00129     const int code = (*++it).toInt( &ok );
00130     if ( !ok ) {
00131       kdDebug( 5150 ) << "Kleo::QGpgMESecretKeyExportJob::slotStatus() expected number for second ERROR arg, got something else" << endl;
00132       return;
00133     }
00134     mError = gpg_err_make( (gpg_err_source_t)source, (gpg_err_code_t)code );
00135 
00136 
00137   } else if ( type == "PROGRESS" ) {
00138 
00139 
00140     if ( args.size() < 4 ) {
00141       kdDebug( 5150 ) << "Kleo::QGpgMESecretKeyExportJob::slotStatus() not recognising PROGRESS with < 4 args!" << endl;
00142       return;
00143     }
00144     const QString what = *++it;
00145     ++it; // don't use "type"...
00146     const int cur = (*++it).toInt( &ok );
00147     if ( !ok ) {
00148       kdDebug( 5150 ) << "Kleo::QGpgMESecretKeyExportJob::slotStatus() expected number for \"cur\", got something else" << endl;
00149       return;
00150     }
00151     ok = false;
00152     const int total = (*++it).toInt( &ok );
00153     if ( !ok ) {
00154       kdDebug( 5150 ) << "Kleo::QGpgMESecretKeyExportJob::slotStatus() expected number for \"total\", got something else" << endl;
00155       return;
00156     }
00157     emit progress( QGpgMEProgressTokenMapper::instance()->map( what, 0, cur, total ), cur, total );
00158 
00159 
00160   }
00161 }
00162 
00163 void Kleo::QGpgMESecretKeyExportJob::slotStdout( KProcess * proc, char * buf, int buflen ) {
00164   if ( proc != mProcess )
00165     return;
00166   if ( buflen <= 0 )
00167     return;
00168   if ( !buf )
00169     return;
00170   const unsigned int oldlen = mKeyData.size();
00171   mKeyData.resize( oldlen + buflen );
00172   memcpy( mKeyData.data() + oldlen, buf, buflen );
00173 }
00174 
00175 void Kleo::QGpgMESecretKeyExportJob::slotStderr( KProcess *, char *, int ) {
00176   // implement? or not?
00177 }
00178 
00179 void Kleo::QGpgMESecretKeyExportJob::slotProcessExited( KProcess * proc ) {
00180   if ( proc != mProcess )
00181     return;
00182 
00183   emit done();
00184   if ( !mError &&
00185        ( !mProcess->normalExit() || mProcess->exitStatus() != 0 ) )
00186     mError = gpg_err_make( GPG_ERR_SOURCE_GPGSM, GPG_ERR_GENERAL );
00187   emit result( mError, mKeyData );
00188   deleteLater();
00189 }
00190 
00191 #include "qgpgmesecretkeyexportjob.moc"
KDE Logo
This file is part of the documentation for certmanager/lib Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Apr 4 04:46:16 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003