00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "symcryptrunprocessbase.h"
00034
00035 #include <ktempfile.h>
00036 #include <kdebug.h>
00037 #include <kshell.h>
00038
00039 #include <qtimer.h>
00040 #include <qfile.h>
00041
00042 #include <cstring>
00043
00044 Kleo::SymCryptRunProcessBase::SymCryptRunProcessBase( const QString & class_, const QString & program,
00045 const QString & keyFile, const QString & options,
00046 Operation mode,
00047 QObject * parent, const char * name )
00048 : KProcess( parent, name ),
00049 mOperation( mode ), mOptions( options )
00050 {
00051 *this << "symcryptrun"
00052 << "--class" << class_
00053 << "--program" << program
00054 << "--keyfile" << keyFile
00055 << ( mode == Encrypt ? "--encrypt" : "--decrypt" );
00056 }
00057
00058 Kleo::SymCryptRunProcessBase::~SymCryptRunProcessBase() {}
00059
00060 bool Kleo::SymCryptRunProcessBase::launch( const QByteArray & input, RunMode rm ) {
00061 connect( this, SIGNAL(receivedStdout(KProcess*,char*,int)),
00062 this, SLOT(slotReceivedStdout(KProcess*,char*,int)) );
00063 connect( this, SIGNAL(receivedStderr(KProcess*,char*,int)),
00064 this, SLOT(slotReceivedStderr(KProcess*,char*,int)) );
00065 if ( rm == Block ) {
00066 KTempFile tempfile;
00067 tempfile.setAutoDelete( true );
00068 if ( QFile * file = tempfile.file() )
00069 file->writeBlock( input );
00070 else
00071 return false;
00072 tempfile.close();
00073 *this << "--input" << tempfile.name();
00074 addOptions();
00075 return KProcess::start( Block, All );
00076 } else {
00077 addOptions();
00078 const bool ok = KProcess::start( rm, All );
00079 if ( !ok )
00080 return ok;
00081 mInput = input.copy();
00082 writeStdin( mInput.begin(), mInput.size() );
00083 connect( this, SIGNAL(wroteStdin(KProcess*)), this, SLOT(closeStdin()) );
00084 return true;
00085 }
00086 }
00087
00088 void Kleo::SymCryptRunProcessBase::addOptions() {
00089 if ( !mOptions.isEmpty() )
00090 {
00091 const QStringList args = KShell::splitArgs( mOptions );
00092 *this << "--" << args;
00093 }
00094 }
00095
00096 void Kleo::SymCryptRunProcessBase::slotReceivedStdout( KProcess * proc, char * buf, int len ) {
00097 Q_ASSERT( proc == this );
00098 const int oldsize = mOutput.size();
00099 mOutput.resize( oldsize + len );
00100 memcpy( mOutput.data() + oldsize, buf, len );
00101 }
00102
00103 void Kleo::SymCryptRunProcessBase::slotReceivedStderr( KProcess * proc, char * buf, int len ) {
00104 Q_ASSERT( proc == this );
00105 if ( len > 0 )
00106 mStderr += QString::fromLocal8Bit( buf, len );
00107 }
00108
00109 #include "symcryptrunprocessbase.moc"