diff options
author | Gareth Pethig <gareth.pethig@nokia.com> | 2009-05-15 20:38:12 +1000 |
---|---|---|
committer | Gareth Pethig <gareth.pethig@nokia.com> | 2009-05-15 20:38:12 +1000 |
commit | 1377ba7ae124fbdb4a57ca3084839b7d192f3386 (patch) | |
tree | c9cb5a19f99d043cb219844d6e554065e1938159 | |
parent | 1c9dea79bee0fca57a037858b15db7418bc7cade (diff) |
Update Changelog and Maemo patch.2009W20-0maemo1
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | debian/patches/0001-maemo_changes.diff | 4109 |
2 files changed, 4104 insertions, 11 deletions
diff --git a/debian/changelog b/debian/changelog index e4886fa3..93eb78f6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +qt4-messagingframework (2009W20-0maemo1) hardy; urgency=low + + * Pull from upstream. + + -- Gareth Pethig <gareth.pethig@nokia.com> Fri, 15 May 2009 20:35:45 +1000 + qt4-messagingframework (2009W19-0maemo2) hardy; urgency=low * Pull from upstream. diff --git a/debian/patches/0001-maemo_changes.diff b/debian/patches/0001-maemo_changes.diff index c3337f07..dbe12a70 100644 --- a/debian/patches/0001-maemo_changes.diff +++ b/debian/patches/0001-maemo_changes.diff @@ -1,8 +1,8 @@ diff --git a/qmf.pro b/qmf.pro -index cd9a51e..3415d8e 100644 +index cd9a51e..f7e97ed 100644 --- a/qmf.pro +++ b/qmf.pro -@@ -1,5 +1,6 @@ +@@ -1,10 +1,13 @@ TEMPLATE = subdirs -SUBDIRS = src/libraries/qtopiamail \ +SUBDIRS = src/libraries/sparql \ @@ -10,11 +10,18 @@ index cd9a51e..3415d8e 100644 src/libraries/messageserver \ src/libraries/qmfutil \ src/plugins/messageservices/imap \ + src/plugins/messageservices/pop \ + src/plugins/messageservices/smtp \ ++ src/plugins/messageservices/dummysink \ ++ src/plugins/messageservices/dummysource \ + src/plugins/messageservices/qtopiamailfile \ + src/plugins/contentmanagers/qtopiamailfile \ + src/plugins/viewers/generic \ diff --git a/src/applications/qtmail/qtmail.pro b/src/applications/qtmail/qtmail.pro -index 74c79bc..65be577 100644 +index 74c79bc..2ec5e71 100644 --- a/src/applications/qtmail/qtmail.pro +++ b/src/applications/qtmail/qtmail.pro -@@ -11,7 +11,11 @@ INCLUDEPATH += . ../../libraries/qtopiamail \ +@@ -11,7 +11,18 @@ INCLUDEPATH += . ../../libraries/qtopiamail \ ../../libraries/qmfutil LIBS += -L../../libraries/qtopiamail -lqtopiamail \ @@ -22,8 +29,15 @@ index 74c79bc..65be577 100644 + -L../../libraries/qmfutil -lqmfutil + +QMAKE_LFLAGS += -Wl,-rpath,../../libraries/qtopiamail \ -+ -Wl,-rpath,../../libraries/qmfutil \ -+ -Wl,-rpath,../../libraries/sparql ++ -Wl,-rpath,../../libraries/qmfutil ++ ++sparql { ++ ++LIBS += -L../../libraries/sparql -lsparql ++ ++QMAKE_LFLAGS += -Wl,-rpath,../../libraries/sparql ++ ++} HEADERS += foldermodel.h \ folderdelegate.h \ @@ -595,7 +609,7 @@ index 0000000..cfbd6ca @@ -0,0 +1 @@ +#include "qmailserviceaction.h" diff --git a/src/libraries/qtopiamail/qmailstore.cpp b/src/libraries/qtopiamail/qmailstore.cpp -index bc5fecc..992cafc 100644 +index d0a8cdb..300f5bd 100644 --- a/src/libraries/qtopiamail/qmailstore.cpp +++ b/src/libraries/qtopiamail/qmailstore.cpp @@ -11,7 +11,12 @@ @@ -611,6 +625,59 @@ index bc5fecc..992cafc 100644 /*! \class QMailStore +diff --git a/src/libraries/qtopiamail/qmailstore_p.cpp b/src/libraries/qtopiamail/qmailstore_p.cpp +index 016f218..62eb13f 100644 +--- a/src/libraries/qtopiamail/qmailstore_p.cpp ++++ b/src/libraries/qtopiamail/qmailstore_p.cpp +@@ -1941,6 +1941,7 @@ int QMailStorePrivate::pathIdentifier(const QString &filePath) + + int QMailStorePrivate::databaseIdentifier(int n) const + { ++ qMailLog(Messaging) << "Database name:" << database.databaseName(); + int result = static_cast<int>(::ftok(database.databaseName().toAscii(), n)); + if (result == -1) + qFatal("Could not create database semaphore. Database could not be found."); +@@ -1960,12 +1961,17 @@ QMailStorePrivate::QMailStorePrivate(QMailStore* parent) + lastQueryError(0), + mutex(0) + { +- ProcessMutex creationMutex(pathIdentifier(QDir::rootPath())); ++ ProcessMutex creationMutex(pathIdentifier(QDir::homePath())); + MutexGuard guard(creationMutex); + if (guard.lock(1000)) { ++ qMailLog(Messaging) << "Successfully lock mutex at:" << QDir::homePath(); ++ + //open the database + database = QMail::createDatabase(); ++ } else { ++ qMailLog(Messaging) << "Failed to lock the mutex:" << QDir::homePath(); + } ++ + mutex = new ProcessMutex(databaseIdentifier(1)); + readLock = new ProcessReadLock(databaseIdentifier(2)); + if (contentMutex == 0) { +@@ -1996,7 +2002,7 @@ ProcessMutex& QMailStorePrivate::contentManagerMutex(void) + + bool QMailStorePrivate::initStore() + { +- ProcessMutex creationMutex(pathIdentifier(QDir::rootPath())); ++ ProcessMutex creationMutex(pathIdentifier(QDir::homePath())); + MutexGuard guard(creationMutex); + if (!guard.lock(1000)) { + return false; +diff --git a/src/libraries/qtopiamail/qmailstore_p.h b/src/libraries/qtopiamail/qmailstore_p.h +index 4b011d7..c9c1071 100644 +--- a/src/libraries/qtopiamail/qmailstore_p.h ++++ b/src/libraries/qtopiamail/qmailstore_p.h +@@ -26,7 +26,7 @@ + #include <QSqlDatabase> + #include <QCache> + +-//#define QMAILSTORE_LOG_SQL //define to enable SQL query logging ++#define QMAILSTORE_LOG_SQL //define to enable SQL query logging + //#define QMAILSTORE_USE_RTTI //define if RTTI is available to assist debugging + + #ifdef QMAILSTORE_USE_RTTI diff --git a/src/libraries/qtopiamail/qmailstore_sparql.cpp b/src/libraries/qtopiamail/qmailstore_sparql.cpp new file mode 100644 index 0000000..132f0a7 @@ -4408,7 +4475,7 @@ index 0000000..fe05e08 + +#endif diff --git a/src/libraries/qtopiamail/qtopiamail.pro b/src/libraries/qtopiamail/qtopiamail.pro -index c715160..7d28130 100644 +index c715160..069f2cd 100644 --- a/src/libraries/qtopiamail/qtopiamail.pro +++ b/src/libraries/qtopiamail/qtopiamail.pro @@ -1,17 +1,35 @@ @@ -4423,7 +4490,7 @@ index c715160..7d28130 100644 QT *= sql network -CONFIG += warn_on -+CONFIG += warn_on create_pc create_prl sparql ++CONFIG += warn_on create_pc create_prl INCLUDEPATH += support @@ -4527,10 +4594,18 @@ index 9d61887..81373e8 100644 #endif //QMAILLOG_H diff --git a/src/libraries/qtopiamail/support/qmailnamespace.cpp b/src/libraries/qtopiamail/support/qmailnamespace.cpp -index d63acdf..ce4b0a7 100644 +index d63acdf..8bad4af 100644 --- a/src/libraries/qtopiamail/support/qmailnamespace.cpp +++ b/src/libraries/qtopiamail/support/qmailnamespace.cpp -@@ -178,9 +178,9 @@ QString QMail::pluginsPath() +@@ -130,6 +130,7 @@ int QMail::fileLock(const QString& lockFile) + int fdlock = -1; + + QString path = QDir::tempPath() + "/" + lockFile; ++ qMailLog(Messaging) << "File Lock Path:" << path; + if((fdlock = ::open(path.toLatin1(), O_WRONLY|O_CREAT, 0666)) == -1) + return -1; + +@@ -178,9 +179,9 @@ QString QMail::pluginsPath() { static QString pluginsEnv(getenv(QMF_PLUGINS_ENV)); if(!pluginsEnv.isEmpty()) @@ -4543,6 +4618,23 @@ index d63acdf..ce4b0a7 100644 } QString QMail::sslCertsPath() +@@ -194,11 +195,16 @@ QSqlDatabase QMail::createDatabase() + QSqlDatabase db; + if(!init) + { ++ Q_ASSERT(QSqlDatabase::isDriverAvailable("QSQLITE")); ++ + db = QSqlDatabase::addDatabase("QSQLITE"); + QDir dp(dataPath()); + if(!dp.exists()) + if(!dp.mkpath(dataPath())) + qCritical() << "Cannot create data path"; ++ ++ qMailLog(Messaging) << "Set database name:" << dataPath() + "/qmailstore.db"; ++ + db.setDatabaseName(dataPath() + "/qmailstore.db"); + if(!db.open()) + qCritical() << "Cannot open database"; diff --git a/src/libraries/sparql/include/SparqlDatabase b/src/libraries/sparql/include/SparqlDatabase new file mode 100644 index 0000000..ac92cb7 @@ -5473,6 +5565,4001 @@ index 0000000..233fc64 + + </interface> +</node> +diff --git a/src/plugins/messageservices/dummysink/dummysink.pro b/src/plugins/messageservices/dummysink/dummysink.pro +new file mode 100644 +index 0000000..8fcfd89 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysink.pro +@@ -0,0 +1,31 @@ ++TEMPLATE = lib ++ ++TARGET = dummysink ++ ++target.path = $$QMF_INSTALL_ROOT/plugins/messageservices ++INSTALLS += target ++ ++QT += network ++ ++DEPENDPATH += . ++ ++INCLUDEPATH += . ../../../libraries/qtopiamail \ ++ ../../../libraries/messageserver \ ++ ../../../libraries/qtopiamail/support ++ ++LIBS += -L../../../libraries/qtopiamail -lqtopiamail \ ++ -L../../../libraries/messageserver -lmessageserver ++ ++HEADERS += dummysinkauthenticator.h \ ++ dummysinkclient.h \ ++ dummysinkconfiguration.h \ ++ dummysinkservice.h \ ++ dummysinksettings.h ++ ++FORMS += dummysinksettings.ui ++ ++SOURCES += dummysinkauthenticator.cpp \ ++ dummysinkclient.cpp \ ++ dummysinkconfiguration.cpp \ ++ dummysinkservice.cpp \ ++ dummysinksettings.cpp +diff --git a/src/plugins/messageservices/dummysink/dummysinkauthenticator.cpp b/src/plugins/messageservices/dummysink/dummysinkauthenticator.cpp +new file mode 100644 +index 0000000..7af18a1 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkauthenticator.cpp +@@ -0,0 +1,68 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummysinkauthenticator.h" ++#include "dummysinkconfiguration.h" ++#include <qmailauthenticator.h> ++ ++ ++namespace { ++ ++QMap<QMailAccountId, QList<QByteArray> > gResponses; ++ ++} ++ ++QByteArray DummySinkAuthenticator::getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities) ++{ ++ QByteArray result(QMailAuthenticator::getAuthentication(svcCfg, capabilities)); ++ if (!result.isEmpty()) ++ return result; ++ ++#ifndef QT_NO_OPENSSL ++ DummySinkConfiguration dummyCfg(svcCfg); ++ if (dummyCfg.dummyAuthentication() != DummySinkConfiguration::Auth_NONE) { ++ QMailAccountId id(dummyCfg.id()); ++ QByteArray username(dummyCfg.dummyUsername().toAscii()); ++ QByteArray password(dummyCfg.dummyPassword().toAscii()); ++ ++ if (dummyCfg.dummyAuthentication() == DummySinkConfiguration::Auth_LOGIN) { ++ result = QByteArray("LOGIN"); ++ gResponses[id] = (QList<QByteArray>() << username << password); ++ } else if (dummyCfg.dummyAuthentication() == DummySinkConfiguration::Auth_PLAIN) { ++ result = QByteArray("PLAIN"); ++ gResponses[id] = (QList<QByteArray>() << QByteArray(username + '\0' + username + '\0' + password)); ++ } ++ } ++#endif ++ ++ if (!result.isEmpty()) { ++ result.prepend("AUTH "); ++ } ++ return result; ++} ++ ++QByteArray DummySinkAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge) ++{ ++ QByteArray result; ++ ++ QMap<QMailAccountId, QList<QByteArray> >::iterator it = gResponses.find(svcCfg.id()); ++ if (it != gResponses.end()) { ++ QList<QByteArray> &responses = it.value(); ++ result = responses.takeFirst(); ++ ++ if (responses.isEmpty()) ++ gResponses.erase(it); ++ } else { ++ result = QMailAuthenticator::getResponse(svcCfg, challenge); ++ } ++ ++ return result; ++} ++ +diff --git a/src/plugins/messageservices/dummysink/dummysinkauthenticator.h b/src/plugins/messageservices/dummysink/dummysinkauthenticator.h +new file mode 100644 +index 0000000..6ea3f51 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkauthenticator.h +@@ -0,0 +1,27 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMY_SINK_AUTHENTICATOR_H ++#define DUMMY_SINK_AUTHENTICATOR_H ++ ++#include <qmailaccountconfiguration.h> ++ ++#include <QByteArray> ++#include <QStringList> ++ ++class DummySinkAuthenticator ++{ ++public: ++ static QByteArray getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities); ++ static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge); ++}; ++ ++#endif ++ +diff --git a/src/plugins/messageservices/dummysink/dummysinkclient.cpp b/src/plugins/messageservices/dummysink/dummysinkclient.cpp +new file mode 100644 +index 0000000..232ef60 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkclient.cpp +@@ -0,0 +1,348 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummysinkclient.h" ++#include "dummysinkservice.h" ++#include "dummysinkauthenticator.h" ++#include "dummysinkconfiguration.h" ++ ++#include <QHostAddress> ++#include <QTextCodec> ++#include <qmaillog.h> ++#include <qmailaddress.h> ++#include <qmailstore.h> ++#include <qmailtransport.h> ++#include <qmaillog.h> ++ ++ ++DummySinkClient::DummySinkClient(QObject* parent) ++ : QObject(parent), ++ ConnectionActive(false), ++ transport(NULL), ++ progressSendSize(0), ++ totalSendSize(0) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::DummySinkClient(QObject* parent) called" << flush; ++ ++ domainName = "groovemail.com"; ++} ++ ++DummySinkClient::~DummySinkClient() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::~DummySinkClient(QObject* parent) called" << flush; ++ delete transport; ++} ++ ++QMailMessage::MessageType DummySinkClient::messageType() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::messageType() called" << flush; ++ ++ return QMailMessage::Email; ++} ++ ++void DummySinkClient::setAccount(const QMailAccountId &id) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::setAccount(const QMailAccountId &id) called" << flush; ++ ++ // Load the current configuration for this account ++ config = QMailAccountConfiguration(id); ++} ++ ++QMailAccountId DummySinkClient::account() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::account() called" << flush; ++ ++ return config.id(); ++} ++ ++void DummySinkClient::newConnection() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::newConnection() called" << flush; ++ ++ if (!transport) ++ { ++ // Set up the transport ++ transport = new QMailTransport("DUMMYSINK"); ++ ++ connect(transport, SIGNAL(readyRead()), ++ this, SLOT(readyRead())); ++ connect(transport, SIGNAL(connected(QMailTransport::EncryptType)), ++ this, SLOT(connected(QMailTransport::EncryptType))); ++ connect(transport, SIGNAL(bytesWritten(qint64)), ++ this, SLOT(sent(qint64))); ++ connect(transport, SIGNAL(updateStatus(QString)), ++ this, SIGNAL(updateStatus(QString))); ++ connect(transport, SIGNAL(errorOccurred(int,QString)), ++ this, SLOT(transportError(int,QString))); ++ ++ qMailLog(DUMMYSINK) << "DummySinkClient::newConnection() transport connected" << flush; ++ } ++ ++ // Set size attributes. ++ progressSendSize = 0; ++ ++ emit connected(QMailTransport::Encrypt_NONE); ++ ++ //DummySinkConfiguration dummyCfg(config); ++ //transport->open(dummyCfg.dummyServer(), dummyCfg.dummyPort(), static_cast<QMailTransport::EncryptType>(dummyCfg.dummyEncryption())); ++} ++ ++QMailServiceAction::Status::ErrorCode DummySinkClient::addMail(const QMailMessage& mail) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::addMail() called" << flush; ++ ++ QStringList sendTo; ++ foreach (const QMailAddress& address, mail.recipients()) { ++ // Only send to mail addresses ++ if (address.isEmailAddress()) ++ sendTo.append(address.address()); ++ } ++ if (sendTo.isEmpty()) { ++ qMailLog(DUMMYSINK) << "Cannot send message with empty recipient address!"; ++ return QMailServiceAction::Status::ErrInvalidAddress; ++ } ++ ++ // Set required mail parameters and add mail to send list. ++ RawEmail rawmail; ++ rawmail.from = "<" + mail.from().address() + ">"; ++ rawmail.to = sendTo; ++ rawmail.mail = mail; ++ rawmail.mail.setContentSize(mail.body().data().length()); ++ rawmail.mail.setSize(mail.body().data().length()); ++ rawmail.mail.setStatus(QMailMessage::Incoming, true); ++ rawmail.mail.setStatus(QMailMessage::New, true); ++ rawmail.mail.setReceivedDate(QMailTimeStamp::currentDateTime()); ++ rawmail.mail.setParentFolderId(QMailFolderId(QMailFolder::InboxFolder)); ++ rawmail.mail.setStatus(QMailMessage::ContentAvailable, 1); ++ rawmail.mail.setStatus(QMailMessage::PartialContentAvailable, 1); ++ rawmail.mail.setParentAccountId(config.id()); ++ ++ mailList.append(rawmail); ++ sendSize.insert(rawmail.mail.id(), rawmail.mail.indicativeSize()); ++ ++ // Add messages size to total messages size to be sent. ++ totalSendSize += rawmail.mail.body().data().length(); ++ ++ // Logging the data that is being sent to the store/network. ++ { ++ qMailLog(DUMMYSINK) << "To: " << flush; ++ } ++ ++ if (!QMailStore::instance()->addMessage(&rawmail.mail)) ++ { ++ qWarning() << "Unable to add message after transmission:" << rawmail.mail.id(); ++ } ++ ++ messageProcessed(mail.id()); ++ ++ return QMailServiceAction::Status::ErrNoError; ++} ++ ++void DummySinkClient::connected(QMailTransport::EncryptType encryptType) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::connected() called" << flush; ++ ++ DummySinkConfiguration dummyCfg(config); ++ if (dummyCfg.dummyEncryption() == encryptType) { ++ qMailLog(DUMMYSINK) << "Connected" << flush; ++ emit updateStatus(tr("Connected")); ++ } ++ ++ // Set connection is active. ++ ConnectionActive = true; ++ ++ emit readyRead(); ++} ++ ++void DummySinkClient::transportError(int errorCode, QString msg) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::transportError(int errorCode, QString msg) called" << flush; ++ ++ operationFailed(errorCode, msg); ++} ++ ++void DummySinkClient::sent(qint64 size) ++{ ++ Q_UNUSED(size); ++ qMailLog(DUMMYSINK) << "DummySinkClient::sent(qint64 size) called" << flush; ++} ++ ++void DummySinkClient::readyRead() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::senreadyReadt() called" << flush; ++ ++ incomingData(); ++} ++ ++void DummySinkClient::sendCommand(const char *data, int len) ++{ ++ Q_UNUSED(data); ++ Q_UNUSED(len); ++ qMailLog(DUMMYSINK) << "DummySinkClient::sendCommand(const char *data, int len) called" << flush; ++} ++ ++void DummySinkClient::sendCommand(const QString &cmd) ++{ ++ Q_UNUSED(cmd); ++ qMailLog(DUMMYSINK) << "DummySinkClient::sendCommand(const QString &cmd) called" << flush; ++} ++ ++void DummySinkClient::sendCommand(const QByteArray &cmd) ++{ ++ Q_UNUSED(cmd); ++ qMailLog(DUMMYSINK) << "DummySinkClient::sendCommand(const QByteArray &cmd) called" << flush; ++} ++ ++void DummySinkClient::incomingData() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::incomingData() called" << flush; ++ ++ nextAction("send mail"); ++} ++ ++void DummySinkClient::nextAction(const QString &response) ++{ ++ Q_UNUSED(response); ++ ++ qMailLog(DUMMYSINK) << "DummySinkClient::incomingData(nextAction(const QString &response) called" << flush; ++ ++ for(mailItr = mailList.begin(); mailItr != mailList.end(); mailItr++) ++ { ++ QMailMessageId msgId(mailItr->mail.id()); ++ ++ // Create new mail to add into store. ++ QMailMessage NewMail(mailItr->mail.serverUid(), mailItr->mail.parentAccountId()); ++ NewMail.setBody(QMailMessageBody::fromData(mailItr->mail.body().data(), mailItr->mail.contentType(), mailItr->mail.transferEncoding())); ++ NewMail.setMessageType(mailItr->mail.messageType()); ++ NewMail.setTo(mailItr->mail.to()); ++ NewMail.setSubject(mailItr->mail.subject()); ++ NewMail.setParentAccountId(mailItr->mail.parentAccountId()); ++ ++ // Print mail contents for debug information. ++ qMailLog(DUMMYSINK) << "******************************************" << flush; ++ qMailLog(DUMMYSINK) << "* Mail information being sent to network *" << flush; ++ qMailLog(DUMMYSINK) << "******************************************" << flush; ++ qMailLog(DUMMYSINK) << ""; ++ qMailLog(DUMMYSINK) << "Message Type: " << NewMail.messageType() << flush; ++ qMailLog(DUMMYSINK) << "Content Type: " << (NewMail.contentType()).type() \ ++ << "Sub Type: " << (NewMail.contentType()).subType() \ ++ << "Charset: " << (NewMail.contentType()).charset() << flush; ++ qMailLog(DUMMYSINK) << "Encoding: " << NewMail.transferEncoding() << flush; ++ qMailLog(DUMMYSINK) << "Size: " << (NewMail.body()).data().length() << flush; ++ qMailLog(DUMMYSINK) << "Sending account: "<< NewMail.parentAccountId() << flush; ++ ++ qMailLog(DUMMYSINK) << "Sending to: " << flush; ++ foreach(const QMailAddress& Addr, NewMail.recipients()) ++ if (Addr.isEmailAddress()) ++ qMailLog(DUMMYSINK) << " " << Addr.address() << flush; ++ ++ qMailLog(DUMMYSINK) << ""; ++ qMailLog(DUMMYSINK) << "Subject: " << NewMail.subject() << flush; ++ qMailLog(DUMMYSINK) << "Body: " << (NewMail.body()).data() << flush; ++ qMailLog(DUMMYSINK) << "*******************END********************" << flush; ++ ++ // Set the message's message ID ++ NewMail.setHeaderField("Message-ID", "dummyMailHeader"); ++ ++ // Set mail size. ++ NewMail.setContentSize(NewMail.body().data().length()); ++ NewMail.setSize(NewMail.contentSize()); ++ NewMail.setPreviousParentFolderId(QMailFolderId(0)); ++ ++ if (!QMailStore::instance()->addMessage(&NewMail)) ++ { ++ qWarning() << "Unable to update message after transmission:" << msgId; ++ } ++ ++ ++ progressSendSize += (mailItr->mail.body()).data().length(); ++ mailItr->mail.setStatus(Sent, true); ++ mailItr->mail.setParentFolderId(QMailFolderId(QMailFolder::SentFolder)); ++ NewMail.setPreviousParentFolderId(QMailFolderId(QMailFolder::OutboxFolder)); ++ ++ emit sent(progressSendSize); ++ ++ if (!QMailStore::instance()->updateMessage(&mailItr->mail)) ++ { ++ qWarning() << "Unable to update message after transmission:" << msgId; ++ } ++ ++ emit messageTransmitted(msgId); ++ messageProcessed(msgId); ++ sendingId = QMailMessageId(); ++ } ++ ++ mailList.clear(); ++ emit sendCompleted(); ++ deactivateConnection(); ++} ++ ++void DummySinkClient::cancelTransfer() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::cancelTransfer() called" << flush; ++ ++ operationFailed(QMailServiceAction::Status::ErrCancel, tr("Cancelled by user")); ++} ++ ++void DummySinkClient::messageProcessed(const QMailMessageId &id) ++{ ++ Q_UNUSED(id); ++ ++ qMailLog(DUMMYSINK) << "DummySinkClient::messageProcessed(const QMailMessageId &id) called" << flush; ++ ++ emit progressChanged(progressSendSize, totalSendSize); ++} ++ ++void DummySinkClient::operationFailed(int code, const QString &text) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::operationFailed(int code, const QString &text) called" << flush; ++ ++ if (ConnectionActive) ++ { ++ transport->close(); ++ qMailLog(DUMMYSINK) << "Connection closed:" << text << flush; ++ ++ mailList.clear(); ++ } ++ ++ deactivateConnection(); ++ emit errorOccurred(code, text); ++} ++ ++void DummySinkClient::operationFailed(QMailServiceAction::Status::ErrorCode code, const QString &text) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkClient::operationFailed(QMailServiceAction::Status::ErrorCode code, const QString &text) called" << flush; ++ mailList.clear(); ++ ++ QString msg; ++ if (code == QMailServiceAction::Status::ErrUnknownResponse) { ++ if (config.id().isValid()) { ++ DummySinkConfiguration dummyCfg(config); ++ msg = dummyCfg.dummyServer() + ": "; ++ } ++ } ++ msg.append(text); ++ ++ deactivateConnection(); ++ emit errorOccurred(code, msg); ++} ++ ++void DummySinkClient::deactivateConnection() ++{ ++ qMailLog(DUMMYSINK) << "****************DummySinkClient::deactivateConnection() called" << flush; ++ ++ // Close connection. ++ if(transport && transport->connected()) ++ transport->close(); ++ ++ // Set connection is free. ++ ConnectionActive = false; ++ emit sendCompleted(); ++} +diff --git a/src/plugins/messageservices/dummysink/dummysinkclient.h b/src/plugins/messageservices/dummysink/dummysinkclient.h +new file mode 100644 +index 0000000..772e51c +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkclient.h +@@ -0,0 +1,102 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMY_SINK_CLIENT_H ++#define DUMMY_SINK_CLIENT_H ++ ++#include <qstring.h> ++#include <qobject.h> ++#include <qstringlist.h> ++#include <qlist.h> ++#include <qmailaccountconfiguration.h> ++#include <qmailmessage.h> ++#include <qmailmessageserver.h> ++#include <qmailtransport.h> ++ ++struct RawEmail ++{ ++ QString from; ++ QStringList to; ++ QMailMessage mail; ++}; ++ ++class DummySinkClient : public QObject ++{ ++ Q_OBJECT ++ ++public: ++ DummySinkClient(QObject* parent); ++ ~DummySinkClient(); ++ ++ QMailMessage::MessageType messageType() const; ++ ++ void setAccount(const QMailAccountId &accountId); ++ QMailAccountId account() const; ++ ++ void newConnection(); ++ void cancelTransfer(); ++ ++ QMailServiceAction::Status::ErrorCode addMail(const QMailMessage& mail); ++ ++signals: ++ void errorOccurred(int, const QString &); ++ void errorOccurred(QMailServiceAction::Status::ErrorCode, const QString &); ++ void updateStatus(const QString &); ++ ++ void progressChanged(uint, uint); ++ void messageTransmitted(const QMailMessageId&); ++ void sendCompleted(); ++ ++protected slots: ++ void connected(QMailTransport::EncryptType encryptType); ++ void transportError(int, QString msg); ++ void readyRead(); ++ void sent(qint64); ++ ++private: ++ void deactivateConnection(); ++ void sendCommand(const char *data, int len = -1); ++ void sendCommand(const QString &cmd); ++ void sendCommand(const QByteArray &cmd); ++ void incomingData(); ++ void nextAction(const QString &response); ++ void messageProcessed(const QMailMessageId &id); ++ ++ void operationFailed(int code, const QString &text); ++ void operationFailed(QMailServiceAction::Status::ErrorCode code, const QString &text); ++ ++private: ++ enum TransferStatus ++ { ++ Init, Helo, Extension, StartTLS, TLS, Connected, Auth, ++ From, Recv, MRcv, Data, Body, Sent, Done ++ }; ++ ++ QMailAccountConfiguration config; ++ TransferStatus status; ++ QList<RawEmail> mailList; ++ QList<RawEmail>::Iterator mailItr; ++ QMailMessageId sendingId; ++ bool ConnectionActive; ++ ++ QStringList::Iterator it; ++ QMailTransport *transport; ++ ++ // SendMap maps id -> (units) to be sent ++ typedef QMap<QMailMessageId, uint> SendMap; ++ SendMap sendSize; ++ uint progressSendSize; ++ uint totalSendSize; ++ ++ quint32 addressComponent; ++ QByteArray domainName; ++}; ++ ++#endif +diff --git a/src/plugins/messageservices/dummysink/dummysinkconfiguration.cpp b/src/plugins/messageservices/dummysink/dummysinkconfiguration.cpp +new file mode 100644 +index 0000000..96a6a73 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkconfiguration.cpp +@@ -0,0 +1,125 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummysinkconfiguration.h" ++ ++ ++DummySinkConfiguration::DummySinkConfiguration(const QMailAccountConfiguration &config) ++ : QMailServiceConfiguration(config, "dummysink") ++{ ++} ++ ++DummySinkConfiguration::DummySinkConfiguration(const QMailAccountConfiguration::ServiceConfiguration &svcCfg) ++ : QMailServiceConfiguration(svcCfg) ++{ ++} ++ ++QString DummySinkConfiguration::userName() const ++{ ++ return value("username"); ++} ++ ++QString DummySinkConfiguration::emailAddress() const ++{ ++ return value("address"); ++} ++ ++QString DummySinkConfiguration::dummyServer() const ++{ ++ return value("server"); ++} ++ ++int DummySinkConfiguration::dummyPort() const ++{ ++ return value("port", "25").toInt(); ++} ++ ++#ifndef QT_NO_OPENSSL ++ ++QString DummySinkConfiguration::dummyUsername() const ++{ ++ return value("dummyusername"); ++} ++ ++QString DummySinkConfiguration::dummyPassword() const ++{ ++ return decodeValue(value("dummypassword")); ++} ++ ++#endif ++ ++int DummySinkConfiguration::dummyAuthentication() const ++{ ++ return value("authentication", "0").toInt(); ++} ++ ++int DummySinkConfiguration::dummyEncryption() const ++{ ++ return value("encryption", "0").toInt(); ++} ++ ++ ++DummySinkConfigurationEditor::DummySinkConfigurationEditor(QMailAccountConfiguration *config) ++ : DummySinkConfiguration(*config) ++{ ++} ++ ++void DummySinkConfigurationEditor::setUserName(const QString& str) ++{ ++ setValue("username",str); ++} ++ ++void DummySinkConfigurationEditor::setEmailAddress(const QString &str) ++{ ++ setValue("address", str); ++} ++ ++void DummySinkConfigurationEditor::setDummySinkServer(const QString &str) ++{ ++ setValue("server", str); ++} ++ ++void DummySinkConfigurationEditor::setDummySinkPort(int i) ++{ ++ setValue("port", QString::number(i)); ++} ++ ++#ifndef QT_NO_OPENSSL ++ ++void DummySinkConfigurationEditor::setDummySinkUsername(const QString& str) ++{ ++ setValue("dummyusername", str); ++} ++ ++void DummySinkConfigurationEditor::setDummySinkPassword(const QString& str) ++{ ++ setValue("dummypassword", encodeValue(str)); ++} ++ ++#endif ++ ++#ifndef QT_NO_OPENSSL ++ ++void DummySinkConfigurationEditor::setDummySinkAuthentication(int t) ++{ ++ setValue("authentication", QString::number(t)); ++} ++ ++#endif ++ ++#ifndef QT_NO_OPENSSL ++ ++void DummySinkConfigurationEditor::setDummySinkEncryption(int t) ++{ ++ setValue("encryption", QString::number(t)); ++} ++ ++#endif ++ +diff --git a/src/plugins/messageservices/dummysink/dummysinkconfiguration.h b/src/plugins/messageservices/dummysink/dummysinkconfiguration.h +new file mode 100644 +index 0000000..0264830 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkconfiguration.h +@@ -0,0 +1,75 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMY_SINK_CONFIGURATION_H ++#define DUMMY_SINK_CONFIGURATION_H ++ ++// ++// W A R N I N G ++// ------------- ++// ++// This file is not part of the Qt Extended API. It exists purely as an ++// implementation detail. This header file may change from version to ++// version without notice, or even be removed. ++// ++// We mean it. ++// ++ ++#include <qmailserviceconfiguration.h> ++ ++class QTOPIAMAIL_EXPORT DummySinkConfiguration : public QMailServiceConfiguration ++{ ++public: ++ enum AuthType { ++ Auth_NONE = 0, ++#ifndef QT_NO_OPENSSL ++ Auth_LOGIN = 1, ++ Auth_PLAIN = 2, ++#endif ++ Auth_INCOMING = 3 ++ }; ++ ++ explicit DummySinkConfiguration(const QMailAccountConfiguration &config); ++ explicit DummySinkConfiguration(const QMailAccountConfiguration::ServiceConfiguration &svcCfg); ++ ++ QString userName() const; ++ QString emailAddress() const; ++ QString dummyServer() const; ++ int dummyPort() const; ++#ifndef QT_NO_OPENSSL ++ QString dummyUsername() const; ++ QString dummyPassword() const; ++#endif ++ int dummyAuthentication() const; ++ int dummyEncryption() const; ++}; ++ ++class QTOPIAMAIL_EXPORT DummySinkConfigurationEditor : public DummySinkConfiguration ++{ ++public: ++ explicit DummySinkConfigurationEditor(QMailAccountConfiguration *config); ++ ++ void setUserName(const QString &str); ++ void setEmailAddress(const QString &str); ++ void setDummySinkServer(const QString &str); ++ void setDummySinkPort(int i); ++#ifndef QT_NO_OPENSSL ++ void setDummySinkUsername(const QString& username); ++ void setDummySinkPassword(const QString& password); ++#endif ++#ifndef QT_NO_OPENSSL ++ void setDummySinkAuthentication(int t); ++#endif ++#ifndef QT_NO_OPENSSL ++ void setDummySinkEncryption(int t); ++#endif ++}; ++ ++#endif +diff --git a/src/plugins/messageservices/dummysink/dummysinkservice.cpp b/src/plugins/messageservices/dummysink/dummysinkservice.cpp +new file mode 100644 +index 0000000..920bdf0 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkservice.cpp +@@ -0,0 +1,264 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummysinkservice.h" ++#include "dummysinksettings.h" ++#include <QtPlugin> ++#include <qmaillog.h> ++ ++namespace { const QString serviceKey("dummysink"); } ++ ++class DummySinkService::Sink : public QMailMessageSink ++{ ++ Q_OBJECT ++ ++public: ++ Sink(DummySinkService *service) ++ : QMailMessageSink(service), ++ _service(service) ++ { ++ connect(&_service->_client, SIGNAL(messageTransmitted(QMailMessageId)), this, SLOT(messageTransmitted(QMailMessageId))); ++ connect(&_service->_client, SIGNAL(sendCompleted()), this, SLOT(sendCompleted())); ++ } ++ ++public slots: ++ virtual bool transmitMessages(const QMailMessageIdList &ids); ++ ++ void messageTransmitted(const QMailMessageId &id); ++ void sendCompleted(); ++ ++private: ++ DummySinkService *_service; ++}; ++ ++bool DummySinkService::Sink::transmitMessages(const QMailMessageIdList &ids) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::Sink::transmitMessages() called" << flush; ++ ++ QMailServiceAction::Status::ErrorCode errorCode = QMailServiceAction::Status::ErrNoError; ++ QString errorText; ++ ++ if (ids.isEmpty()) { ++ errorCode = QMailServiceAction::Status::ErrInvalidData; ++ errorText = tr("No messages to transmit"); ++ } else { ++ foreach (const QMailMessageId id, ids) { ++ QMailMessage message(id); ++ if ((errorCode = _service->_client.addMail(message)) != QMailServiceAction::Status::ErrNoError) { ++ errorText = tr("Unable to addMail"); ++ break; ++ } ++ } ++ } ++ ++ if (errorCode == QMailServiceAction::Status::ErrNoError) { ++ _service->_client.newConnection(); ++ return true; ++ } ++ ++ _service->errorOccurred(errorCode, errorText); ++ return false; ++} ++ ++void DummySinkService::Sink::messageTransmitted(const QMailMessageId &id) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::Sink::messageTransmitted() called" << flush; ++ ++ emit messagesTransmitted(QMailMessageIdList() << id); ++} ++ ++void DummySinkService::Sink::sendCompleted() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::Sink::sendCompleted() called" << flush; ++ ++ emit _service->actionCompleted(true); ++ emit _service->activityChanged(QMailServiceAction::Successful); ++} ++ ++ ++DummySinkService::DummySinkService(const QMailAccountId &accountId) ++ : QMailMessageService(), ++ _client(this), ++ _sink(new Sink(this)) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::DummySinkService(const QMailAccountId &accountId) called" << flush; ++ ++ connect(&_client, SIGNAL(progressChanged(uint, uint)), this, SIGNAL(progressChanged(uint, uint))); ++ ++ connect(&_client, SIGNAL(errorOccurred(int, QString)), this, SLOT(errorOccurred(int, QString))); ++ connect(&_client, SIGNAL(errorOccurred(QMailServiceAction::Status::ErrorCode, QString)), this, SLOT(errorOccurred(QMailServiceAction::Status::ErrorCode, QString))); ++ connect(&_client, SIGNAL(updateStatus(QString)), this, SLOT(updateStatus(QString))); ++ ++ _client.setAccount(accountId); ++} ++ ++DummySinkService::~DummySinkService() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::~DummySinkService() called" << flush; ++ ++ delete _sink; ++} ++ ++QString DummySinkService::service() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::service() called" << flush; ++ ++ return serviceKey; ++} ++ ++QMailAccountId DummySinkService::accountId() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::accountId() called" << flush; ++ ++ return _client.account(); ++} ++ ++bool DummySinkService::hasSink() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::hasSink() called" << flush; ++ ++ return true; ++} ++ ++QMailMessageSink &DummySinkService::sink() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::sink() called" << flush; ++ qMailLog(DUMMYSINK) << "DummySinkService::sink(), _sink =" << _sink; ++ ++ return *_sink; ++} ++ ++bool DummySinkService::available() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::available() called, return true." << flush; ++ ++ return true; ++} ++ ++bool DummySinkService::cancelOperation() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::cancelOperation() called" << flush; ++ ++ _client.cancelTransfer(); ++ return true; ++} ++ ++void DummySinkService::errorOccurred(int code, const QString &text) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkService::errorOccurred(int code, const QString &text) called" << flush; ++ ++ updateStatus(code, text, _client.account()); ++ emit actionCompleted(false); ++} ++ ++void DummySinkService::errorOccurred(QMailServiceAction::Status::ErrorCode code, const QString &text) ++{ ++ updateStatus(code, text, _client.account()); ++ emit actionCompleted(false); ++} ++ ++void DummySinkService::updateStatus(const QString &text) ++{ ++ updateStatus(QMailServiceAction::Status::ErrNoError, text, _client.account()); ++} ++ ++ ++class DummySinkConfigurator : public QMailMessageServiceConfigurator ++{ ++public: ++ DummySinkConfigurator(); ++ ~DummySinkConfigurator(); ++ ++ virtual QString service() const; ++ virtual QString displayName() const; ++ ++ virtual QMailMessageServiceEditor *createEditor(QMailMessageServiceFactory::ServiceType type); ++}; ++ ++DummySinkConfigurator::DummySinkConfigurator() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkConfigurator::DummySinkConfigurator() called" << flush; ++} ++ ++DummySinkConfigurator::~DummySinkConfigurator() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkConfigurator::~DummySinkConfigurator() called" << flush; ++} ++ ++QString DummySinkConfigurator::service() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkConfigurator::service() called" << flush; ++ ++ return serviceKey; ++} ++ ++QString DummySinkConfigurator::displayName() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkConfigurator::displayName() called" << flush; ++ ++ return qApp->translate("QMailMessageService", "DummySink"); ++} ++ ++QMailMessageServiceEditor *DummySinkConfigurator::createEditor(QMailMessageServiceFactory::ServiceType type) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkConfigurator::DummySinkConfigurator::createEditor(QMailMessageServiceFactory::ServiceType type) called" << flush; ++ ++ if (type == QMailMessageServiceFactory::Sink) ++ return new DummySinkSettings; ++ ++ return 0; ++} ++ ++Q_EXPORT_PLUGIN2(dummysink,DummySinkServicePlugin) ++ ++DummySinkServicePlugin::DummySinkServicePlugin() ++ : QMailMessageServicePlugin() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkServicePlugin::DummySinkServicePlugin() called" << flush; ++} ++ ++QString DummySinkServicePlugin::key() const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkServicePlugin::key() called" << flush; ++ ++ return serviceKey; ++} ++ ++bool DummySinkServicePlugin::supports(QMailMessageServiceFactory::ServiceType type) const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkServicePlugin::supports(QMailMessageServiceFactory::ServiceType type) called" << flush; ++ ++ return (type == QMailMessageServiceFactory::Sink); ++} ++ ++bool DummySinkServicePlugin::supports(QMailMessage::MessageType type) const ++{ ++ qMailLog(DUMMYSINK) << "DummySinkServicePlugin::supports(QMailMessage::MessageType type) called" << flush; ++ ++ return (type == QMailMessage::Email); ++} ++ ++QMailMessageService *DummySinkServicePlugin::createService(const QMailAccountId &id) ++{ ++ qMailLog(DUMMYSINK) << "DummySinkServicePlugin::createService(const QMailAccountId &id) called" << flush; ++ ++ return new DummySinkService(id); ++} ++ ++QMailMessageServiceConfigurator *DummySinkServicePlugin::createServiceConfigurator() ++{ ++ qMailLog(DUMMYSINK) << "DummySinkServicePlugin::createServiceConfigurator() called" << flush; ++ ++ return new DummySinkConfigurator(); ++} ++ ++ ++#include "dummysinkservice.moc" ++ +diff --git a/src/plugins/messageservices/dummysink/dummysinkservice.h b/src/plugins/messageservices/dummysink/dummysinkservice.h +new file mode 100644 +index 0000000..d9f240f +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinkservice.h +@@ -0,0 +1,72 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMY_SINK_SERVICE_H ++#define DUMMY_SINK_SERVICE_H ++ ++#include "dummysinkclient.h" ++#include <qmailmessageservice.h> ++#include <qmaillog.h> ++ ++QLOG_ENABLE(DUMMYSINK) ++ ++class DummySinkService : public QMailMessageService ++{ ++ Q_OBJECT ++ ++public: ++ using QMailMessageService::updateStatus; ++ ++ DummySinkService(const QMailAccountId &accountId); ++ ~DummySinkService(); ++ ++ virtual QString service() const; ++ virtual QMailAccountId accountId() const; ++ ++ virtual bool hasSink() const; ++ virtual QMailMessageSink &sink() const; ++ ++ virtual bool available() const; ++ ++public slots: ++ virtual bool cancelOperation(); ++ ++protected slots: ++ void errorOccurred(int code, const QString &text); ++ void errorOccurred(QMailServiceAction::Status::ErrorCode code, const QString &text); ++ ++ void updateStatus(const QString& text); ++ ++private: ++ class Sink; ++ friend class Sink; ++ ++ DummySinkClient _client; ++ Sink *_sink; ++}; ++ ++ ++class DummySinkServicePlugin : public QMailMessageServicePlugin ++{ ++ Q_OBJECT ++ ++public: ++ DummySinkServicePlugin(); ++ ++ virtual QString key() const; ++ virtual bool supports(QMailMessageServiceFactory::ServiceType type) const; ++ virtual bool supports(QMailMessage::MessageType type) const; ++ ++ virtual QMailMessageService *createService(const QMailAccountId &id); ++ virtual QMailMessageServiceConfigurator *createServiceConfigurator(); ++}; ++ ++ ++#endif +diff --git a/src/plugins/messageservices/dummysink/dummysinksettings.cpp b/src/plugins/messageservices/dummysink/dummysinksettings.cpp +new file mode 100644 +index 0000000..9a9b449 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinksettings.cpp +@@ -0,0 +1,298 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummysinksettings.h" ++#include "dummysinkconfiguration.h" ++#include <QGridLayout> ++#include <QLineEdit> ++#include <QTextEdit> ++#include <QValidator> ++#include <qmailaccount.h> ++#include <qmailaccountconfiguration.h> ++#include <qmailtransport.h> ++#include <QDialog> ++ ++namespace { ++ ++const QString serviceKey("dummysink"); ++ ++class SigEntry : public QDialog ++{ ++ Q_OBJECT ++ ++public: ++ SigEntry(QWidget *parent, const char* name, Qt::WFlags fl = 0); ++ ++ void setEntry(QString sig); ++ QString entry() const; ++ ++private: ++ QTextEdit *input; ++}; ++ ++SigEntry::SigEntry(QWidget *parent, const char *name, Qt::WFlags fl) ++ : QDialog(parent, fl) ++{ ++ setObjectName(name); ++ setWindowTitle(tr("Signature")); ++ ++ QGridLayout *grid = new QGridLayout(this); ++ input = new QTextEdit(this); ++ grid->addWidget(input, 0, 0); ++} ++ ++void SigEntry::setEntry(QString sig) ++{ ++ input->insertPlainText(sig); ++} ++ ++QString SigEntry::entry() const ++{ ++ return input->toPlainText(); ++} ++ ++ ++class PortValidator : public QValidator ++{ ++public: ++ PortValidator(QWidget *parent = 0, const char *name = 0); ++ ++ QValidator::State validate(QString &str, int &) const; ++}; ++ ++PortValidator::PortValidator(QWidget *parent, const char *name) ++ : QValidator(parent) ++{ ++ setObjectName(name); ++} ++ ++QValidator::State PortValidator::validate(QString &str, int &) const ++{ ++ // allow empty strings, as it's a bit awkward to edit otherwise ++ if ( str.isEmpty() ) ++ return QValidator::Acceptable; ++ ++ bool ok = false; ++ int i = str.toInt(&ok); ++ if ( !ok ) ++ return QValidator::Invalid; ++ ++ if ( i <= 0 || i >= 65536 ) ++ return QValidator::Invalid; ++ ++ return QValidator::Acceptable; ++} ++ ++ ++const DummySinkConfiguration::AuthType authenticationType[] = { ++ DummySinkConfiguration::Auth_NONE, ++#ifndef QT_NO_OPENSSL ++ DummySinkConfiguration::Auth_LOGIN, ++ DummySinkConfiguration::Auth_PLAIN, ++#endif ++ DummySinkConfiguration::Auth_INCOMING ++}; ++ ++#ifndef QT_NO_OPENSSL ++int authenticationIndex(int type) ++{ ++ const int numTypes = sizeof(authenticationType)/sizeof(DummySinkConfiguration::AuthType); ++ for (int i = 0; i < numTypes; ++i) ++ if (type == authenticationType[i]) ++ return i; ++ ++ return 0; ++} ++#endif ++ ++} ++ ++ ++DummySinkSettings::DummySinkSettings() ++ : QMailMessageServiceEditor(), ++ addressModified(false) ++{ ++ setupUi(this); ++ setLayoutDirection(qApp->layoutDirection()); ++ ++ connect(setSignatureButton, SIGNAL(clicked()), this, SLOT(sigPressed())); ++ connect(authentication, SIGNAL(currentIndexChanged(int)), this, SLOT(authChanged(int))); ++ connect(emailInput, SIGNAL(textChanged(QString)), this, SLOT(emailModified())); ++ ++ const QString uncapitalised("email noautocapitalization"); ++ ++ // These fields should not be autocapitalised ++ ++ PortInput->setValidator(new PortValidator(this)); ++ ++ PasswordInput->setEchoMode(QLineEdit::PasswordEchoOnEdit); ++ ++#ifdef QT_NO_OPENSSL ++ encryption->hide(); ++ lblEncryption->hide(); ++ authentication->hide(); ++ lblAuthentication->hide(); ++ dummyUsernameInput->hide(); ++ lblDummyUsername->hide(); ++ dummyPasswordInput->hide(); ++ lblDummyPassword->hide(); ++#else ++ PasswordInput->setEchoMode(QLineEdit::PasswordEchoOnEdit); ++#endif ++} ++ ++void DummySinkSettings::sigPressed() ++{ ++ if (sigCheckBox->isChecked()) { ++ QString sigText; ++ if (signature.isEmpty()) ++ sigText = QLatin1String("~~\n") + nameInput->text(); ++ else ++ sigText = signature; ++ ++ SigEntry sigEntry(this, "sigEntry", static_cast<Qt::WFlags>(1)); ++ sigEntry.setEntry(sigText); ++ if (sigEntry.exec() == QDialog::Accepted) ++ signature = sigEntry.entry(); ++ } ++} ++ ++void DummySinkSettings::emailModified() ++{ ++ addressModified = true; ++} ++ ++void DummySinkSettings::authChanged(int index) ++{ ++#ifndef QT_NO_OPENSSL ++ DummySinkConfiguration::AuthType type = authenticationType[index]; ++ bool enableCredentials = (type == DummySinkConfiguration::Auth_LOGIN || type == DummySinkConfiguration::Auth_PLAIN); ++ ++ UsernameInput->setEnabled(enableCredentials); ++ lblUsername->setEnabled(enableCredentials); ++ PasswordInput->setEnabled(enableCredentials); ++ lblPassword->setEnabled(enableCredentials); ++ ++ if (!enableCredentials) { ++ UsernameInput->clear(); ++ PasswordInput->clear(); ++ } ++#else ++ Q_UNUSED(index); ++#endif ++} ++ ++void DummySinkSettings::displayConfiguration(const QMailAccount &account, const QMailAccountConfiguration &config) ++{ ++#ifndef QT_NO_OPENSSL ++ // Any reason to re-enable this facility? ++ //authentication->setItemText(3, tr("Incoming"); ++#endif ++ ++ if (!config.services().contains(serviceKey)) { ++ // New account ++ emailInput->setText(""); ++ ServerInput->setText(""); ++ PortInput->setText("25"); ++#ifndef QT_NO_OPENSSL ++ UsernameInput->setText(""); ++ PasswordInput->setText(""); ++ encryption->setCurrentIndex(0); ++ authentication->setCurrentIndex(0); ++ UsernameInput->setEnabled(false); ++ lblUsername->setEnabled(false); ++ PasswordInput->setEnabled(false); ++ lblPassword->setEnabled(false); ++#endif ++ signature = QString(); ++ } else { ++ DummySinkConfiguration dummyConfig(config); ++ ++ emailInput->setText(dummyConfig.emailAddress()); ++ ServerInput->setText(dummyConfig.dummyServer()); ++ PortInput->setText(QString::number(dummyConfig.dummyPort())); ++#ifndef QT_NO_OPENSSL ++ UsernameInput->setText(dummyConfig.dummyUsername()); ++ PasswordInput->setText(dummyConfig.dummyPassword()); ++ authentication->setCurrentIndex(authenticationIndex(dummyConfig.dummyAuthentication())); ++ encryption->setCurrentIndex(static_cast<int>(dummyConfig.dummyEncryption())); ++ ++ DummySinkConfiguration::AuthType type = authenticationType[authentication->currentIndex()]; ++ const bool enableCredentials(type == DummySinkConfiguration::Auth_LOGIN || type == DummySinkConfiguration::Auth_PLAIN); ++ UsernameInput->setEnabled(enableCredentials); ++ lblUsername->setEnabled(enableCredentials); ++ PasswordInput->setEnabled(enableCredentials); ++ lblPassword->setEnabled(enableCredentials); ++#endif ++ ++ defaultMailCheckBox->setChecked(account.status() & QMailAccount::PreferredSender); ++ sigCheckBox->setChecked(account.status() & QMailAccount::AppendSignature); ++ signature = account.signature(); ++ } ++} ++ ++bool DummySinkSettings::updateAccount(QMailAccount *account, QMailAccountConfiguration *config) ++{ ++ QString username(nameInput->text()); ++ QString address(emailInput->text()); ++ ++ if (!username.isEmpty() || !address.isEmpty()) { ++ account->setFromAddress(QMailAddress(username, address)); ++ } ++ ++ bool result; ++ int port = PortInput->text().toInt(&result); ++ if ( (!result) ) { ++ // should only happen when the string is empty, since we use a validator. ++ port = 25; ++ } ++ ++ if (!config->services().contains(serviceKey)) ++ config->addServiceConfiguration(serviceKey); ++ ++ DummySinkConfigurationEditor dummyConfig(config); ++ ++ dummyConfig.setVersion(100); ++ dummyConfig.setType(QMailServiceConfiguration::Sink); ++ ++ if ((!addressModified) && (address.isEmpty())) { ++ // Try to guess email address ++ QString server(dummyConfig.dummyServer()); ++ if (server.count('.')) { ++ address = username + "@" + server.mid(server.indexOf('.') + 1, server.length()); ++ } else if (server.count('.') == 1) { ++ address = username + "@" + server; ++ } ++ } ++ dummyConfig.setUserName(username); ++ dummyConfig.setEmailAddress(address); ++ dummyConfig.setDummySinkServer(ServerInput->text()); ++ dummyConfig.setDummySinkPort(port); ++#ifndef QT_NO_OPENSSL ++ dummyConfig.setDummySinkUsername(UsernameInput->text()); ++ dummyConfig.setDummySinkPassword(PasswordInput->text()); ++ dummyConfig.setDummySinkAuthentication(authenticationType[authentication->currentIndex()]); ++ dummyConfig.setDummySinkEncryption(static_cast<QMailTransport::EncryptType>(encryption->currentIndex())); ++#endif ++ ++ account->setStatus(QMailAccount::PreferredSender, defaultMailCheckBox->isChecked()); ++ account->setStatus(QMailAccount::AppendSignature, sigCheckBox->isChecked()); ++ account->setSignature(signature); ++ ++ // Do we have a configuration we can use? ++ if (!dummyConfig.dummyServer().isEmpty() && !dummyConfig.emailAddress().isEmpty()) ++ account->setStatus(QMailAccount::CanTransmit, true); ++ ++ return true; ++} ++ ++ ++#include "dummysinksettings.moc" ++ +diff --git a/src/plugins/messageservices/dummysink/dummysinksettings.h b/src/plugins/messageservices/dummysink/dummysinksettings.h +new file mode 100644 +index 0000000..702103f +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinksettings.h +@@ -0,0 +1,42 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMY_SINK_SETTINGS_H ++#define DUMMY_SINK_SETTINGS_H ++ ++#include "ui_dummysinksettings.h" ++#include <qmailmessageservice.h> ++ ++class QMailAccount; ++class QMailAccountConfiguration; ++ ++ ++class DummySinkSettings : public QMailMessageServiceEditor, private Ui::DummySinkSettings ++{ ++ Q_OBJECT ++ ++public: ++ DummySinkSettings(); ++ ++ virtual void displayConfiguration(const QMailAccount &account, const QMailAccountConfiguration &config); ++ virtual bool updateAccount(QMailAccount *account, QMailAccountConfiguration *config); ++ ++private slots: ++ void sigPressed(); ++ void emailModified(); ++ void authChanged(int index); ++ ++private: ++ bool addressModified; ++ QString signature; ++}; ++ ++#endif ++ +diff --git a/src/plugins/messageservices/dummysink/dummysinksettings.ui b/src/plugins/messageservices/dummysink/dummysinksettings.ui +new file mode 100644 +index 0000000..292ee72 +--- /dev/null ++++ b/src/plugins/messageservices/dummysink/dummysinksettings.ui +@@ -0,0 +1,357 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<ui version="4.0"> ++ <class>DummySinkSettings</class> ++ <widget class="QWidget" name="DummySinkSettings"> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>400</width> ++ <height>300</height> ++ </rect> ++ </property> ++ <property name="windowTitle"> ++ <string>Form</string> ++ </property> ++ <layout class="QVBoxLayout" name="verticalLayout"> ++ <property name="margin"> ++ <number>0</number> ++ </property> ++ <item> ++ <widget class="QScrollArea" name="scrollArea"> ++ <property name="focusPolicy"> ++ <enum>Qt::NoFocus</enum> ++ </property> ++ <property name="frameShape"> ++ <enum>QFrame::NoFrame</enum> ++ </property> ++ <property name="lineWidth"> ++ <number>0</number> ++ </property> ++ <property name="horizontalScrollBarPolicy"> ++ <enum>Qt::ScrollBarAlwaysOff</enum> ++ </property> ++ <property name="widgetResizable"> ++ <bool>true</bool> ++ </property> ++ <widget class="QWidget" name="scrollAreaWidgetContents"> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>382</width> ++ <height>330</height> ++ </rect> ++ </property> ++ <layout class="QGridLayout"> ++ <item row="0" column="0"> ++ <widget class="QLabel" name="nameLabel"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>From</string> ++ </property> ++ <property name="buddy"> ++ <cstring>nameInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="0" column="1"> ++ <widget class="QLineEdit" name="nameInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="1" column="0"> ++ <widget class="QLabel" name="emailLabel"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Email</string> ++ </property> ++ <property name="buddy"> ++ <cstring>emailInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="1" column="1"> ++ <widget class="QLineEdit" name="emailInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="2" column="0"> ++ <widget class="QLabel" name="serverLabel_2"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Server</string> ++ </property> ++ <property name="buddy"> ++ <cstring>ServerInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="2" column="1"> ++ <widget class="QLineEdit" name="ServerInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="3" column="0"> ++ <widget class="QLabel" name="portLabel_2"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Port</string> ++ </property> ++ <property name="buddy"> ++ <cstring>PortInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="3" column="1"> ++ <widget class="QLineEdit" name="PortInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="4" column="0"> ++ <widget class="QLabel" name="lblEncryption"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Encryption</string> ++ </property> ++ <property name="buddy"> ++ <cstring>encryption</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="4" column="1"> ++ <widget class="QComboBox" name="encryption"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <item> ++ <property name="text"> ++ <string>None</string> ++ </property> ++ </item> ++ <item> ++ <property name="text"> ++ <string>SSL</string> ++ </property> ++ </item> ++ <item> ++ <property name="text"> ++ <string>TLS</string> ++ </property> ++ </item> ++ </widget> ++ </item> ++ <item row="5" column="0"> ++ <widget class="QLabel" name="lblAuthentication"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Authentication</string> ++ </property> ++ <property name="buddy"> ++ <cstring>authentication</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="5" column="1"> ++ <widget class="QComboBox" name="authentication"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <item> ++ <property name="text"> ++ <string>None</string> ++ </property> ++ </item> ++ <item> ++ <property name="text"> ++ <string>Login</string> ++ </property> ++ </item> ++ <item> ++ <property name="text"> ++ <string>Plain</string> ++ </property> ++ </item> ++ </widget> ++ </item> ++ <item row="6" column="0"> ++ <widget class="QLabel" name="lblUsername"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Username</string> ++ </property> ++ <property name="buddy"> ++ <cstring>UsernameInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="6" column="1"> ++ <widget class="QLineEdit" name="UsernameInput"> ++ <property name="enabled"> ++ <bool>false</bool> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="7" column="0"> ++ <widget class="QLabel" name="lblPassword"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Password</string> ++ </property> ++ <property name="buddy"> ++ <cstring>PasswordInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="7" column="1"> ++ <widget class="QLineEdit" name="PasswordInput"> ++ <property name="enabled"> ++ <bool>false</bool> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="echoMode"> ++ <enum>QLineEdit::Password</enum> ++ </property> ++ </widget> ++ </item> ++ <item row="9" column="0"> ++ <widget class="QCheckBox" name="sigCheckBox"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Signature</string> ++ </property> ++ </widget> ++ </item> ++ <item row="9" column="1"> ++ <widget class="QToolButton" name="setSignatureButton"> ++ <property name="enabled"> ++ <bool>false</bool> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Set...</string> ++ </property> ++ </widget> ++ </item> ++ <item row="10" column="0" colspan="2"> ++ <widget class="QCheckBox" name="defaultMailCheckBox"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Default sending account</string> ++ </property> ++ </widget> ++ </item> ++ </layout> ++ </widget> ++ </widget> ++ </item> ++ </layout> ++ </widget> ++ <tabstops> ++ <tabstop>nameInput</tabstop> ++ <tabstop>emailInput</tabstop> ++ <tabstop>ServerInput</tabstop> ++ <tabstop>PortInput</tabstop> ++ <tabstop>encryption</tabstop> ++ <tabstop>authentication</tabstop> ++ <tabstop>UsernameInput</tabstop> ++ <tabstop>PasswordInput</tabstop> ++ <tabstop>sigCheckBox</tabstop> ++ <tabstop>setSignatureButton</tabstop> ++ <tabstop>defaultMailCheckBox</tabstop> ++ </tabstops> ++ <resources/> ++ <connections/> ++</ui> +diff --git a/src/plugins/messageservices/dummysource/dummyauthenticator.cpp b/src/plugins/messageservices/dummysource/dummyauthenticator.cpp +new file mode 100644 +index 0000000..4e4fb28 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyauthenticator.cpp +@@ -0,0 +1,57 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummyauthenticator.h" ++ ++#include "dummyconfiguration.h" ++ ++#include <qmailauthenticator.h> ++#include <qmailtransport.h> ++ ++ ++bool DummySourceAuthenticator::useEncryption(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities) ++{ ++#ifdef QT_NO_OPENSSL ++ return false; ++#else ++ DummySourceConfiguration dummyCfg(svcCfg); ++ bool useTLS(dummyCfg.mailEncryption() == QMailTransport::Encrypt_TLS); ++ ++ if (!capabilities.contains("STLS")) { ++ if (useTLS) { ++ qWarning() << "Server does not support TLS - continuing unencrypted"; ++ } ++ } else { ++ if (useTLS) { ++ return true; ++ } else { ++ if (!capabilities.contains("USER")) { ++ qWarning() << "Server does not support unencrypted USER - using encryption"; ++ return true; ++ } ++ } ++ } ++ ++ return QMailAuthenticator::useEncryption(svcCfg, capabilities); ++#endif ++} ++ ++QList<QByteArray> DummySourceAuthenticator::getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities) ++{ ++ QList<QByteArray> result; ++ ++ return result; ++} ++ ++QByteArray DummySourceAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge) ++{ ++ return QMailAuthenticator::getResponse(svcCfg, challenge); ++} ++ +diff --git a/src/plugins/messageservices/dummysource/dummyauthenticator.h b/src/plugins/messageservices/dummysource/dummyauthenticator.h +new file mode 100644 +index 0000000..f3ff1f9 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyauthenticator.h +@@ -0,0 +1,28 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMYAUTHENTICATOR_H ++#define DUMMYAUTHENTICATOR_H ++ ++#include <qmailaccountconfiguration.h> ++ ++#include <QByteArray> ++#include <QStringList> ++ ++class DummySourceAuthenticator ++{ ++public: ++ static bool useEncryption(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities); ++ static QList<QByteArray> getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities); ++ static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge); ++}; ++ ++#endif ++ +diff --git a/src/plugins/messageservices/dummysource/dummyclient.cpp b/src/plugins/messageservices/dummysource/dummyclient.cpp +new file mode 100644 +index 0000000..783e322 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyclient.cpp +@@ -0,0 +1,446 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummyclient.h" ++#include "dummyservice.h" ++#include "dummyauthenticator.h" ++#include "dummyconfiguration.h" ++ ++#include <longstream_p.h> ++#include <longstring_p.h> ++#include <qmailstore.h> ++#include <qmailtransport.h> ++#include <qmaillog.h> ++ ++#include <limits.h> ++ ++DummySourceClient::DummySourceClient(QObject* parent) ++ : QObject(parent), ++ ConnectionActive(false), ++ transport(NULL), ++ timer(NULL) ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::DummySourceClient(QObject* parent) called" << flush; ++ ++ // If timer is not created, create for the first time. ++ int timerInterval = 7; ++ if(!timer) ++ { ++ // Create timer and set interval to timerInterval seconds. ++ timer = new QTimer(this); ++ timer->setInterval(timerInterval * 1000); ++ ++ // Connect the slot to call when interval elapses. ++ connect(timer, SIGNAL(timeout()), SLOT(incomingData())); ++ } ++} ++ ++DummySourceClient::~DummySourceClient() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::~DummySourceClient(QObject* parent) called" << flush; ++ ++ // Free allocated memory. ++ delete timer; ++ delete transport; ++} ++ ++QMailMessage::MessageType DummySourceClient::messageType() const ++{ ++ return QMailMessage::Email; ++} ++ ++void DummySourceClient::newConnection() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::newConnection() called" << flush; ++ ++ // Check if a connection is already open. ++ if(ConnectionActive) ++ { ++ qMailLog(DUMMYSOURCE) << "Connection is busy, please try later." << flush; ++ operationFailed(QMailServiceAction::Status::ErrConnectionInUse, "Connection is busy"); ++ return; ++ } ++ ++ // Initliaze data members. ++ serverSize.clear(); ++ ++ // Re-load the configuration for this account ++ config = QMailAccountConfiguration(config.id()); ++ ++ DummySourceConfiguration dummyCfg(config); ++ if ( dummyCfg.mailServer().isEmpty() ) ++ { ++ retrieveOperationCompleted(); ++ return; ++ } ++ ++ if (!transport) ++ { ++ // Set up the transport ++ transport = new QMailTransport("DUMMYSOURCE"); ++ ++ connect(transport, SIGNAL(updateStatus(QString)), this, SIGNAL(updateStatus(QString))); ++ connect(transport, SIGNAL(connected(QMailTransport::EncryptType)), this, SLOT(connected(QMailTransport::EncryptType))); ++ connect(transport, SIGNAL(errorOccurred(int,QString)), this, SLOT(transportError(int,QString))); ++ connect(transport, SIGNAL(readyRead()), this, SLOT(incomingData())); ++ } ++ ++ // transport->open(dummyCfg.mailServer(), dummyCfg.mailPort(), static_cast<QMailTransport::EncryptType>(dummyCfg.mailEncryption())); ++ emit connected(QMailTransport::Encrypt_NONE); ++} ++ ++void DummySourceClient::setAccount(const QMailAccountId &id) ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::setAccount() called" << flush; ++ ++ if ((transport && transport->inUse()) && (id != config.id())) { ++ QString msg("Cannot open account; transport in use"); ++ emit errorOccurred(QMailServiceAction::Status::ErrConnectionInUse, msg); ++ return; ++ } ++ ++ config = QMailAccountConfiguration(id); ++} ++ ++QMailAccountId DummySourceClient::account() const ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::account() called" << flush; ++ ++ return config.id(); ++} ++ ++void DummySourceClient::setOperation(QMailRetrievalAction::RetrievalSpecification spec) ++{ ++ Q_UNUSED(spec); ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::setOperation() called" << flush; ++} ++ ++void DummySourceClient::setDeleteOperation() ++{ ++} ++ ++void DummySourceClient::setSelectedMails(const SelectionMap& data) ++{ ++ Q_UNUSED(data); ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::setSelectedMails() called" << flush; ++} ++ ++void DummySourceClient::connected(QMailTransport::EncryptType encryptType) ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::connected() called" << flush; ++ ++ DummySourceConfiguration dummyCfg(config); ++ if (dummyCfg.mailEncryption() == encryptType) { ++ qMailLog(DUMMYSOURCE) << "Connected" << flush; ++ emit updateStatus(tr("Connected")); ++ } ++ ++ // Set connection is busy. ++ ConnectionActive = true; ++ ++ // If timer not active, start timer. ++ if(timer && !timer->isActive()) ++ { ++ timer->start(); ++ ++ // Update request status. ++ emit updateStatus(tr("Logging in")); ++ } ++} ++ ++void DummySourceClient::transportError(int status, QString msg) ++{ ++ operationFailed(status, msg); ++} ++ ++void DummySourceClient::closeConnection() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::closeConnection() called" << flush; ++ ++ if(transport && transport->connected()) ++ transport->close(); ++} ++ ++void DummySourceClient::sendCommand(const char *data, int len) ++{ ++ Q_UNUSED(data); ++ Q_UNUSED(len); ++} ++ ++void DummySourceClient::sendCommand(const QString& cmd) ++{ ++ Q_UNUSED(cmd); ++} ++ ++void DummySourceClient::sendCommand(const QByteArray& cmd) ++{ ++ Q_UNUSED(cmd); ++} ++ ++QString DummySourceClient::readResponse() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::readResponse() called" << flush; ++ ++ QString response = transport->readLine(); ++ ++ if (response.length() > 1) { ++ qMailLog(DUMMYSOURCE) << "RECV:" << qPrintable(response.left(response.length() - 2)); ++ } ++ ++ return response; ++} ++ ++void DummySourceClient::incomingData() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::incomingData() called" << flush; ++ ++ int MaxMsgs = 7; ++ static int mailCount = 1; ++ ++ // Call action to be taken. ++ nextAction(); ++ ++ // Resets the service request expiry timer. ++ emit progressChanged(mailCount, MaxMsgs); ++ ++ if(mailCount >= MaxMsgs) ++ { ++ qMailLog(DUMMYSOURCE) << " Sent " << MaxMsgs << "messages, now clearing timer." << flush; ++ ++ mailCount = 1; ++ timer->stop(); ++ emit updateStatus(tr("Logging out")); ++ ++ retrieveOperationCompleted(); ++ ++ return; ++ } ++ ++ mailCount++; ++} ++ ++void DummySourceClient::processResponse(const QString &response) ++{ ++ Q_UNUSED(response); ++ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::processResponse() called" << flush; ++} ++ ++void DummySourceClient::nextAction() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::nextAction() called" << flush; ++ ++ createMail(); ++} ++ ++int DummySourceClient::msgPosFromUidl(QString uidl) ++{ ++ Q_UNUSED(uidl); ++ return 0; ++} ++ ++int DummySourceClient::nextMsgServerPos() ++{ ++ return 0; ++} ++ ++// get the reported server size from stored list ++uint DummySourceClient::getSize(int pos) ++{ ++ QMap<int, uint>::const_iterator it = serverSize.find(pos); ++ if (it != serverSize.end()) ++ return it.value(); ++ ++ return -1; ++} ++ ++void DummySourceClient::uidlIntegrityCheck() ++{ ++} ++ ++namespace { ++ ++bool hasAttachments(const QMailMessagePartContainer &partContainer) ++{ ++ for (uint i = 0; i < partContainer.partCount(); ++i) { ++ const QMailMessagePart &part(partContainer.partAt(i)); ++ ++ QMailMessageContentDisposition disposition(part.contentDisposition()); ++ if (!disposition.isNull() && (disposition.type() == QMailMessageContentDisposition::Attachment)) { ++ return true; ++ } else if (part.multipartType() != QMailMessage::MultipartNone) { ++ if (hasAttachments(part)) ++ return true; ++ } ++ } ++ return false; ++} ++ ++} ++ ++void DummySourceClient::createMail() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::createMail() called" << flush; ++ ++ // Create mail message instance. ++ QMailMessage mail; ++ ++ // Set basic mail parameters. ++ mail.setMessageType( QMailMessage::Email ); ++ mail.setServerUid("DummyMsgUid"); ++ mail.setStatus(QMailMessage::New, true); ++ mail.setStatus(QMailMessage::Incoming, true); ++ mail.setParentFolderId(QMailFolderId(QMailFolder::InboxFolder)); ++ mail.setDate(QMailTimeStamp::currentDateTime()); ++ mail.setReceivedDate(QMailTimeStamp::currentDateTime()); ++ mail.setParentAccountId(config.id()); ++ ++ // Set mail recipient address. ++ QMailAddress To("Happu User", "HappyUser@Happy.com"); ++ mail.setTo(To); ++ ++ // Set mail sender address. ++ QMailAddress From("GrooveMail Dummy Spammer", "Spammer@groovemail.com"); ++ mail.setFrom(From); ++ ++ // Set mail subject text. ++ QString Subject("["); ++ Subject.append(QMailTimeStamp::currentDateTime().toString()); ++ Subject.append("]"); ++ Subject.append(" Greetings from our moden spam bot."); ++ mail.setSubject(Subject); ++ ++ // Set mail mime header type. ++ mail.setMultipartType(QMailMessagePartContainer::MultipartMixed); ++ ++ // Set mail content type and compose mail body text. ++ QMailMessageContentType Bodytype("text/plain; charset=UTF-8"); ++ QString MsgTxt("This message has been generated by ["); ++ MsgTxt.append(QMailTimeStamp::currentDateTime().toString()); ++ MsgTxt.append("]."); ++ ++ // Add mail body text to first mime part and add to mail. ++ QMailMessagePart bodyPart; ++ QMailMessageBody MsgBody = QMailMessageBody::fromData(MsgTxt.toUtf8(), Bodytype, QMailMessageBody::EightBit); ++ bodyPart.setBody(MsgBody); ++ mail.appendPart(bodyPart); ++ qMailLog(DUMMYSOURCE) << " MsgBody = " << bodyPart.body().data() << flush; ++ ++ // Now add a image attachment to mail. ++ QString fileName = "penguin.jpg"; ++ QMailMessageContentDisposition disposition( QMailMessageContentDisposition::Attachment ); ++ disposition.setFilename(fileName.toLatin1()); ++ ++ QMailMessageContentType attachmentType("image/jpg"); ++ ++ QMailMessagePart attachmentPart; ++ attachmentPart = QMailMessagePart::fromFile("/home/suman/ScratchBoxProjects/messagingframework/penguin.jpg", disposition, attachmentType, QMailMessageBody::Base64, QMailMessageBody::RequiresEncoding); ++ mail.appendPart(attachmentPart); ++ qMailLog(DUMMYSOURCE) << " attachmentPart = " << attachmentPart.body().data() << flush; ++ ++ // Set mail contents availability parameters. ++ bool isComplete = 1; ++ mail.setStatus(QMailMessage::ContentAvailable, isComplete); ++ mail.setStatus(QMailMessage::PartialContentAvailable, isComplete); ++ mail.setContentSize(attachmentPart.body().length()+bodyPart.body().length()); ++ ++ // Calculate mail size. ++ mail.setSize(mail.contentSize()); ++ ++ // Classify mail content type for multipart existance based on contents. ++ classifier.classifyMessage(mail); ++ ++ // Add mail message to store to simulate incoming mail. ++ QMailStore::instance()->addMessage(&mail); ++ ++ if (isComplete && !mail.serverUid().isEmpty()) ++ { ++ // We have now retrieved the entire message ++ messageProcessed(mail.serverUid()); ++ } ++} ++ ++void DummySourceClient::checkForNewMessages() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::checkForNewMessages() called" << flush; ++ ++ // We can't have new messages without contacting the server ++ emit allMessagesReceived(); ++} ++ ++void DummySourceClient::cancelTransfer() ++{ ++ operationFailed(QMailServiceAction::Status::ErrCancel, tr("Cancelled by user")); ++} ++ ++void DummySourceClient::retrieveOperationCompleted() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::retrieveOperationCompleted() called" << flush; ++ ++ // This retrieval may have been asynchronous ++ emit allMessagesReceived(); ++ ++ // Or it may have been requested by a waiting client ++ emit retrievalCompleted(); ++ ++ deactivateConnection(); ++} ++ ++void DummySourceClient::deactivateConnection() ++{ ++ qMailLog(DUMMYSOURCE) << "DummySourceClient::deactivateConnection() called" << flush; ++ ++ // Shutdown timer if active. ++ if(timer && timer->isActive()) ++ timer->stop(); ++ ++ // Close connection. ++ if(transport && transport->connected()) ++ transport->close(); ++ ++ // Set connection is free. ++ ConnectionActive = false; ++} ++ ++void DummySourceClient::connectionInactive() ++{ ++ deactivateConnection(); ++} ++ ++void DummySourceClient::messageProcessed(const QString &uid) ++{ ++ emit messageActionCompleted(uid); ++} ++ ++void DummySourceClient::operationFailed(int code, const QString &text) ++{ ++ if (transport && transport->inUse()) { ++ transport->close(); ++ } ++ ++ deactivateConnection(); ++ ++ emit errorOccurred(code, text); ++} ++ ++void DummySourceClient::operationFailed(QMailServiceAction::Status::ErrorCode code, const QString &text) ++{ ++ QString msg; ++ if (code == QMailServiceAction::Status::ErrUnknownResponse) { ++ if (config.id().isValid()) { ++ DummySourceConfiguration dummyCfg(config); ++ msg = dummyCfg.mailServer() + ": "; ++ } ++ } ++ msg.append(text); ++ ++ deactivateConnection(); ++ emit errorOccurred(code, msg); ++} +diff --git a/src/plugins/messageservices/dummysource/dummyclient.h b/src/plugins/messageservices/dummysource/dummyclient.h +new file mode 100644 +index 0000000..70c44e8 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyclient.h +@@ -0,0 +1,115 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMY_SOURCE_CLIENT_H ++#define DUMMY_SOURCE_CLIENT_H ++ ++#include <qstring.h> ++#include <qstringlist.h> ++#include <qobject.h> ++#include <qlist.h> ++#include <qtimer.h> ++#include <qmailaccountconfiguration.h> ++#include <qmailmessage.h> ++#include <qmailmessageclassifier.h> ++#include <qmailmessageserver.h> ++#include <qmailtransport.h> ++ ++class LongStream; ++class QMailTransport; ++class QMailAccount; ++ ++typedef QMap<QString, QMailMessageId> SelectionMap; ++ ++class DummySourceClient : public QObject ++{ ++ Q_OBJECT ++ ++public: ++ DummySourceClient(QObject* parent); ++ ~DummySourceClient(); ++ ++ QMailMessage::MessageType messageType() const; ++ ++ void setAccount(const QMailAccountId &accountId); ++ QMailAccountId account() const; ++ ++ void newConnection(); ++ void closeConnection(); ++ void setOperation(QMailRetrievalAction::RetrievalSpecification spec); ++ void setDeleteOperation(); ++ void setSelectedMails(const SelectionMap& data); ++ void checkForNewMessages(); ++ void cancelTransfer(); ++ ++signals: ++ void errorOccurred(int, const QString &); ++ void errorOccurred(QMailServiceAction::Status::ErrorCode, const QString &); ++ void updateStatus(const QString &); ++ ++ void messageActionCompleted(const QString &uid); ++ ++ void progressChanged(uint, uint); ++ void retrievalCompleted(); ++ void allMessagesReceived(); ++ ++protected slots: ++ void connected(QMailTransport::EncryptType encryptType); ++ void transportError(int, QString msg); ++ ++ void connectionInactive(); ++ void incomingData(); ++ ++private: ++ void deactivateConnection(); ++ int nextMsgServerPos(); ++ int msgPosFromUidl(QString uidl); ++ uint getSize(int pos); ++ void uidlIntegrityCheck(); ++ void createMail(); ++ void sendCommand(const char *data, int len = -1); ++ void sendCommand(const QString& cmd); ++ void sendCommand(const QByteArray& cmd); ++ QString readResponse(); ++ void processResponse(const QString &response); ++ void nextAction(); ++ void retrieveOperationCompleted(); ++ void messageProcessed(const QString &uid); ++ ++ void operationFailed(int code, const QString &text); ++ void operationFailed(QMailServiceAction::Status::ErrorCode code, const QString &text); ++ ++ bool ConnectionActive; ++ ++private: ++ enum TransferStatus ++ { ++ Init, CapabilityTest, Capabilities, ++ StartTLS, TLS, Connected, Auth, ++ RequestUids, Uidl, UidList, ++ RequestSizes, List, SizeList, ++ RequestMessage, Retr, MessageData, ++ DeleteMessage, Dele, ++ Done, Quit, Exit ++ }; ++ ++ QMailAccountConfiguration config; ++ ++ QMap<int, uint> serverSize; ++ ++ QMailTransport *transport; ++ ++ QMailMessageClassifier classifier; ++ ++ // Added for simulating mail retrieving. ++ QTimer *timer; ++}; ++ ++#endif +diff --git a/src/plugins/messageservices/dummysource/dummyconfiguration.cpp b/src/plugins/messageservices/dummysource/dummyconfiguration.cpp +new file mode 100644 +index 0000000..625ddd0 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyconfiguration.cpp +@@ -0,0 +1,133 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummyconfiguration.h" ++ ++ ++DummySourceConfiguration::DummySourceConfiguration(const QMailAccountConfiguration &config) ++ : QMailServiceConfiguration(config, "dummysource") ++{ ++} ++ ++DummySourceConfiguration::DummySourceConfiguration(const QMailAccountConfiguration::ServiceConfiguration &svcCfg) ++ : QMailServiceConfiguration(svcCfg) ++{ ++} ++ ++QString DummySourceConfiguration::mailUserName() const ++{ ++ return value("username"); ++} ++ ++QString DummySourceConfiguration::mailPassword() const ++{ ++ return decodeValue(value("password")); ++} ++ ++QString DummySourceConfiguration::mailServer() const ++{ ++ return value("server"); ++} ++ ++int DummySourceConfiguration::mailPort() const ++{ ++ return value("port", "143").toInt(); ++} ++ ++int DummySourceConfiguration::mailEncryption() const ++{ ++ return value("encryption", "0").toInt(); ++} ++ ++bool DummySourceConfiguration::canDeleteMail() const ++{ ++ return (value("canDelete", "0").toInt() != 0); ++} ++ ++bool DummySourceConfiguration::isAutoDownload() const ++{ ++ return (value("autoDownload", "0").toInt() != 0); ++} ++ ++int DummySourceConfiguration::maxMailSize() const ++{ ++ return value("maxSize", "102400").toInt(); ++} ++ ++int DummySourceConfiguration::checkInterval() const ++{ ++ return value("checkInterval", "-1").toInt(); ++} ++ ++bool DummySourceConfiguration::intervalCheckRoamingEnabled() const ++{ ++ return (value("intervalCheckRoamingEnabled", "0").toInt() != 0); ++} ++ ++ ++DummySourceConfigurationEditor::DummySourceConfigurationEditor(QMailAccountConfiguration *config) ++ : DummySourceConfiguration(*config) ++{ ++} ++ ++void DummySourceConfigurationEditor::setMailUserName(const QString &str) ++{ ++ setValue("username", str); ++} ++ ++void DummySourceConfigurationEditor::setMailPassword(const QString &str) ++{ ++ setValue("password", encodeValue(str)); ++} ++ ++void DummySourceConfigurationEditor::setMailServer(const QString &str) ++{ ++ setValue("server", str); ++} ++ ++void DummySourceConfigurationEditor::setMailPort(int i) ++{ ++ setValue("port", QString::number(i)); ++} ++ ++#ifndef QT_NO_OPENSSL ++ ++void DummySourceConfigurationEditor::setMailEncryption(int t) ++{ ++ setValue("encryption", QString::number(t)); ++} ++ ++#endif ++ ++void DummySourceConfigurationEditor::setDeleteMail(bool b) ++{ ++ setValue("canDelete", QString::number(b ? 1 : 0)); ++} ++ ++void DummySourceConfigurationEditor::setAutoDownload(bool b) ++{ ++ setValue("autoDownload", QString::number(b ? 1 : 0)); ++} ++ ++void DummySourceConfigurationEditor::setMaxMailSize(int i) ++{ ++ setValue("maxSize", QString::number(i)); ++} ++ ++void DummySourceConfigurationEditor::setCheckInterval(int i) ++{ ++ setValue("checkInterval", QString::number(i)); ++} ++ ++void DummySourceConfigurationEditor::setIntervalCheckRoamingEnabled(bool b) ++{ ++ setValue("intervalCheckRoamingEnabled", QString::number(b ? 1 : 0)); ++} ++ +diff --git a/src/plugins/messageservices/dummysource/dummyconfiguration.h b/src/plugins/messageservices/dummysource/dummyconfiguration.h +new file mode 100644 +index 0000000..a75466c +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyconfiguration.h +@@ -0,0 +1,70 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMYCONFIGURATION_H ++#define DUMMYCONFIGURATION_H ++ ++// ++// W A R N I N G ++// ------------- ++// ++// This file is not part of the Qt Extended API. It exists purely as an ++// implementation detail. This header file may change from version to ++// version without notice, or even be removed. ++// ++// We mean it. ++// ++ ++#include <qmailserviceconfiguration.h> ++ ++class QTOPIAMAIL_EXPORT DummySourceConfiguration : public QMailServiceConfiguration ++{ ++public: ++ explicit DummySourceConfiguration(const QMailAccountConfiguration &config); ++ explicit DummySourceConfiguration(const QMailAccountConfiguration::ServiceConfiguration &svcCfg); ++ ++ QString mailUserName() const; ++ QString mailPassword() const; ++ QString mailServer() const; ++ int mailPort() const; ++ int mailEncryption() const; ++ ++ bool canDeleteMail() const; ++ ++ bool isAutoDownload() const; ++ int maxMailSize() const; ++ ++ int checkInterval() const; ++ bool intervalCheckRoamingEnabled() const; ++}; ++ ++class QTOPIAMAIL_EXPORT DummySourceConfigurationEditor : public DummySourceConfiguration ++{ ++public: ++ explicit DummySourceConfigurationEditor(QMailAccountConfiguration *config); ++ ++ void setMailUserName(const QString &str); ++ void setMailPassword(const QString &str); ++ void setMailServer(const QString &str); ++ void setMailPort(int i); ++#ifndef QT_NO_OPENSSL ++ void setMailEncryption(int t); ++#endif ++ ++ void setDeleteMail(bool b); ++ ++ void setAutoDownload(bool autodl); ++ void setMaxMailSize(int i); ++ ++ void setCheckInterval(int i); ++ void setIntervalCheckRoamingEnabled(bool enabled); ++}; ++ ++#endif +diff --git a/src/plugins/messageservices/dummysource/dummyservice.cpp b/src/plugins/messageservices/dummysource/dummyservice.cpp +new file mode 100644 +index 0000000..f1a3e40 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyservice.cpp +@@ -0,0 +1,452 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummyservice.h" ++#include "dummyconfiguration.h" ++#include "dummysettings.h" ++#include <QTimer> ++#include <QtPlugin> ++ ++#include <qmaillog.h> ++ ++namespace { const QString serviceKey("dummysource"); } ++ ++class DummySourceService::Source : public QMailMessageSource ++{ ++ Q_OBJECT ++ ++public: ++ Source(DummySourceService *service) ++ : QMailMessageSource(service), ++ _service(service), ++ _deleting(false), ++ _unavailable(false), ++ _mailCheckQueued(false), ++ _queuedMailCheckInProgress(false) ++ { ++ connect(&_service->_client, SIGNAL(allMessagesReceived()), this, SIGNAL(newMessagesAvailable())); ++ connect(&_service->_client, SIGNAL(messageActionCompleted(QString)), this, SLOT(messageActionCompleted(QString))); ++ connect(&_service->_client, SIGNAL(retrievalCompleted()), this, SLOT(retrievalCompleted())); ++ connect(&_intervalTimer, SIGNAL(timeout()), this, SLOT(queueMailCheck())); ++ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source called"; ++ } ++ ++ void setIntervalTimer(int interval) ++ { ++ _intervalTimer.stop(); ++ if (interval > 0) ++ _intervalTimer.start(interval*1000*60); // interval minutes ++ } ++ ++ virtual QMailStore::MessageRemovalOption messageRemovalOption() const { return QMailStore::CreateRemovalRecord; } ++ ++public slots: ++ virtual bool retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending); ++ virtual bool retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort); ++ ++ virtual bool retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec); ++ ++ virtual bool retrieveAll(const QMailAccountId &accountId); ++ virtual bool exportUpdates(const QMailAccountId &accountId); ++ ++ virtual bool synchronize(const QMailAccountId &accountId); ++ ++ virtual bool deleteMessages(const QMailMessageIdList &ids); ++ ++ void messageActionCompleted(const QString &uid); ++ void retrievalCompleted(); ++ void retrievalTerminated(); ++ void queueMailCheck(); ++ ++private: ++ DummySourceService *_service; ++ bool _deleting; ++ bool _unavailable; ++ bool _mailCheckQueued; ++ bool _queuedMailCheckInProgress; ++ QTimer _intervalTimer; ++}; ++ ++bool DummySourceService::Source::retrieveFolderList(const QMailAccountId &accountId, const QMailFolderId &folderId, bool descending) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::retrieveFolderList() called"; ++ ++ if (!accountId.isValid()) { ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No account specified")); ++ return false; ++ } ++ ++ if (folderId.isValid()) { ++ // Folders don't make sense for POP ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No account specified")); ++ return false; ++ } ++ ++ // Just report success ++ QTimer::singleShot(0, this, SLOT(retrievalCompleted())); ++ return true; ++ ++ Q_UNUSED(descending) ++} ++ ++bool DummySourceService::Source::retrieveMessageList(const QMailAccountId &accountId, const QMailFolderId &folderId, uint minimum, const QMailMessageSortKey &sort) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::retrieveMessageList() called"; ++ ++ if (!accountId.isValid()) { ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No account specified")); ++ return false; ++ } ++ ++ if (folderId.isValid()) { ++ // Folders don't make sense for POP ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No account specified")); ++ return false; ++ } ++ ++ _service->_client.setOperation(QMailRetrievalAction::MetaData); ++ _service->_client.newConnection(); ++ _unavailable = true; ++ return true; ++ ++ Q_UNUSED(minimum) ++ Q_UNUSED(sort) ++} ++ ++bool DummySourceService::Source::retrieveMessages(const QMailMessageIdList &messageIds, QMailRetrievalAction::RetrievalSpecification spec) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::retrieveMessages() called"; ++ ++ if (messageIds.isEmpty()) { ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No messages to retrieve")); ++ return false; ++ } ++ ++ if (spec == QMailRetrievalAction::Flags) { ++ // Just report success ++ QTimer::singleShot(0, this, SLOT(retrievalCompleted())); ++ return true; ++ } ++ ++ SelectionMap selectionMap; ++ foreach (const QMailMessageId& id, messageIds) { ++ QMailMessageMetaData message(id); ++ selectionMap.insert(message.serverUid(), id); ++ } ++ ++ _service->_client.setOperation(spec); ++ _service->_client.setSelectedMails(selectionMap); ++ _service->_client.newConnection(); ++ _unavailable = true; ++ return true; ++} ++ ++bool DummySourceService::Source::retrieveAll(const QMailAccountId &accountId) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::retrieveAll() called"; ++ ++ if (!accountId.isValid()) { ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No account specified")); ++ return false; ++ } ++ ++ _service->_client.setOperation(QMailRetrievalAction::MetaData); ++ _service->_client.newConnection(); ++ _unavailable = true; ++ return true; ++} ++ ++bool DummySourceService::Source::exportUpdates(const QMailAccountId &accountId) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::exportUpdates() called"; ++ ++ if (!accountId.isValid()) { ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No account specified")); ++ return false; ++ } ++ ++ // Just report success ++ QTimer::singleShot(0, this, SLOT(retrievalCompleted())); ++ return true; ++} ++ ++bool DummySourceService::Source::synchronize(const QMailAccountId &accountId) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::synchronize() called"; ++ ++ return retrieveAll(accountId); ++} ++ ++bool DummySourceService::Source::deleteMessages(const QMailMessageIdList &messageIds) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::deleteMessages() called"; ++ ++ if (messageIds.isEmpty()) { ++ _service->errorOccurred(QMailServiceAction::Status::ErrInvalidData, tr("No messages to delete")); ++ return false; ++ } ++ ++ QMailAccountConfiguration accountCfg(_service->accountId()); ++ DummySourceConfiguration dummyCfg(accountCfg); ++ if (dummyCfg.canDeleteMail()) { ++ // Delete the messages from the server ++ SelectionMap selectionMap; ++ foreach (const QMailMessageId& id, messageIds) { ++ QMailMessageMetaData message(id); ++ selectionMap.insert(message.serverUid(), id); ++ } ++ ++ _deleting = true; ++ _service->_client.setDeleteOperation(); ++ _service->_client.setSelectedMails(selectionMap); ++ _service->_client.newConnection(); ++ _unavailable = true; ++ return true; ++ } ++ ++ // Just delete the local copies ++ return QMailMessageSource::deleteMessages(messageIds); ++} ++ ++void DummySourceService::Source::messageActionCompleted(const QString &uid) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::messageActionCompleted() called"; ++ ++ if (_deleting) { ++ QMailMessageMetaData metaData(uid, _service->accountId()); ++ if (metaData.id().isValid()) { ++ QMailMessageIdList messageIds; ++ messageIds.append(metaData.id()); ++ ++ emit messagesDeleted(messageIds); ++ } ++ } ++} ++ ++void DummySourceService::Source::retrievalCompleted() ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::retrievalCompleted() called"; ++ ++ _unavailable = false; ++ ++ if (_queuedMailCheckInProgress) { ++ _queuedMailCheckInProgress = false; ++ emit _service->availabilityChanged(true); ++ } ++ ++ emit _service->activityChanged(QMailServiceAction::Successful); ++ emit _service->actionCompleted(true); ++ ++ _deleting = false; ++ ++ if (_mailCheckQueued) { ++ queueMailCheck(); ++ } ++} ++ ++void DummySourceService::Source::queueMailCheck() ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::queueMailCheck() called"; ++ ++ if (_unavailable) { ++ _mailCheckQueued = true; ++ return; ++ } ++ ++ _mailCheckQueued = false; ++ _queuedMailCheckInProgress = true; ++ ++ emit _service->availabilityChanged(false); ++ synchronize(_service->accountId()); ++} ++ ++void DummySourceService::Source::retrievalTerminated() ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::Source::retrievalTerminated() called"; ++ ++ _unavailable = false; ++ if (_queuedMailCheckInProgress) { ++ _queuedMailCheckInProgress = false; ++ emit _service->availabilityChanged(true); ++ } ++ ++ // Just give up if an error occurs ++ _mailCheckQueued = false; ++} ++ ++DummySourceService::DummySourceService(const QMailAccountId &accountId) ++ : QMailMessageService(), ++ _client(this), ++ _source(new Source(this)) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::DummySourceService() called"; ++ ++ connect(&_client, SIGNAL(progressChanged(uint, uint)), this, SIGNAL(progressChanged(uint, uint))); ++ ++ connect(&_client, SIGNAL(errorOccurred(int, QString)), this, SLOT(errorOccurred(int, QString))); ++ connect(&_client, SIGNAL(errorOccurred(QMailServiceAction::Status::ErrorCode, QString)), this, SLOT(errorOccurred(QMailServiceAction::Status::ErrorCode, QString))); ++ connect(&_client, SIGNAL(updateStatus(QString)), this, SLOT(updateStatus(QString))); ++ ++ _client.setAccount(accountId); ++ QMailAccountConfiguration accountCfg(accountId); ++ DummySourceConfiguration dummyCfg(accountCfg); ++ _source->setIntervalTimer(dummyCfg.checkInterval()); ++} ++ ++DummySourceService::~DummySourceService() ++{ ++ delete _source; ++} ++ ++QString DummySourceService::service() const ++{ ++ return serviceKey; ++} ++ ++QMailAccountId DummySourceService::accountId() const ++{ ++ return _client.account(); ++} ++ ++bool DummySourceService::hasSource() const ++{ ++ return true; ++} ++ ++QMailMessageSource &DummySourceService::source() const ++{ ++ return *_source; ++} ++ ++bool DummySourceService::available() const ++{ ++ return true; ++} ++ ++bool DummySourceService::cancelOperation() ++{ ++ _client.cancelTransfer(); ++ _client.closeConnection(); ++ _source->retrievalTerminated(); ++ return true; ++} ++ ++void DummySourceService::errorOccurred(int code, const QString &text) ++{ ++ updateStatus(code, text, _client.account()); ++ _source->retrievalTerminated(); ++ emit actionCompleted(false); ++} ++ ++void DummySourceService::errorOccurred(QMailServiceAction::Status::ErrorCode code, const QString &text) ++{ ++ updateStatus(code, text, _client.account()); ++ _source->retrievalTerminated(); ++ emit actionCompleted(false); ++} ++ ++void DummySourceService::updateStatus(const QString &text) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceService::updateStatus() called"; ++ ++ updateStatus(QMailServiceAction::Status::ErrNoError, text, _client.account()); ++} ++ ++ ++class DummySourceServiceConfigurator : public QMailMessageServiceConfigurator ++{ ++public: ++ DummySourceServiceConfigurator(); ++ ~DummySourceServiceConfigurator(); ++ ++ virtual QString service() const; ++ virtual QString displayName() const; ++ ++ virtual QMailMessageServiceEditor *createEditor(QMailMessageServiceFactory::ServiceType type); ++}; ++ ++DummySourceServiceConfigurator::DummySourceServiceConfigurator() ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServiceConfigurator::DummySourceServiceConfigurator() called"; ++} ++ ++DummySourceServiceConfigurator::~DummySourceServiceConfigurator() ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServiceConfigurator::~DummySourceServiceConfigurator() called"; ++} ++ ++QString DummySourceServiceConfigurator::service() const ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServiceConfigurator::service() called"; ++ return serviceKey; ++} ++ ++QString DummySourceServiceConfigurator::displayName() const ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServiceConfigurator::displayName() called"; ++ return qApp->translate("QMailMessageService", "DUMMYSOURCE"); ++} ++ ++QMailMessageServiceEditor *DummySourceServiceConfigurator::createEditor(QMailMessageServiceFactory::ServiceType type) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServiceConfigurator::createEditor(QMailMessageServiceFactory::ServiceType type) called"; ++ ++ if (type == QMailMessageServiceFactory::Source) ++ return new DummySourceSettings; ++ ++ return 0; ++} ++ ++Q_EXPORT_PLUGIN2(dummysource,DummySourceServicePlugin) ++ ++DummySourceServicePlugin::DummySourceServicePlugin() ++ : QMailMessageServicePlugin() ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServicePlugin::DummySourceServicePlugin() called"; ++} ++ ++QString DummySourceServicePlugin::key() const ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServicePlugin::key() called"; ++ ++ return serviceKey; ++} ++ ++bool DummySourceServicePlugin::supports(QMailMessageServiceFactory::ServiceType type) const ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServicePlugin::supports(QMailMessageServiceFactory::ServiceType type) called"; ++ ++ return (type == QMailMessageServiceFactory::Source); ++} ++ ++bool DummySourceServicePlugin::supports(QMailMessage::MessageType type) const ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServicePlugin::supports(QMailMessage::MessageType type) called"; ++ ++ return (type == QMailMessage::Email); ++} ++ ++QMailMessageService *DummySourceServicePlugin::createService(const QMailAccountId &id) ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServicePlugin::createService() called"; ++ ++ return new DummySourceService(id); ++} ++ ++QMailMessageServiceConfigurator *DummySourceServicePlugin::createServiceConfigurator() ++{ ++ qMailLog(DUMMYSOURCE) << "************* DummySourceServicePlugin::createServiceConfigurator() called"; ++ return new DummySourceServiceConfigurator(); ++} ++ ++ ++#include "dummyservice.moc" ++ +diff --git a/src/plugins/messageservices/dummysource/dummyservice.h b/src/plugins/messageservices/dummysource/dummyservice.h +new file mode 100644 +index 0000000..f8e685e +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummyservice.h +@@ -0,0 +1,72 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMYSERVICE_H ++#define DUMMYSERVICE_H ++ ++#include "dummyclient.h" ++#include <qmailmessageservice.h> ++#include <qmaillog.h> ++ ++QLOG_ENABLE(DUMMYSOURCE) ++ ++class DummySourceService : public QMailMessageService ++{ ++ Q_OBJECT ++ ++public: ++ using QMailMessageService::updateStatus; ++ ++ DummySourceService(const QMailAccountId &accountId); ++ ~DummySourceService(); ++ ++ virtual QString service() const; ++ virtual QMailAccountId accountId() const; ++ ++ virtual bool hasSource() const; ++ virtual QMailMessageSource &source() const; ++ ++ virtual bool available() const; ++ ++public slots: ++ virtual bool cancelOperation(); ++ ++protected slots: ++ void errorOccurred(int code, const QString &text); ++ void errorOccurred(QMailServiceAction::Status::ErrorCode code, const QString &text); ++ ++ void updateStatus(const QString& text); ++ ++private: ++ class Source; ++ friend class Source; ++ ++ DummySourceClient _client; ++ Source *_source; ++}; ++ ++ ++class DummySourceServicePlugin : public QMailMessageServicePlugin ++{ ++ Q_OBJECT ++ ++public: ++ DummySourceServicePlugin(); ++ ++ virtual QString key() const; ++ virtual bool supports(QMailMessageServiceFactory::ServiceType type) const; ++ virtual bool supports(QMailMessage::MessageType type) const; ++ ++ virtual QMailMessageService *createService(const QMailAccountId &id); ++ virtual QMailMessageServiceConfigurator *createServiceConfigurator(); ++}; ++ ++ ++#endif +diff --git a/src/plugins/messageservices/dummysource/dummysettings.cpp b/src/plugins/messageservices/dummysource/dummysettings.cpp +new file mode 100644 +index 0000000..90e80a5 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummysettings.cpp +@@ -0,0 +1,157 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#include "dummysettings.h" ++#include "dummyconfiguration.h" ++#include <QLineEdit> ++#include <QMessageBox> ++#include <qmailaccount.h> ++#include <qmailaccountconfiguration.h> ++#include <qmailtransport.h> ++ ++namespace { ++ ++const QString serviceKey("dummysource"); ++ ++class PortValidator : public QValidator ++{ ++public: ++ PortValidator(QWidget *parent = 0, const char *name = 0); ++ ++ QValidator::State validate(QString &str, int &) const; ++}; ++ ++PortValidator::PortValidator(QWidget *parent, const char *name) ++ : QValidator(parent) ++{ ++ setObjectName(name); ++} ++ ++QValidator::State PortValidator::validate(QString &str, int &) const ++{ ++ // allow empty strings, as it's a bit awkward to edit otherwise ++ if ( str.isEmpty() ) ++ return QValidator::Acceptable; ++ ++ bool ok = false; ++ int i = str.toInt(&ok); ++ if ( !ok ) ++ return QValidator::Invalid; ++ ++ if ( i <= 0 || i >= 65536 ) ++ return QValidator::Invalid; ++ ++ return QValidator::Acceptable; ++} ++ ++} ++ ++ ++DummySourceSettings::DummySourceSettings() ++ : QMailMessageServiceEditor(), ++ warningEmitted(false) ++{ ++ setupUi(this); ++ setLayoutDirection(qApp->layoutDirection()); ++ ++ connect(intervalCheckBox, SIGNAL(stateChanged(int)), this, SLOT(intervalCheckChanged(int))); ++ ++ const QString uncapitalised("email noautocapitalization"); ++ ++ // These fields should not be autocapitalised ++ ++ mailPortInput->setValidator(new PortValidator(this)); ++ mailPasswInput->setEchoMode(QLineEdit::PasswordEchoOnEdit); ++ ++#ifdef QT_NO_OPENSSL ++ encryptionIncoming->hide(); ++ lblEncryptionIncoming->hide(); ++#endif ++ ++} ++ ++void DummySourceSettings::intervalCheckChanged(int enabled) ++{ ++ intervalPeriod->setEnabled(enabled); ++ roamingCheckBox->setEnabled(enabled); ++} ++ ++void DummySourceSettings::displayConfiguration(const QMailAccount &, const QMailAccountConfiguration &config) ++{ ++ if (!config.services().contains(serviceKey)) { ++ // New account ++ mailUserInput->setText(""); ++ mailPasswInput->setText(""); ++ mailServerInput->setText(""); ++ mailPortInput->setText("110"); ++#ifndef QT_NO_OPENSSL ++ encryptionIncoming->setCurrentIndex(0); ++#endif ++ intervalCheckBox->setChecked(false); ++ roamingCheckBox->setChecked(false); ++ } else { ++ DummySourceConfiguration dummyConfig(config); ++ ++ mailUserInput->setText(dummyConfig.mailUserName()); ++ mailPasswInput->setText(dummyConfig.mailPassword()); ++ mailServerInput->setText(dummyConfig.mailServer()); ++ mailPortInput->setText(QString::number(dummyConfig.mailPort())); ++#ifndef QT_NO_OPENSSL ++ encryptionIncoming->setCurrentIndex(static_cast<int>(dummyConfig.mailEncryption())); ++#endif ++ deleteCheckBox->setChecked(dummyConfig.canDeleteMail()); ++ maxSize->setValue(dummyConfig.maxMailSize()); ++ thresholdCheckBox->setChecked(dummyConfig.maxMailSize() != -1); ++ intervalCheckBox->setChecked(dummyConfig.checkInterval() > 0); ++ intervalPeriod->setValue(qAbs(dummyConfig.checkInterval() )); ++ roamingCheckBox->setChecked(!dummyConfig.intervalCheckRoamingEnabled()); ++ } ++ ++ intervalPeriod->setEnabled(false); ++ roamingCheckBox->setEnabled(intervalCheckBox->isChecked()); ++} ++ ++bool DummySourceSettings::updateAccount(QMailAccount *account, QMailAccountConfiguration *config) ++{ ++ bool result; ++ int port = mailPortInput->text().toInt(&result); ++ if ( (!result) ) { ++ // should only happen when the string is empty, since we use a validator. ++ port = -1; ++ } ++ ++ if (!config->services().contains(serviceKey)) ++ config->addServiceConfiguration(serviceKey); ++ ++ DummySourceConfigurationEditor dummyConfig(config); ++ ++ dummyConfig.setVersion(100 ); ++ dummyConfig.setType(QMailServiceConfiguration::Source ); ++ ++ dummyConfig.setMailUserName(mailUserInput->text()); ++ dummyConfig.setMailPassword(mailPasswInput->text()); ++ dummyConfig.setMailServer(mailServerInput->text()); ++ dummyConfig.setMailPort(port == -1 ? 110 : port); ++#ifndef QT_NO_OPENSSL ++ dummyConfig.setMailEncryption(static_cast<QMailTransport::EncryptType>(encryptionIncoming->currentIndex())); ++#endif ++ dummyConfig.setDeleteMail(deleteCheckBox->isChecked()); ++ dummyConfig.setMaxMailSize(thresholdCheckBox->isChecked() ? maxSize->value() : -1); ++ dummyConfig.setAutoDownload(false ); ++ dummyConfig.setCheckInterval(intervalPeriod->value() * (intervalCheckBox->isChecked() ? 1 : -1)); ++ dummyConfig.setIntervalCheckRoamingEnabled(!roamingCheckBox->isChecked()); ++ ++ // Do we have a configuration we can use? ++ if (!dummyConfig.mailServer().isEmpty() && !dummyConfig.mailUserName().isEmpty()) ++ account->setStatus(QMailAccount::CanRetrieve, true); ++ ++ return true; ++} ++ +diff --git a/src/plugins/messageservices/dummysource/dummysettings.h b/src/plugins/messageservices/dummysource/dummysettings.h +new file mode 100644 +index 0000000..a02608e +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummysettings.h +@@ -0,0 +1,36 @@ ++/**************************************************************************** ++** ++** This file is part of the $PACKAGE_NAME$. ++** ++** Copyright (C) $THISYEAR$ $COMPANY_NAME$. ++** ++** $QT_EXTENDED_DUAL_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef DUMMYSETTINGS_H ++#define DUMMYSETTINGS_H ++ ++#include "ui_dummysettings.h" ++#include <qmailmessageservice.h> ++ ++class DummySourceSettings : public QMailMessageServiceEditor, private Ui::DummySourceSettings ++{ ++ Q_OBJECT ++ ++public: ++ DummySourceSettings(); ++ ++ void displayConfiguration(const QMailAccount &account, const QMailAccountConfiguration &config); ++ bool updateAccount(QMailAccount *account, QMailAccountConfiguration *config); ++ ++private slots: ++ void pushCheckChanged(int enabled); ++ void intervalCheckChanged(int enabled); ++ ++private: ++ bool warningEmitted; ++}; ++ ++#endif ++ +diff --git a/src/plugins/messageservices/dummysource/dummysettings.ui b/src/plugins/messageservices/dummysource/dummysettings.ui +new file mode 100644 +index 0000000..4bbcf6b +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummysettings.ui +@@ -0,0 +1,351 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<ui version="4.0"> ++ <class>DummySourceSettings</class> ++ <widget class="QWidget" name="DummySourceSettings"> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>365</width> ++ <height>256</height> ++ </rect> ++ </property> ++ <property name="windowTitle"> ++ <string>Form</string> ++ </property> ++ <layout class="QVBoxLayout" name="verticalLayout"> ++ <property name="margin"> ++ <number>0</number> ++ </property> ++ <item> ++ <widget class="QScrollArea" name="scrollArea_2"> ++ <property name="focusPolicy"> ++ <enum>Qt::NoFocus</enum> ++ </property> ++ <property name="frameShape"> ++ <enum>QFrame::NoFrame</enum> ++ </property> ++ <property name="lineWidth"> ++ <number>0</number> ++ </property> ++ <property name="horizontalScrollBarPolicy"> ++ <enum>Qt::ScrollBarAlwaysOff</enum> ++ </property> ++ <property name="widgetResizable"> ++ <bool>true</bool> ++ </property> ++ <widget class="QWidget" name="scrollAreaWidgetContents_2"> ++ <property name="geometry"> ++ <rect> ++ <x>0</x> ++ <y>0</y> ++ <width>347</width> ++ <height>299</height> ++ </rect> ++ </property> ++ <layout class="QGridLayout"> ++ <item row="0" column="0"> ++ <widget class="QLabel" name="usernameLabel"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Username</string> ++ </property> ++ <property name="buddy"> ++ <cstring>mailUserInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="0" column="1"> ++ <widget class="QLineEdit" name="mailUserInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="1" column="0"> ++ <widget class="QLabel" name="passwordLabel"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Password</string> ++ </property> ++ <property name="buddy"> ++ <cstring>mailPasswInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="1" column="1"> ++ <widget class="QLineEdit" name="mailPasswInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="echoMode"> ++ <enum>QLineEdit::Password</enum> ++ </property> ++ </widget> ++ </item> ++ <item row="2" column="0"> ++ <widget class="QLabel" name="serverLabel"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Server</string> ++ </property> ++ <property name="buddy"> ++ <cstring>mailServerInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="2" column="1"> ++ <widget class="QLineEdit" name="mailServerInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="3" column="0"> ++ <widget class="QLabel" name="portLabel"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Port</string> ++ </property> ++ <property name="buddy"> ++ <cstring>mailPortInput</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="3" column="1"> ++ <widget class="QLineEdit" name="mailPortInput"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ </widget> ++ </item> ++ <item row="4" column="0"> ++ <widget class="QLabel" name="lblEncryptionIncoming"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Encryption</string> ++ </property> ++ <property name="buddy"> ++ <cstring>encryptionIncoming</cstring> ++ </property> ++ </widget> ++ </item> ++ <item row="4" column="1"> ++ <widget class="QComboBox" name="encryptionIncoming"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <item> ++ <property name="text"> ++ <string>None</string> ++ </property> ++ </item> ++ <item> ++ <property name="text"> ++ <string>SSL</string> ++ </property> ++ </item> ++ <item> ++ <property name="text"> ++ <string>TLS</string> ++ </property> ++ </item> ++ </widget> ++ </item> ++ <item row="5" column="0" colspan="2"> ++ <widget class="QCheckBox" name="deleteCheckBox"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="text"> ++ <string>Remove deleted mail from server</string> ++ </property> ++ <property name="checked"> ++ <bool>true</bool> ++ </property> ++ </widget> ++ </item> ++ <item row="6" column="0"> ++ <widget class="QCheckBox" name="thresholdCheckBox"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>0</height> ++ </size> ++ </property> ++ <property name="text"> ++ <string>Skip larger</string> ++ </property> ++ <property name="checked"> ++ <bool>true</bool> ++ </property> ++ </widget> ++ </item> ++ <item row="7" column="0"> ++ <widget class="QCheckBox" name="intervalCheckBox"> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>0</height> ++ </size> ++ </property> ++ <property name="text"> ++ <string>Interval</string> ++ </property> ++ </widget> ++ </item> ++ <item row="8" column="1"> ++ <widget class="QCheckBox" name="roamingCheckBox"> ++ <property name="enabled"> ++ <bool>false</bool> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>0</height> ++ </size> ++ </property> ++ <property name="text"> ++ <string>Disable when Roaming</string> ++ </property> ++ </widget> ++ </item> ++ <item row="7" column="1"> ++ <widget class="QSpinBox" name="intervalPeriod"> ++ <property name="enabled"> ++ <bool>false</bool> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="suffix"> ++ <string comment="short for minutes">min</string> ++ </property> ++ <property name="minimum"> ++ <number>10</number> ++ </property> ++ <property name="maximum"> ++ <number>1440</number> ++ </property> ++ <property name="singleStep"> ++ <number>10</number> ++ </property> ++ <property name="value"> ++ <number>60</number> ++ </property> ++ </widget> ++ </item> ++ <item row="6" column="1"> ++ <widget class="QSpinBox" name="maxSize"> ++ <property name="enabled"> ++ <bool>true</bool> ++ </property> ++ <property name="sizePolicy"> ++ <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> ++ <horstretch>0</horstretch> ++ <verstretch>0</verstretch> ++ </sizepolicy> ++ </property> ++ <property name="suffix"> ++ <string>K</string> ++ </property> ++ <property name="minimum"> ++ <number>5</number> ++ </property> ++ <property name="maximum"> ++ <number>5000</number> ++ </property> ++ <property name="singleStep"> ++ <number>5</number> ++ </property> ++ <property name="value"> ++ <number>20</number> ++ </property> ++ </widget> ++ </item> ++ </layout> ++ </widget> ++ </widget> ++ </item> ++ </layout> ++ </widget> ++ <tabstops> ++ <tabstop>mailUserInput</tabstop> ++ <tabstop>mailPasswInput</tabstop> ++ <tabstop>mailServerInput</tabstop> ++ <tabstop>mailPortInput</tabstop> ++ <tabstop>encryptionIncoming</tabstop> ++ <tabstop>deleteCheckBox</tabstop> ++ <tabstop>thresholdCheckBox</tabstop> ++ <tabstop>maxSize</tabstop> ++ <tabstop>intervalCheckBox</tabstop> ++ <tabstop>intervalPeriod</tabstop> ++ <tabstop>roamingCheckBox</tabstop> ++ </tabstops> ++ <resources/> ++ <connections/> ++</ui> +diff --git a/src/plugins/messageservices/dummysource/dummysource.pro b/src/plugins/messageservices/dummysource/dummysource.pro +new file mode 100644 +index 0000000..747a057 +--- /dev/null ++++ b/src/plugins/messageservices/dummysource/dummysource.pro +@@ -0,0 +1,31 @@ ++TEMPLATE = lib ++ ++TARGET = dummysource ++ ++target.path = $$QMF_INSTALL_ROOT/plugins/messageservices ++INSTALLS += target ++ ++QT += network ++ ++DEPENDPATH += . ++ ++INCLUDEPATH += . ../../../libraries/qtopiamail \ ++ ../../../libraries/messageserver \ ++ ../../../libraries/qtopiamail/support ++ ++LIBS += -L../../../libraries/qtopiamail -lqtopiamail \ ++ -L../../../libraries/messageserver -lmessageserver ++ ++HEADERS += dummyclient.h \ ++ dummyconfiguration.h \ ++ dummyservice.h \ ++ dummysettings.h \ ++ dummyauthenticator.h ++ ++SOURCES += dummyclient.cpp \ ++ dummyconfiguration.cpp \ ++ dummyservice.cpp \ ++ dummysettings.cpp \ ++ dummyauthenticator.cpp ++ ++FORMS += dummysettings.ui +diff --git a/src/settings/messagingaccounts/messagingaccounts.pro b/src/settings/messagingaccounts/messagingaccounts.pro +index 03c3e8e..a1d46c0 100644 +--- a/src/settings/messagingaccounts/messagingaccounts.pro ++++ b/src/settings/messagingaccounts/messagingaccounts.pro +@@ -7,11 +7,19 @@ INSTALLS += target + DEPENDPATH += . + + INCLUDEPATH += . ../../libraries/qtopiamail \ +-../../libraries/qtopiamail/support \ +-../../libraries/messageserver ++ ../../libraries/qtopiamail/support \ ++ ../../libraries/messageserver + +-LIBS += -L../../libraries/qtopiamail -lqtopiamail \ +--L../../libraries/messageserver -lmessageserver ++LIBS += -L../../libraries/qtopiamail -lqtopiamail \ ++ -L../../libraries/messageserver -lmessageserver ++ ++sparql { ++ ++LIBS += -L../../libraries/sparql -lsparql ++ ++QMAKE_LFLAGS += -Wl,-rpath,../../libraries/sparql ++ ++} + + HEADERS += accountsettings.h \ + editaccount.h \ +diff --git a/src/tools/messageserver/etc/messageserver b/src/tools/messageserver/etc/messageserver +new file mode 100644 +index 0000000..900d1a9 +--- /dev/null ++++ b/src/tools/messageserver/etc/messageserver +@@ -0,0 +1,34 @@ ++description "QMF Message Server" ++author "Dmitry Zelenkovsky" ++ ++start on console ++stop on console ++ ++console output ++ ++pre-start script ++ if [ -f /var/tmp/messageserver-instance.lock ]; then ++ rm /var/tmp/messageserver-instance.lock ++ fi ++ if [ -f /var/tmp/qcop-server-0 ]; then ++ rm /var/tmp/qcop-server-0 ++ fi ++ if [ -f /tmp/qcop-server-0 ]; then ++ rm /tmp/qcop-server-0 ++ fi ++end script ++ ++script ++ echo "Starting message server..." ++ if id user >/dev/null 2>&1; then ++ su user -c "export DISPLAY=0:0; messageserver &" ++ else ++ echo "ERROR: Failed to start message server, there is no user with name: user" ++ echo "Please use \"adduser user user\" to create new user account." ++ fi ++end script ++ ++# TBD: Uncomment this string to respawn message server. ++# In case of failure messageserver refuses to start ++# and that leads to recourcive respawn. ++# respawn +diff --git a/src/tools/messageserver/messageserver.pro b/src/tools/messageserver/messageserver.pro +index 337ff9c..b6a33b7 100644 +--- a/src/tools/messageserver/messageserver.pro ++++ b/src/tools/messageserver/messageserver.pro +@@ -1,8 +1,6 @@ + TEMPLATE = app + + TARGET = messageserver +-target.path += $$QMF_INSTALL_ROOT/bin +-INSTALLS += target + + DEPENDPATH += . + +@@ -38,3 +36,12 @@ TRANSLATIONS += messageserver-ar.ts \ + messageserver-pt_BR.ts \ + messageserver-zh_CN.ts \ + messageserver-zh_TW.ts ++ ++target.path += $$QMF_INSTALL_ROOT/bin ++ ++upstart.files = etc/messageserver ++upstart.path = /etc/event.d ++ ++INSTALLS += target upstart ++ ++ diff --git a/tools/sparql-import/main.cpp b/tools/sparql-import/main.cpp new file mode 100644 index 0000000..4fcdd02 |