From 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kmail/kmservertest.cpp | 189 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 kmail/kmservertest.cpp (limited to 'kmail/kmservertest.cpp') diff --git a/kmail/kmservertest.cpp b/kmail/kmservertest.cpp new file mode 100644 index 000000000..49fb0ad8b --- /dev/null +++ b/kmail/kmservertest.cpp @@ -0,0 +1,189 @@ +/* -*- c++ -*- + kmservertest.cpp + + This file is part of KMail, the KDE mail client. + Copyright (c) 2001-2002 Michael Haeckel + Copyright (c) 2003 Marc Mutz + + 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 Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), 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 + Qt. 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 + +#include "kmservertest.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//----------------------------------------------------------------------------- +KMServerTest::KMServerTest( const QString & protocol, const QString & host, int port ) + : QObject(), + mProtocol( protocol ), mHost( host ), + mSSL( false ), mJob( 0 ), mSlave( 0 ), mConnectionErrorCount( 0 ) +{ + KIO::Scheduler::connect( + SIGNAL(slaveError(KIO::Slave *, int, const QString &)), + this, SLOT(slotSlaveResult(KIO::Slave *, int, const QString &))); + + if ( port == 993 || port == 995 || port == 465 ) + port = 0; + + startOffSlave( port ); +} + +//----------------------------------------------------------------------------- +KMServerTest::~KMServerTest() +{ + if (mJob) mJob->kill(TRUE); +} + + +KIO::MetaData KMServerTest::slaveConfig() const { + KIO::MetaData md; + md.insert( "nologin", "on" ); + return md; +} + +void KMServerTest::startOffSlave( int port ) { + KURL url; + url.setProtocol( mSSL ? mProtocol + 's' : mProtocol ); + url.setHost( mHost ); + if ( port ) + url.setPort( port ); + + mSlave = KIO::Scheduler::getConnectedSlave( url, slaveConfig() ); + if ( !mSlave ) { + slotSlaveResult( 0, 1 ); + return; + } + connect( mSlave, SIGNAL(metaData(const KIO::MetaData&)), + SLOT(slotMetaData(const KIO::MetaData&)) ); + + QByteArray packedArgs; + QDataStream stream( packedArgs, IO_WriteOnly ); + + stream << (int) 'c'; + + mJob = KIO::special( url, packedArgs, false ); + KIO::Scheduler::assignJobToSlave( mSlave, mJob ); + connect( mJob, SIGNAL(result(KIO::Job*)), SLOT(slotResult(KIO::Job*)) ); + connect( mJob, SIGNAL(infoMessage(KIO::Job*,const QString&)), + SLOT(slotData(KIO::Job*,const QString&)) ); +} + + +//----------------------------------------------------------------------------- +void KMServerTest::slotData(KIO::Job *, const QString &data) +{ + if ( mSSL ) + mListSSL = QStringList::split(' ', data); + else + mListNormal = QStringList::split(' ', data); +} + + +void KMServerTest::slotMetaData( const KIO::MetaData & md ) { + KIO::MetaData::const_iterator it = md.find( "PLAIN AUTH METHODS" ); + if ( it != md.end() ) { + mAuthNone = it.data(); + kdDebug(5006) << "mAuthNone: " << mAuthNone << endl; + } + it = md.find( "TLS AUTH METHODS" ); + if ( it != md.end() ) { + mAuthTLS = it.data(); + kdDebug(5006) << "mAuthTLS: " << mAuthTLS << endl; + } + it = md.find( "SSL AUTH METHODS" ); + if ( it != md.end() ) { + mAuthSSL = it.data(); + kdDebug(5006) << "mAuthSSL: " << mAuthSSL << endl; + } +} + +//----------------------------------------------------------------------------- +void KMServerTest::slotResult(KIO::Job *job) +{ + slotSlaveResult(mSlave, job->error()); +} + +//----------------------------------------------------------------------------- +void KMServerTest::slotSlaveResult(KIO::Slave *aSlave, int error, + const QString &errorText) +{ + if (aSlave != mSlave) return; + if ( mSSL && error == 0 ) { + // add a dummy entry to the list of SSL capabilities so that the receiver + // of the capabilities signal can use mListSSL.isEmpty() in order to find + // out whether SSL is supported + mListSSL.append("SSL"); + } + + if (error != KIO::ERR_SLAVE_DIED && mSlave) + { + // disconnect slave after every connect + KIO::Scheduler::disconnectSlave(mSlave); + mSlave = 0; + } + if ( error == KIO::ERR_COULD_NOT_CONNECT ) + { + // if one of the two connection tests fails we ignore the error + // if both fail the host is probably not correct so we display the error + if ( mConnectionErrorCount == 0 ) + { + error = 0; + } + ++mConnectionErrorCount; + } + if ( error ) + { + mJob = 0; + KMessageBox::error( kapp->activeWindow(), + KIO::buildErrorString( error, errorText ), + i18n("Error") ); + emit capabilities( mListNormal, mListSSL ); + emit capabilities( mListNormal, mListSSL, mAuthNone, mAuthSSL, mAuthTLS ); + return; + } + if (!mSSL) { + mSSL = true; + mListNormal.append("NORMAL-CONNECTION"); + startOffSlave(); + } else { + mJob = 0; + + emit capabilities( mListNormal, mListSSL ); + emit capabilities( mListNormal, mListSSL, mAuthNone, mAuthSSL, mAuthTLS ); + } +} + + +#include "kmservertest.moc" -- cgit v1.2.1