summaryrefslogtreecommitdiffstats
path: root/kmail/objecttreeparser_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmail/objecttreeparser_p.cpp')
-rw-r--r--kmail/objecttreeparser_p.cpp350
1 files changed, 350 insertions, 0 deletions
diff --git a/kmail/objecttreeparser_p.cpp b/kmail/objecttreeparser_p.cpp
new file mode 100644
index 000000000..a645b3989
--- /dev/null
+++ b/kmail/objecttreeparser_p.cpp
@@ -0,0 +1,350 @@
+/* -*- mode: C++; c-file-style: "gnu" -*-
+ objecttreeparser_p.cpp
+
+ This file is part of KMail, the KDE mail client.
+ Copyright (c) 2009 Klarälvdalens Datakonsult AB
+ Authors: Marc Mutz <marc@kdab.net>
+
+ KMail is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License, version 2, as
+ published by the Free Software Foundation.
+
+ KMail is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the TQt library by Trolltech AS, Norway (or with modified versions
+ of TQt that use the same license as TQt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ TQt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include <config.h>
+
+#include "objecttreeparser_p.h"
+
+#include <kleo/decryptverifyjob.h>
+#include <kleo/verifydetachedjob.h>
+#include <kleo/verifyopaquejob.h>
+#include <kleo/keylistjob.h>
+
+#include <gpgmepp/keylistresult.h>
+
+#include <tqtimer.h>
+#include <tqstringlist.h>
+
+#include <cassert>
+
+using namespace KMail;
+using namespace Kleo;
+using namespace GpgME;
+
+CryptoBodyPartMemento::CryptoBodyPartMemento()
+ : TQObject( 0 ),
+ Interface::BodyPartMemento(),
+ ISubject(),
+ m_running( false )
+{
+
+}
+
+CryptoBodyPartMemento::~CryptoBodyPartMemento() {}
+
+void CryptoBodyPartMemento::setAuditLog( const GpgME::Error & err, const TQString & log ) {
+ m_auditLogError = err;
+ m_auditLog = log;
+}
+
+void CryptoBodyPartMemento::setRunning( bool running ) {
+ m_running = running;
+}
+
+DecryptVerifyBodyPartMemento::DecryptVerifyBodyPartMemento( DecryptVerifyJob * job, const TQByteArray & cipherText )
+ : CryptoBodyPartMemento(),
+ m_cipherText( cipherText ),
+ m_job( job )
+{
+ assert( m_job );
+}
+
+DecryptVerifyBodyPartMemento::~DecryptVerifyBodyPartMemento() {
+ if ( m_job )
+ m_job->slotCancel();
+}
+
+bool DecryptVerifyBodyPartMemento::start() {
+ assert( m_job );
+ if ( const GpgME::Error err = m_job->start( m_cipherText ) ) {
+ m_dr = DecryptionResult( err );
+ return false;
+ }
+ connect( m_job, TQT_SIGNAL(result(const GpgME::DecryptionResult&,const GpgME::VerificationResult&,const TQByteArray&)),
+ this, TQT_SLOT(slotResult(const GpgME::DecryptionResult&,const GpgME::VerificationResult&,const TQByteArray&)) );
+ setRunning( true );
+ return true;
+}
+
+void DecryptVerifyBodyPartMemento::exec() {
+ assert( m_job );
+ TQByteArray plainText;
+ setRunning( true );
+ const std::pair<DecryptionResult,VerificationResult> p = m_job->exec( m_cipherText, plainText );
+ saveResult( p.first, p.second, plainText );
+ m_job->deleteLater(); // exec'ed jobs don't delete themselves
+ m_job = 0;
+}
+
+void DecryptVerifyBodyPartMemento::saveResult( const DecryptionResult & dr,
+ const VerificationResult & vr,
+ const TQByteArray & plainText )
+{
+ assert( m_job );
+ setRunning( false );
+ m_dr = dr;
+ m_vr = vr;
+ m_plainText = plainText;
+ setAuditLog( m_job->auditLogError(), m_job->auditLogAsHtml() );
+}
+
+void DecryptVerifyBodyPartMemento::slotResult( const DecryptionResult & dr,
+ const VerificationResult & vr,
+ const TQByteArray & plainText )
+{
+ saveResult( dr, vr, plainText );
+ m_job = 0;
+ notify();
+}
+
+
+
+
+VerifyDetachedBodyPartMemento::VerifyDetachedBodyPartMemento( VerifyDetachedJob * job,
+ KeyListJob * klj,
+ const TQByteArray & signature,
+ const TQByteArray & plainText )
+ : CryptoBodyPartMemento(),
+ m_signature( signature ),
+ m_plainText( plainText ),
+ m_job( job ),
+ m_keylistjob( klj )
+{
+ assert( m_job );
+}
+
+VerifyDetachedBodyPartMemento::~VerifyDetachedBodyPartMemento() {
+ if ( m_job )
+ m_job->slotCancel();
+ if ( m_keylistjob )
+ m_keylistjob->slotCancel();
+}
+
+bool VerifyDetachedBodyPartMemento::start() {
+ assert( m_job );
+ if ( const GpgME::Error err = m_job->start( m_signature, m_plainText ) ) {
+ m_vr = VerificationResult( err );
+ return false;
+ }
+ connect( m_job, TQT_SIGNAL(result(const GpgME::VerificationResult&)),
+ this, TQT_SLOT(slotResult(const GpgME::VerificationResult&)) );
+ setRunning( true );
+ return true;
+}
+
+void VerifyDetachedBodyPartMemento::exec() {
+ assert( m_job );
+ setRunning( true );
+ saveResult( m_job->exec( m_signature, m_plainText ) );
+ m_job->deleteLater(); // exec'ed jobs don't delete themselves
+ m_job = 0;
+ if ( canStartKeyListJob() ) {
+ std::vector<GpgME::Key> keys;
+ m_keylistjob->exec( keyListPattern(), /*secretOnly=*/false, keys );
+ if ( !keys.empty() )
+ m_key = keys.back();
+ }
+ if ( m_keylistjob )
+ m_keylistjob->deleteLater(); // exec'ed jobs don't delete themselves
+ m_keylistjob = 0;
+ setRunning( false );
+}
+
+bool VerifyDetachedBodyPartMemento::canStartKeyListJob() const
+{
+ if ( !m_keylistjob )
+ return false;
+ const char * const fpr = m_vr.signature( 0 ).fingerprint();
+ return fpr && *fpr;
+}
+
+TQStringList VerifyDetachedBodyPartMemento::keyListPattern() const
+{
+ assert( canStartKeyListJob() );
+ return TQStringList( TQString::fromLatin1( m_vr.signature( 0 ).fingerprint() ) );
+}
+
+void VerifyDetachedBodyPartMemento::saveResult( const VerificationResult & vr )
+{
+ assert( m_job );
+ m_vr = vr;
+ setAuditLog( m_job->auditLogError(), m_job->auditLogAsHtml() );
+}
+
+void VerifyDetachedBodyPartMemento::slotResult( const VerificationResult & vr )
+{
+ saveResult( vr );
+ m_job = 0;
+ if ( canStartKeyListJob() && startKeyListJob() )
+ return;
+ if ( m_keylistjob )
+ m_keylistjob->deleteLater();
+ m_keylistjob = 0;
+ setRunning( false );
+ notify();
+}
+
+bool VerifyDetachedBodyPartMemento::startKeyListJob()
+{
+ assert( canStartKeyListJob() );
+ if ( const GpgME::Error err = m_keylistjob->start( keyListPattern() ) )
+ return false;
+ connect( m_keylistjob, TQT_SIGNAL(done()), this, TQT_SLOT(slotKeyListJobDone()) );
+ connect( m_keylistjob, TQT_SIGNAL(nextKey(const GpgME::Key&)),
+ this, TQT_SLOT(slotNextKey(const GpgME::Key&)) );
+ return true;
+}
+
+void VerifyDetachedBodyPartMemento::slotNextKey( const GpgME::Key & key )
+{
+ m_key = key;
+}
+
+void VerifyDetachedBodyPartMemento::slotKeyListJobDone()
+{
+ m_keylistjob = 0;
+ setRunning( false );
+ notify();
+}
+
+
+VerifyOpaqueBodyPartMemento::VerifyOpaqueBodyPartMemento( VerifyOpaqueJob * job,
+ KeyListJob * klj,
+ const TQByteArray & signature )
+ : CryptoBodyPartMemento(),
+ m_signature( signature ),
+ m_job( job ),
+ m_keylistjob( klj )
+{
+ assert( m_job );
+}
+
+VerifyOpaqueBodyPartMemento::~VerifyOpaqueBodyPartMemento() {
+ if ( m_job )
+ m_job->slotCancel();
+ if ( m_keylistjob )
+ m_keylistjob->slotCancel();
+}
+
+bool VerifyOpaqueBodyPartMemento::start() {
+ assert( m_job );
+ if ( const GpgME::Error err = m_job->start( m_signature ) ) {
+ m_vr = VerificationResult( err );
+ return false;
+ }
+ connect( m_job, TQT_SIGNAL(result(const GpgME::VerificationResult&,const TQByteArray&)),
+ this, TQT_SLOT(slotResult(const GpgME::VerificationResult&,const TQByteArray&)) );
+ setRunning( true );
+ return true;
+}
+
+void VerifyOpaqueBodyPartMemento::exec() {
+ assert( m_job );
+ setRunning( true );
+ TQByteArray plainText;
+ saveResult( m_job->exec( m_signature, plainText ), plainText );
+ m_job->deleteLater(); // exec'ed jobs don't delete themselves
+ m_job = 0;
+ if ( canStartKeyListJob() ) {
+ std::vector<GpgME::Key> keys;
+ m_keylistjob->exec( keyListPattern(), /*secretOnly=*/false, keys );
+ if ( !keys.empty() )
+ m_key = keys.back();
+ }
+ if ( m_keylistjob )
+ m_keylistjob->deleteLater(); // exec'ed jobs don't delete themselves
+ m_keylistjob = 0;
+ setRunning( false );
+}
+
+bool VerifyOpaqueBodyPartMemento::canStartKeyListJob() const
+{
+ if ( !m_keylistjob )
+ return false;
+ const char * const fpr = m_vr.signature( 0 ).fingerprint();
+ return fpr && *fpr;
+}
+
+TQStringList VerifyOpaqueBodyPartMemento::keyListPattern() const
+{
+ assert( canStartKeyListJob() );
+ return TQStringList( TQString::fromLatin1( m_vr.signature( 0 ).fingerprint() ) );
+}
+
+void VerifyOpaqueBodyPartMemento::saveResult( const VerificationResult & vr,
+ const TQByteArray & plainText )
+{
+ assert( m_job );
+ m_vr = vr;
+ m_plainText = plainText;
+ setAuditLog( m_job->auditLogError(), m_job->auditLogAsHtml() );
+}
+
+void VerifyOpaqueBodyPartMemento::slotResult( const VerificationResult & vr,
+ const TQByteArray & plainText )
+{
+ saveResult( vr, plainText );
+ m_job = 0;
+ if ( canStartKeyListJob() && startKeyListJob() )
+ return;
+ if ( m_keylistjob )
+ m_keylistjob->deleteLater();
+ m_keylistjob = 0;
+ setRunning( false );
+ notify();
+}
+
+bool VerifyOpaqueBodyPartMemento::startKeyListJob()
+{
+ assert( canStartKeyListJob() );
+ if ( const GpgME::Error err = m_keylistjob->start( keyListPattern() ) )
+ return false;
+ connect( m_keylistjob, TQT_SIGNAL(done()), this, TQT_SLOT(slotKeyListJobDone()) );
+ connect( m_keylistjob, TQT_SIGNAL(nextKey(const GpgME::Key&)),
+ this, TQT_SLOT(slotNextKey(const GpgME::Key&)) );
+ return true;
+}
+
+void VerifyOpaqueBodyPartMemento::slotNextKey( const GpgME::Key & key )
+{
+ m_key = key;
+}
+
+void VerifyOpaqueBodyPartMemento::slotKeyListJobDone()
+{
+ m_keylistjob = 0;
+ setRunning( false );
+ notify();
+}
+
+
+#include "objecttreeparser_p.moc"