00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "callback.h"
00034 #include "kmkernel.h"
00035 #include "kmmessage.h"
00036 #include "kmmsgpart.h"
00037 #include <libemailfunctions/email.h>
00038 #include <libkpimidentities/identity.h>
00039 #include <libkpimidentities/identitymanager.h>
00040 #include "kmmainwin.h"
00041 #include "composer.h"
00042 #include "kmreaderwin.h"
00043 #include "secondarywindow.h"
00044 #include "transportmanager.h"
00045
00046 #include <mimelib/enum.h>
00047
00048 #include <kinputdialog.h>
00049 #include <klocale.h>
00050 #include <kdebug.h>
00051
00052 using namespace KMail;
00053
00054
00055 Callback::Callback( KMMessage* msg, KMReaderWin* readerWin )
00056 : mMsg( msg ), mReaderWin( readerWin ), mReceiverSet( false )
00057 {
00058 }
00059
00060 QString Callback::askForTransport( bool nullIdentity ) const
00061 {
00062 const QStringList transports = KMail::TransportManager::transportNames();
00063 if ( transports.size() == 1 )
00064 return transports.first();
00065
00066 const QString defaultTransport = GlobalSettings::self()->defaultTransport();
00067 const int defaultIndex = QMAX( 0, transports.findIndex( defaultTransport ) );
00068
00069 QString text;
00070 if ( nullIdentity )
00071 text = i18n( "<qt>The receiver of this invitation doesn't match any of your identities.<br>"
00072 "Please select the transport which should be used to send your reply.</qt>" );
00073 else
00074 text = i18n( "<qt>The identity matching the receiver of this invitation doesn't have an "
00075 "associated transport configured.<br>"
00076 "Please select the transport which should be used to send your reply.</qt>");
00077 bool ok;
00078 const QString transport = KInputDialog::getItem( i18n( "Select Transport" ), text,
00079 transports, defaultIndex, FALSE, &ok, kmkernel->mainWin() );
00080 if ( !ok )
00081 return QString();
00082
00083 return transport;
00084 }
00085
00086 bool Callback::mailICal( const QString& to, const QString &iCal,
00087 const QString& subject, const QString &status,
00088 bool delMessage ) const
00089 {
00090 kdDebug(5006) << "Mailing message:\n" << iCal << endl;
00091
00092 KMMessage *msg = new KMMessage;
00093 msg->initHeader();
00094 msg->setSubject( subject );
00095 if ( GlobalSettings::self()->exchangeCompatibleInvitations() ) {
00096 if ( status == QString("cancel") )
00097 msg->setSubject( QString("Declined: %1").arg(subject).replace("Answer: ","") );
00098 else if ( status == QString("tentative") )
00099 msg->setSubject(QString("Tentative: %1").arg(subject).replace("Answer: ","") );
00100 else if ( status == QString("accepted") )
00101 msg->setSubject( QString("Accepted: %1").arg(subject).replace("Answer: ","") );
00102 else if ( status == QString("delegated") )
00103 msg->setSubject( QString("Delegated: %1").arg(subject).replace("Answer: ","") );
00104 }
00105 msg->setTo( to );
00106 msg->setFrom( receiver() );
00107
00108 if ( !GlobalSettings::self()->exchangeCompatibleInvitations() ) {
00109 msg->setHeaderField( "Content-Type",
00110 "text/calendar; method=reply; charset=\"utf-8\"" );
00111 msg->setBody( iCal.utf8() );
00112 }
00113
00114 if ( delMessage && deleteInvitationAfterReply() )
00115
00116
00117 msg->link( mMsg, KMMsgStatusDeleted );
00118
00119
00120
00121
00122 const KPIM::Identity& identity = kmkernel->identityManager()->identityForAddress( receiver() );
00123 const bool nullIdentity = ( identity == KPIM::Identity::null() );
00124 if ( !nullIdentity ) {
00125 msg->setHeaderField("X-KMail-Identity", QString::number( identity.uoid() ));
00126 }
00127
00128 const bool identityHasTransport = !identity.transport().isEmpty();
00129 if ( !nullIdentity && identityHasTransport )
00130 msg->setHeaderField( "X-KMail-Transport", identity.transport() );
00131 else if ( !nullIdentity && identity.isDefault() )
00132 msg->setHeaderField( "X-KMail-Transport", GlobalSettings::self()->defaultTransport() );
00133 else {
00134 const QString transport = askForTransport( nullIdentity );
00135 if ( transport.isEmpty() )
00136 return false;
00137 msg->setHeaderField( "X-KMail-Transport", transport );
00138 }
00139
00140
00141
00142 KConfigGroup options( KMKernel::config(), "Groupware" );
00143 if( !options.readBoolEntry( "LegacyMangleFromToHeaders", true ) ) {
00144 if( identity != KPIM::Identity::null() ) {
00145 msg->setFrom( identity.fullEmailAddr() );
00146 }
00147
00148 msg->setBcc( "" );
00149 }
00150
00151 KMail::Composer * cWin = KMail::makeComposer();
00152 cWin->ignoreStickyFields();
00153 cWin->setMsg( msg, false );
00154
00155 cWin->disableWordWrap();
00156 cWin->setSigningAndEncryptionDisabled( true );
00157
00158 if( GlobalSettings::self()->exchangeCompatibleInvitations() ) {
00159
00160
00161 msg->setSubject( status );
00162 msg->setCharset( "utf-8" );
00163 KMMessagePart *msgPart = new KMMessagePart;
00164 msgPart->setName( "cal.ics" );
00165
00166 msgPart->setBodyEncoded( iCal.utf8() );
00167 msgPart->setTypeStr( "text" );
00168 msgPart->setSubtypeStr( "calendar" );
00169 msgPart->setParameter( "method", "reply" );
00170 cWin->addAttach( msgPart );
00171 }
00172
00173 cWin->disableRecipientNumberCheck();
00174 if ( options.readBoolEntry( "AutomaticSending", true ) ) {
00175 cWin->setAutoDeleteWindow( true );
00176 cWin->slotSendNow();
00177 } else {
00178 cWin->show();
00179 }
00180
00181 return true;
00182 }
00183
00184 QString Callback::receiver() const
00185 {
00186 if ( mReceiverSet )
00187
00188 return mReceiver;
00189
00190 mReceiverSet = true;
00191
00192 QStringList addrs = KPIM::splitEmailAddrList( mMsg->to() );
00193 int found = 0;
00194 for( QStringList::Iterator it = addrs.begin(); it != addrs.end(); ++it ) {
00195 if( kmkernel->identityManager()->identityForAddress( *it ) !=
00196 KPIM::Identity::null() ) {
00197
00198 ++found;
00199 mReceiver = *it;
00200 }
00201 }
00202 QStringList ccaddrs = KPIM::splitEmailAddrList( mMsg->cc() );
00203 for( QStringList::Iterator it = ccaddrs.begin(); it != ccaddrs.end(); ++it ) {
00204 if( kmkernel->identityManager()->identityForAddress( *it ) !=
00205 KPIM::Identity::null() ) {
00206
00207 ++found;
00208 mReceiver = *it;
00209 }
00210 }
00211 if( found != 1 ) {
00212 bool ok;
00213 QString selectMessage;
00214 if (found == 0) {
00215 selectMessage = i18n("<qt>None of your identities match the "
00216 "receiver of this message,<br>please "
00217 "choose which of the following addresses "
00218 "is yours, if any, or select one of your identities to use in the reply:");
00219 addrs += kmkernel->identityManager()->allEmails();
00220 } else {
00221 selectMessage = i18n("<qt>Several of your identities match the "
00222 "receiver of this message,<br>please "
00223 "choose which of the following addresses "
00224 "is yours:");
00225 }
00226
00227
00228 const QString defaultAddr = kmkernel->identityManager()->defaultIdentity().emailAddr();
00229 const int defaultIndex = QMAX( 0, addrs.findIndex( defaultAddr ) );
00230
00231 mReceiver =
00232 KInputDialog::getItem( i18n( "Select Address" ),
00233 selectMessage,
00234 addrs+ccaddrs, defaultIndex, FALSE, &ok, kmkernel->mainWin() );
00235 if( !ok )
00236 mReceiver = QString::null;
00237 }
00238
00239 return mReceiver;
00240 }
00241
00242 void Callback::closeIfSecondaryWindow() const
00243 {
00244 KMail::SecondaryWindow *window = dynamic_cast<KMail::SecondaryWindow*>( mReaderWin->mainWindow() );
00245 if ( window )
00246 window->close();
00247 }
00248
00249 bool Callback::askForComment( KCal::Attendee::PartStat status ) const
00250 {
00251 if ( ( status != KCal::Attendee::Accepted
00252 && GlobalSettings::self()->askForCommentWhenReactingToInvitation()
00253 == GlobalSettings:: EnumAskForCommentWhenReactingToInvitation::AskForAllButAcceptance )
00254 || GlobalSettings::self()->askForCommentWhenReactingToInvitation()
00255 == GlobalSettings:: EnumAskForCommentWhenReactingToInvitation::AlwaysAsk )
00256 return true;
00257 return false;
00258 }
00259
00260 bool Callback::deleteInvitationAfterReply() const
00261 {
00262 return GlobalSettings::self()->deleteInvitationEmailsAfterSendingReply();
00263 }
00264
00265 bool Callback::exchangeCompatibleInvitations() const
00266 {
00267 return GlobalSettings::self()->exchangeCompatibleInvitations();
00268 }
00269
00270 bool Callback::outlookCompatibleInvitationReplyComments() const
00271 {
00272 return GlobalSettings::self()->outlookCompatibleInvitationReplyComments();
00273 }
00274
00275 QString Callback::sender() const
00276 {
00277 return mMsg->from();
00278 }