20 #include "messagequeuejob.h"
22 #include "transport.h"
23 #include "transportattribute.h"
24 #include "transportmanager.h"
27 #include <KLocalizedString>
29 #include <akonadi/collection.h>
30 #include <akonadi/item.h>
31 #include <akonadi/itemcreatejob.h>
32 #include <akonadi/kmime/addressattribute.h>
33 #include <akonadi/kmime/messageflags.h>
34 #include <akonadi/kmime/specialmailcollections.h>
35 #include <akonadi/kmime/specialmailcollectionsrequestjob.h>
37 using namespace Akonadi;
38 using namespace KMime;
39 using namespace MailTransport;
44 class MailTransport::MessageQueueJob::Private
60 AddressAttribute addressAttribute;
70 void outboxRequestResult( KJob *job );
74 bool MessageQueueJob::Private::validate()
77 q->setError( UserDefinedError );
78 q->setErrorText( i18n(
"Empty message." ) );
83 if ( addressAttribute.to().count() + addressAttribute.cc().count() +
84 addressAttribute.bcc().count() == 0 ) {
85 q->setError( UserDefinedError );
86 q->setErrorText( i18n(
"Message has no recipients." ) );
91 const int transport = transportAttribute.transportId();
92 if ( TransportManager::self()->transportById( transport,
false ) == 0 ) {
93 q->setError( UserDefinedError );
94 q->setErrorText( i18n(
"Message has invalid transport." ) );
99 if ( sentBehaviourAttribute.sentBehaviour() == SentBehaviourAttribute::MoveToCollection &&
100 !( sentBehaviourAttribute.moveToCollection().isValid() ) ) {
101 q->setError( UserDefinedError );
102 q->setErrorText( i18n(
"Message has invalid sent-mail folder." ) );
105 }
else if ( sentBehaviourAttribute.sentBehaviour() ==
106 SentBehaviourAttribute::MoveToDefaultSentCollection ) {
113 void MessageQueueJob::Private::outboxRequestResult( KJob *job )
115 Q_ASSERT( !started );
118 if ( job->error() ) {
119 kError() <<
"Failed to get the Outbox folder:" << job->error() << job->errorString();
120 q->setError( job->error() );
130 SpecialMailCollectionsRequestJob *requestJob =
131 qobject_cast<SpecialMailCollectionsRequestJob*>( job );
138 item.setMimeType( QLatin1String(
"message/rfc822" ) );
139 item.setPayload<Message::Ptr>( message );
142 item.addAttribute( addressAttribute.clone() );
143 item.addAttribute( dispatchModeAttribute.clone() );
144 item.addAttribute( sentBehaviourAttribute.clone() );
145 item.addAttribute( sentActionAttribute.clone() );
146 item.addAttribute( transportAttribute.clone() );
149 if ( KMime::isSigned( message.get() ) ) {
150 item.setFlag( Akonadi::MessageFlags::Signed );
153 if ( KMime::isEncrypted( message.get() ) ) {
154 item.setFlag( Akonadi::MessageFlags::Encrypted );
157 if ( KMime::isInvitation( message.get() ) ) {
158 item.setFlag( Akonadi::MessageFlags::HasInvitation );
161 if ( KMime::hasAttachment( message.get() ) ) {
162 item.setFlag( Akonadi::MessageFlags::HasAttachment );
166 item.setFlag( Akonadi::MessageFlags::Queued );
169 const Collection collection = requestJob->collection();
170 Q_ASSERT( collection.isValid() );
171 ItemCreateJob *cjob =
new ItemCreateJob( item, collection );
172 q->addSubjob( cjob );
175 MessageQueueJob::MessageQueueJob( QObject *parent )
176 : KCompositeJob( parent ), d( new Private( this ) )
192 return d->dispatchModeAttribute;
197 return d->addressAttribute;
202 return d->transportAttribute;
207 return d->sentBehaviourAttribute;
212 return d->sentActionAttribute;
222 SpecialMailCollectionsRequestJob *rjob =
new SpecialMailCollectionsRequestJob(
this );
223 rjob->requestDefaultCollection( SpecialMailCollections::Outbox );
224 connect( rjob, SIGNAL(result(KJob*)),
this, SLOT(outboxRequestResult(KJob*)) );
231 KCompositeJob::slotResult( job );
238 #include "moc_messagequeuejob.cpp"