00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "messagequeuejob.h"
00021
00022 #include "transport.h"
00023 #include "transportattribute.h"
00024 #include "transportmanager.h"
00025
00026 #include <KDebug>
00027 #include <KLocalizedString>
00028
00029 #include <akonadi/collection.h>
00030 #include <akonadi/item.h>
00031 #include <akonadi/itemcreatejob.h>
00032 #include <akonadi/kmime/addressattribute.h>
00033 #include <akonadi/kmime/specialmailcollections.h>
00034 #include <akonadi/kmime/specialmailcollectionsrequestjob.h>
00035
00036 using namespace Akonadi;
00037 using namespace KMime;
00038 using namespace MailTransport;
00039
00043 class MailTransport::MessageQueueJob::Private
00044 {
00045 public:
00046 Private( MessageQueueJob *qq )
00047 : q( qq )
00048 {
00049 started = false;
00050 }
00051
00052 MessageQueueJob *const q;
00053
00054 Message::Ptr message;
00055 TransportAttribute transportAttribute;
00056 DispatchModeAttribute dispatchModeAttribute;
00057 SentBehaviourAttribute sentBehaviourAttribute;
00058 AddressAttribute addressAttribute;
00059 bool started;
00060
00065 bool validate();
00066
00067
00068 void outboxRequestResult( KJob *job );
00069
00070 };
00071
00072 bool MessageQueueJob::Private::validate()
00073 {
00074 if( !message ) {
00075 q->setError( UserDefinedError );
00076 q->setErrorText( i18n( "Empty message." ) );
00077 q->emitResult();
00078 return false;
00079 }
00080
00081 if( addressAttribute.to().count() + addressAttribute.cc().count() +
00082 addressAttribute.bcc().count() == 0 ) {
00083 q->setError( UserDefinedError );
00084 q->setErrorText( i18n( "Message has no recipients." ) );
00085 q->emitResult();
00086 return false;
00087 }
00088
00089 const int transport = transportAttribute.transportId();
00090 if( TransportManager::self()->transportById( transport, false ) == 0 ) {
00091 q->setError( UserDefinedError );
00092 q->setErrorText( i18n( "Message has invalid transport." ) );
00093 q->emitResult();
00094 return false;
00095 }
00096
00097 if( sentBehaviourAttribute.sentBehaviour() == SentBehaviourAttribute::MoveToCollection &&
00098 !( sentBehaviourAttribute.moveToCollection().isValid() ) ) {
00099 q->setError( UserDefinedError );
00100 q->setErrorText( i18n( "Message has invalid sent-mail folder." ) );
00101 q->emitResult();
00102 return false;
00103 } else if( sentBehaviourAttribute.sentBehaviour() ==
00104 SentBehaviourAttribute::MoveToDefaultSentCollection ) {
00105
00106 }
00107
00108 return true;
00109 }
00110
00111 void MessageQueueJob::Private::outboxRequestResult( KJob *job )
00112 {
00113 Q_ASSERT( !started );
00114 started = true;
00115
00116 if( job->error() ) {
00117 kError() << "Failed to get the Outbox folder:" << job->error() << job->errorString();
00118 q->setError(job->error());
00119 q->emitResult();
00120 return;
00121 }
00122
00123 if( !validate() ) {
00124
00125 return;
00126 }
00127
00128 SpecialMailCollectionsRequestJob *requestJob =
00129 qobject_cast<SpecialMailCollectionsRequestJob*>( job );
00130 if ( !requestJob ) {
00131 return;
00132 }
00133
00134
00135 Item item;
00136 item.setMimeType( QLatin1String( "message/rfc822" ) );
00137 item.setPayload<Message::Ptr>( message );
00138
00139
00140 item.addAttribute( addressAttribute.clone() );
00141 item.addAttribute( dispatchModeAttribute.clone() );
00142 item.addAttribute( sentBehaviourAttribute.clone() );
00143 item.addAttribute( transportAttribute.clone() );
00144
00145
00146 item.setFlag( "queued" );
00147
00148
00149 const Collection collection = requestJob->collection();
00150 Q_ASSERT( collection.isValid() );
00151 ItemCreateJob *cjob = new ItemCreateJob( item, collection );
00152 q->addSubjob( cjob );
00153 }
00154
00155 MessageQueueJob::MessageQueueJob( QObject *parent )
00156 : KCompositeJob( parent ), d( new Private( this ) )
00157 {
00158 }
00159
00160 MessageQueueJob::~MessageQueueJob()
00161 {
00162 delete d;
00163 }
00164
00165 Message::Ptr MessageQueueJob::message() const
00166 {
00167 return d->message;
00168 }
00169
00170 DispatchModeAttribute &MessageQueueJob::dispatchModeAttribute()
00171 {
00172 return d->dispatchModeAttribute;
00173 }
00174
00175 AddressAttribute &MessageQueueJob::addressAttribute()
00176 {
00177 return d->addressAttribute;
00178 }
00179
00180 TransportAttribute &MessageQueueJob::transportAttribute()
00181 {
00182 return d->transportAttribute;
00183 }
00184
00185 SentBehaviourAttribute &MessageQueueJob::sentBehaviourAttribute()
00186 {
00187 return d->sentBehaviourAttribute;
00188 }
00189
00190 void MessageQueueJob::setMessage( Message::Ptr message )
00191 {
00192 d->message = message;
00193 }
00194
00195 void MessageQueueJob::start()
00196 {
00197 SpecialMailCollectionsRequestJob *rjob = new SpecialMailCollectionsRequestJob( this );
00198 rjob->requestDefaultCollection( SpecialMailCollections::Outbox );
00199 connect( rjob, SIGNAL(result(KJob*)), this, SLOT(outboxRequestResult(KJob*)) );
00200 rjob->start();
00201 }
00202
00203 void MessageQueueJob::slotResult( KJob *job )
00204 {
00205
00206 KCompositeJob::slotResult( job );
00207
00208 if( !error() ) {
00209 emitResult();
00210 }
00211 }
00212
00213 #include "messagequeuejob.moc"