summaryrefslogtreecommitdiffstats
path: root/kmail/kmcommands.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmail/kmcommands.cpp')
-rw-r--r--kmail/kmcommands.cpp204
1 files changed, 114 insertions, 90 deletions
diff --git a/kmail/kmcommands.cpp b/kmail/kmcommands.cpp
index e0b911df7..7bf978b07 100644
--- a/kmail/kmcommands.cpp
+++ b/kmail/kmcommands.cpp
@@ -101,6 +101,7 @@ using KMail::ActionScheduler;
#include "kcursorsaver.h"
#include "partNode.h"
#include "objecttreeparser.h"
+#include "csshelper.h"
using KMail::ObjectTreeParser;
using KMail::FolderJob;
#include "chiasmuskeyselector.h"
@@ -243,13 +244,16 @@ void KMCommand::slotStart()
return;
}
- for (KMMsgBase *mb = mMsgList.first(); mb; mb = mMsgList.next())
- if (!mb->parent()) {
- emit messagesTransfered( Failed );
- return;
- } else {
- keepFolderOpen( mb->parent() );
+ for ( KMMsgBase *mb = mMsgList.first(); mb; mb = mMsgList.next() ) {
+ if ( mb ) {
+ if ( !mb->parent() ) {
+ emit messagesTransfered( Failed );
+ return;
+ } else {
+ keepFolderOpen( mb->parent() );
+ }
}
+ }
// transfer the selected messages first
transferSelectedMsgs();
@@ -446,7 +450,7 @@ void KMCommand::slotTransferCancelled()
void KMCommand::keepFolderOpen( KMFolder *folder )
{
- folder->open("kmcommand");
+ folder->open( "kmcommand" );
mFolders.append( folder );
}
@@ -757,10 +761,25 @@ KMCommand::Result KMShowMsgSrcCommand::execute()
return OK;
}
-static KURL subjectToUrl( const TQString & subject ) {
- return KFileDialog::getSaveURL( subject.stripWhiteSpace()
- .replace( TQDir::separator(), '_' ),
- "*.mbox" );
+static KURL subjectToUrl( const TQString & subject )
+{
+ // We need to replace colons with underscores since those cause problems with KFileDialog (bug
+ // in KFileDialog though) and also on Windows filesystems.
+ // We also look at the special case of ": ", since converting that to "_ " would look strange,
+ // simply "_" looks better.
+ // We also don't allow filenames starting with a dot, since then the file is hidden and the poor
+ // user can't find it anymore.
+ // Don't allow filenames starting with a tilde either, since that will cause the file dialog to
+ // discard the filename entirely.
+ // https://issues.kolab.org/issue3805
+ const TQString filter = i18n( "*.mbox|email messages (*.mbox)\n*|all files (*)" );
+ TQString cleanSubject = subject.stripWhiteSpace()
+ .replace( TQDir::separator(), '_' )
+ .replace( ": ", "_" )
+ .replace( ':', '_' )
+ .replace( '.', '_' )
+ .replace( '~', '_' );
+ return KFileDialog::getSaveURL( cleanSubject, filter );
}
KMSaveMsgCommand::KMSaveMsgCommand( TQWidget *parent, KMMessage * msg )
@@ -857,16 +876,23 @@ void KMSaveMsgCommand::slotSaveDataReq()
assert( p );
assert( idx >= 0 );
//kdDebug() << "SERNUM: " << mMsgList[mMsgListIndex] << " idx: " << idx << " folder: " << p->prettyURL() << endl;
+
+ const bool alreadyGot = p->isMessage( idx );
+
msg = p->getMsg(idx);
if ( msg ) {
+ // Only unGet the message if it isn't already got.
+ if ( !alreadyGot ) {
+ mUngetMsgs.append( msg );
+ }
if ( msg->transferInProgress() ) {
TQByteArray data = TQByteArray();
mJob->sendAsyncData( data );
}
msg->setTransferInProgress( true );
- if (msg->isComplete() ) {
- slotMessageRetrievedForSaving( msg );
+ if ( msg->isComplete() ) {
+ slotMessageRetrievedForSaving( msg );
} else {
// retrieve Message first
if ( msg->parent() && !msg->isComplete() ) {
@@ -918,7 +944,8 @@ void KMSaveMsgCommand::slotMessageRetrievedForSaving(KMMessage *msg)
}
++mMsgListIndex;
// Get rid of the message.
- if ( msg && msg->parent() && msg->getMsgSerNum() ) {
+ if ( msg && msg->parent() && msg->getMsgSerNum() &&
+ mUngetMsgs.contains( msg ) ) {
int idx = -1;
KMFolder * p = 0;
KMMsgDict::instance()->getLocation( msg, &p, &idx );
@@ -1229,9 +1256,9 @@ KMCommand::Result KMForwardInlineCommand::execute()
// fwdMsg->setBody( msgText );
for ( KMMessage *msg = linklist.first(); msg; msg = linklist.next() ) {
- TemplateParser parser( fwdMsg, TemplateParser::Forward,
- msg->body(), false, false, false, false);
- parser.process( msg, 0, true );
+ TemplateParser parser( fwdMsg, TemplateParser::Forward );
+ parser.setSelection( msg->body() ); // FIXME: Why is this needed?
+ parser.process( msg, 0, true );
fwdMsg->link( msg, KMMsgStatusForwarded );
}
@@ -1256,7 +1283,6 @@ KMCommand::Result KMForwardInlineCommand::execute()
{
KMail::Composer * win = KMail::makeComposer( fwdMsg, id );
win->setCharset( fwdMsg->codec()->mimeName(), true );
- win->setBody( fwdMsg->bodyToUnicode() );
win->show();
}
}
@@ -1459,7 +1485,7 @@ KMCommand::Result KMCustomReplyToCommand::execute()
return Failed;
}
KMMessage *reply = msg->createReply( KMail::ReplySmart, mSelection,
- false, true, false, mTemplate );
+ false, true, mTemplate );
KMail::Composer * win = KMail::makeComposer( reply );
win->setCharset( msg->codec()->mimeName(), true );
win->setReplyFocus();
@@ -1484,7 +1510,7 @@ KMCommand::Result KMCustomReplyAllToCommand::execute()
return Failed;
}
KMMessage *reply = msg->createReply( KMail::ReplyAll, mSelection,
- false, true, false, mTemplate );
+ false, true, mTemplate );
KMail::Composer * win = KMail::makeComposer( reply );
win->setCharset( msg->codec()->mimeName(), true );
win->setReplyFocus();
@@ -1533,9 +1559,9 @@ KMCommand::Result KMCustomForwardCommand::execute()
// fwdMsg->setBody( msgText );
for ( KMMessage *msg = linklist.first(); msg; msg = linklist.next() ) {
- TemplateParser parser( fwdMsg, TemplateParser::Forward,
- msg->body(), false, false, false, false);
- parser.process( msg, 0, true );
+ TemplateParser parser( fwdMsg, TemplateParser::Forward );
+ parser.setSelection( msg->body() ); // FIXME: Why is this needed?
+ parser.process( msg, 0, true );
fwdMsg->link( msg, KMMsgStatusForwarded );
}
@@ -1567,14 +1593,24 @@ KMCommand::Result KMCustomForwardCommand::execute()
}
-KMPrintCommand::KMPrintCommand( TQWidget *parent,
- KMMessage *msg, bool htmlOverride, bool htmlLoadExtOverride,
- bool useFixedFont, const TQString & encoding )
- : KMCommand( parent, msg ), mHtmlOverride( htmlOverride ),
+KMPrintCommand::KMPrintCommand( TQWidget *parent, KMMessage *msg,
+ const KMail::HeaderStyle *headerStyle,
+ const KMail::HeaderStrategy *headerStrategy,
+ bool htmlOverride, bool htmlLoadExtOverride,
+ bool useFixedFont, const TQString & encoding )
+ : KMCommand( parent, msg ),
+ mHeaderStyle( headerStyle ), mHeaderStrategy( headerStrategy ),
+ mHtmlOverride( htmlOverride ),
mHtmlLoadExtOverride( htmlLoadExtOverride ),
mUseFixedFont( useFixedFont ), mEncoding( encoding )
{
- mOverrideFont = KGlobalSettings::generalFont();
+ if ( GlobalSettings::useDefaultFonts() )
+ mOverrideFont = KGlobalSettings::generalFont();
+ else {
+ KConfigGroup fonts( KMKernel::config(), "Fonts" );
+ TQString tmp = fonts.readEntry( "print-font", KGlobalSettings::generalFont().toString() );
+ mOverrideFont.fromString( tmp );
+ }
}
@@ -1588,11 +1624,13 @@ KMCommand::Result KMPrintCommand::execute()
KMReaderWin printWin( 0, 0, 0 );
printWin.setPrinting( true );
printWin.readConfig();
+ if ( mHeaderStyle != 0 && mHeaderStrategy != 0 )
+ printWin.setHeaderStyleAndStrategy( mHeaderStyle, mHeaderStrategy );
printWin.setHtmlOverride( mHtmlOverride );
printWin.setHtmlLoadExtOverride( mHtmlLoadExtOverride );
printWin.setUseFixedFont( mUseFixedFont );
printWin.setOverrideEncoding( mEncoding );
- printWin.setPrintFont( mOverrideFont );
+ printWin.cssHelper()->setPrintFont( mOverrideFont );
printWin.setDecryptMessageOverwrite( true );
printWin.setMsg( retrievedMessage(), true );
printWin.printMsg();
@@ -2149,14 +2187,21 @@ KMCommand::Result KMMoveCommand::execute()
mProgressItem->setTotalItems( mSerNumList.count() );
for ( TQValueList<Q_UINT32>::ConstIterator it = mSerNumList.constBegin(); it != mSerNumList.constEnd(); ++it ) {
- KMFolder *srcFolder;
+ if ( *it == 0 ) {
+ kdDebug(5006) << k_funcinfo << "serial number == 0!" << endl;
+ continue; // invalid message
+ }
+ KMFolder *srcFolder = 0;
int idx = -1;
KMMsgDict::instance()->getLocation( *it, &srcFolder, &idx );
if (srcFolder == mDestFolder)
continue;
+ assert(srcFolder);
assert(idx != -1);
- srcFolder->open( "kmmovecommand" );
- mOpenedFolders.append( srcFolder );
+ if ( !srcFolder->isOpened() ) {
+ srcFolder->open( "kmmovecommand" );
+ mOpenedFolders.append( srcFolder );
+ }
msg = srcFolder->getMsg(idx);
if ( !msg ) {
kdDebug(5006) << k_funcinfo << "No message found for serial number " << *it << endl;
@@ -2328,6 +2373,11 @@ KMDeleteMsgCommand::KMDeleteMsgCommand( KMFolder* srcFolder, KMMessage * msg )
KMDeleteMsgCommand::KMDeleteMsgCommand( Q_UINT32 sernum )
:KMMoveCommand( sernum )
{
+ if ( !sernum ) {
+ setDestFolder( 0 );
+ return;
+ }
+
KMFolder *srcFolder = 0;
int idx;
KMMsgDict::instance()->getLocation( sernum, &srcFolder, &idx );
@@ -3146,7 +3196,7 @@ void KMHandleAttachmentCommand::atmSave()
parts.append( mNode );
// save, do not leave encoded
KMSaveAttachmentsCommand *command =
- new KMSaveAttachmentsCommand( 0, parts, mMsg, false );
+ new KMSaveAttachmentsCommand( parentWidget(), parts, mMsg, false );
command->start();
}
@@ -3306,6 +3356,13 @@ AttachmentModifyCommand::AttachmentModifyCommand(partNode * node, KMMessage * ms
{
}
+AttachmentModifyCommand::AttachmentModifyCommand( int nodeId, KMMessage *msg, TQWidget *parent )
+ : KMCommand( parent, msg ),
+ mPartIndex( nodeId ),
+ mSernum( 0 )
+{
+}
+
AttachmentModifyCommand::~ AttachmentModifyCommand()
{
}
@@ -3370,31 +3427,14 @@ void AttachmentModifyCommand::messageDeleteResult(KMCommand * cmd)
deleteLater();
}
-DwBodyPart * AttachmentModifyCommand::findPart(KMMessage* msg, int index)
-{
- int accu = 0;
- return findPartInternal( msg->getTopLevelPart(), index, accu );
-}
-
-DwBodyPart * AttachmentModifyCommand::findPartInternal(DwEntity * root, int index, int & accu)
+KMDeleteAttachmentCommand::KMDeleteAttachmentCommand(partNode * node, KMMessage * msg, TQWidget * parent) :
+ AttachmentModifyCommand( node, msg, parent )
{
- accu++;
- if ( index < accu ) // should not happen
- return 0;
- DwBodyPart *current = dynamic_cast<DwBodyPart*>( root );
- if ( index == accu )
- return current;
- DwBodyPart *rv = 0;
- if ( root->Body().FirstBodyPart() )
- rv = findPartInternal( root->Body().FirstBodyPart(), index, accu );
- if ( !rv && current && current->Next() )
- rv = findPartInternal( current->Next(), index, accu );
- return rv;
+ kdDebug(5006) << k_funcinfo << endl;
}
-
-KMDeleteAttachmentCommand::KMDeleteAttachmentCommand(partNode * node, KMMessage * msg, TQWidget * parent) :
- AttachmentModifyCommand( node, msg, parent )
+KMDeleteAttachmentCommand::KMDeleteAttachmentCommand( int nodeId, KMMessage *msg, TQWidget *parent )
+ : AttachmentModifyCommand( nodeId, msg, parent )
{
kdDebug(5006) << k_funcinfo << endl;
}
@@ -3407,37 +3447,8 @@ KMDeleteAttachmentCommand::~KMDeleteAttachmentCommand()
KMCommand::Result KMDeleteAttachmentCommand::doAttachmentModify()
{
KMMessage *msg = retrievedMessage();
- KMMessagePart part;
- DwBodyPart *dwpart = findPart( msg, mPartIndex );
- if ( !dwpart )
+ if ( !msg || !msg->deleteBodyPart( mPartIndex ) )
return Failed;
- KMMessage::bodyPart( dwpart, &part, true );
- if ( !part.isComplete() )
- return Failed;
-
- DwBody *parentNode = dynamic_cast<DwBody*>( dwpart->Parent() );
- if ( !parentNode )
- return Failed;
- parentNode->RemoveBodyPart( dwpart );
-
- // add dummy part to show that a attachment has been deleted
- KMMessagePart dummyPart;
- dummyPart.duplicate( part );
- TQString comment = i18n("This attachment has been deleted.");
- if ( !part.fileName().isEmpty() )
- comment = i18n( "The attachment '%1' has been deleted." ).arg( part.fileName() );
- dummyPart.setContentDescription( comment );
- dummyPart.setBodyEncodedBinary( TQByteArray() );
- TQCString cd = dummyPart.contentDisposition();
- if ( cd.find( "inline", 0, false ) == 0 ) {
- cd.replace( 0, 10, "attachment" );
- dummyPart.setContentDisposition( cd );
- } else if ( cd.isEmpty() ) {
- dummyPart.setContentDisposition( "attachment" );
- }
- DwBodyPart* newDwPart = msg->createDWBodyPart( &dummyPart );
- parentNode->AddBodyPart( newDwPart );
- msg->getTopLevelPart()->Assemble();
KMMessage *newMsg = new KMMessage();
newMsg->fromDwString( msg->asDwString() );
@@ -3455,6 +3466,13 @@ KMEditAttachmentCommand::KMEditAttachmentCommand(partNode * node, KMMessage * ms
mTempFile.setAutoDelete( true );
}
+KMEditAttachmentCommand::KMEditAttachmentCommand( int nodeId, KMMessage *msg, TQWidget *parent )
+ : AttachmentModifyCommand( nodeId, msg, parent )
+{
+ kdDebug(5006) << k_funcinfo << endl;
+ mTempFile.setAutoDelete( true );
+}
+
KMEditAttachmentCommand::~ KMEditAttachmentCommand()
{
}
@@ -3462,8 +3480,11 @@ KMEditAttachmentCommand::~ KMEditAttachmentCommand()
KMCommand::Result KMEditAttachmentCommand::doAttachmentModify()
{
KMMessage *msg = retrievedMessage();
+ if ( !msg )
+ return Failed;
+
KMMessagePart part;
- DwBodyPart *dwpart = findPart( msg, mPartIndex );
+ DwBodyPart *dwpart = msg->findPart( mPartIndex );
if ( !dwpart )
return Failed;
KMMessage::bodyPart( dwpart, &part, true );
@@ -3476,7 +3497,10 @@ KMCommand::Result KMEditAttachmentCommand::doAttachmentModify()
mTempFile.file()->writeBlock( part.bodyDecodedBinary() );
mTempFile.file()->flush();
- KMail::EditorWatcher *watcher = new KMail::EditorWatcher( KURL(mTempFile.file()->name()), part.typeStr() + "/" + part.subtypeStr(), false, this );
+ KMail::EditorWatcher *watcher =
+ new KMail::EditorWatcher( KURL( mTempFile.file()->name() ),
+ part.typeStr() + "/" + part.subtypeStr(),
+ false, this, parentWidget() );
connect( watcher, TQT_SIGNAL(editDone(KMail::EditorWatcher*)), TQT_SLOT(editDone(KMail::EditorWatcher*)) );
if ( !watcher->start() )
return Failed;
@@ -3502,7 +3526,7 @@ void KMEditAttachmentCommand::editDone(KMail::EditorWatcher * watcher)
// build the new message
KMMessage *msg = retrievedMessage();
KMMessagePart part;
- DwBodyPart *dwpart = findPart( msg, mPartIndex );
+ DwBodyPart *dwpart = msg->findPart( mPartIndex );
KMMessage::bodyPart( dwpart, &part, true );
DwBody *parentNode = dynamic_cast<DwBody*>( dwpart->Parent() );
@@ -3549,8 +3573,8 @@ KMCommand::Result CreateTodoCommand::execute()
tf.close();
KCalendarIface_stub *iface = new KCalendarIface_stub( kapp->dcopClient(), "korganizer", "CalendarIface" );
- iface->openTodoEditor( i18n("Mail: %1").arg( msg->subject() ), txt,
- uri, tf.name(), TQStringList(), "message/rfc822" );
+ iface->openTodoEditor( i18n("Mail: %1").arg( msg->subject() ), txt, uri,
+ tf.name(), TQStringList(), "message/rfc822", true );
delete iface;
return OK;