43#include "kmcommands.h" 
   50#include <mimelib/enum.h> 
   51#include <mimelib/field.h> 
   52#include <mimelib/mimepp.h> 
   53#include <mimelib/string.h> 
   54#include <tdeapplication.h> 
   55#include <dcopclient.h> 
   57#include <tqtextcodec.h> 
   58#include <tqpopupmenu.h> 
   59#include <tqeventloop.h> 
   61#include <libemailfunctions/email.h> 
   62#include <kdcopservicestarter.h> 
   64#include <tdefiledialog.h> 
   65#include <tdeabc/stdaddressbook.h> 
   66#include <tdeabc/addresseelist.h> 
   67#include <kdirselectdialog.h> 
   69#include <tdemessagebox.h> 
   70#include <tdeparts/browserextension.h> 
   73#include <kbookmarkmanager.h> 
   74#include <tdestandarddirs.h> 
   75#include <tdetempfile.h> 
   76#include <tdeimproxy.h> 
   77#include <kuserprofile.h> 
   80#include <tdeio/netaccess.h> 
   82#include <libkpimidentities/identitymanager.h> 
   84#include "actionscheduler.h" 
   85using KMail::ActionScheduler;
 
   86#include "mailinglist-magic.h" 
   87#include "kmaddrbook.h" 
   90#include "kmfiltermgr.h" 
   91#include "kmfoldermbox.h" 
   92#include "kmfolderimap.h" 
   93#include "kmfoldermgr.h" 
   95#include "headeritem.h" 
   96#include "kmmainwidget.h" 
   98#include "messagesender.h" 
   99#include "kmmsgpartdlg.h" 
  100#include "undostack.h" 
  101#include "kcursorsaver.h" 
  103#include "objecttreeparser.h" 
  104#include "csshelper.h" 
  105using KMail::ObjectTreeParser;
 
  106using KMail::FolderJob;
 
  107#include "chiasmuskeyselector.h" 
  108#include "mailsourceviewer.h" 
  109using KMail::MailSourceViewer;
 
  110#include "kmreadermainwin.h" 
  111#include "secondarywindow.h" 
  113#include "redirectdialog.h" 
  116#include "templateparser.h" 
  117#include "editorwatcher.h" 
  118#include "korghelper.h" 
  120#include "broadcaststatus.h" 
  121#include "globalsettings.h" 
  123#include <libtdepim/tdefileio.h> 
  124#include "kcalendariface_stub.h" 
  126#include "progressmanager.h" 
  127using KPIM::ProgressManager;
 
  128using KPIM::ProgressItem;
 
  129#include <kmime_mdn.h> 
  130using namespace KMime;
 
  132#include <kleo/specialjob.h> 
  133#include <kleo/cryptobackend.h> 
  134#include <kleo/cryptobackendfactory.h> 
  136#include <tqclipboard.h> 
  143  LaterDeleterWithCommandCompletion( KMCommand* command )
 
  144    :LaterDeleter( command ), m_result( KMCommand::Failed )
 
  147  ~LaterDeleterWithCommandCompletion()
 
  149    setResult( m_result );
 
  150    KMCommand *command = 
static_cast<KMCommand*
>( m_object );
 
  151    emit command->completed( command );
 
  153  void setResult( KMCommand::Result v ) { m_result = v; }
 
  155  KMCommand::Result m_result;
 
  159KMCommand::KMCommand( TQWidget *parent )
 
  160  : mProgressDialog( 0 ), mResult( Undefined ), mDeletesItself( false ),
 
  161    mEmitsCompletedItself( false ), mParent( parent )
 
  165KMCommand::KMCommand( TQWidget *parent, 
const TQPtrList<KMMsgBase> &msgList )
 
  166  : mProgressDialog( 0 ), mResult( Undefined ), mDeletesItself( false ),
 
  167    mEmitsCompletedItself( false ), mParent( parent ), mMsgList( msgList )
 
  171KMCommand::KMCommand( TQWidget *parent, KMMsgBase *msgBase )
 
  172  : mProgressDialog( 0 ), mResult( Undefined ), mDeletesItself( false ),
 
  173    mEmitsCompletedItself( false ), mParent( parent )
 
  175  mMsgList.append( msgBase );
 
  178KMCommand::KMCommand( TQWidget *parent, 
KMMessage *msg )
 
  179  : mProgressDialog( 0 ), mResult( Undefined ), mDeletesItself( false ),
 
  180    mEmitsCompletedItself( false ), mParent( parent )
 
  186KMCommand::~KMCommand()
 
  188  TQValueListIterator<TQGuardedPtr<KMFolder> > fit;
 
  189  for ( fit = mFolders.begin(); fit != mFolders.end(); ++fit ) {
 
  192    (*fit)->close(
"kmcommand");
 
  196KMCommand::Result KMCommand::result()
 
  198  if ( mResult == Undefined )
 
  199    kdDebug(5006) << k_funcinfo << 
"mResult is Undefined" << endl;
 
  203void KMCommand::start()
 
  205  TQTimer::singleShot( 0, 
this, TQ_SLOT( slotStart() ) );
 
  209const TQPtrList<KMMessage> KMCommand::retrievedMsgs()
 const 
  211  return mRetrievedMsgs;
 
  214KMMessage *KMCommand::retrievedMessage()
 const 
  216  return mRetrievedMsgs.getFirst();
 
  219TQWidget *KMCommand::parentWidget()
 const 
  224int KMCommand::mCountJobs = 0;
 
  226void KMCommand::slotStart()
 
  228  connect( 
this, TQ_SIGNAL( messagesTransfered( KMCommand::Result ) ),
 
  229           this, TQ_SLOT( slotPostTransfer( KMCommand::Result ) ) );
 
  230  kmkernel->filterMgr()->ref();
 
  232  if (mMsgList.find(0) != -1) {
 
  233      emit messagesTransfered( Failed );
 
  237  if ((mMsgList.count() == 1) &&
 
  238      (mMsgList.getFirst()->isMessage()) &&
 
  239      (mMsgList.getFirst()->parent() == 0))
 
  242    mRetrievedMsgs.append((
KMMessage*)mMsgList.getFirst());
 
  243    emit messagesTransfered( OK );
 
  247  for ( KMMsgBase *mb = mMsgList.first(); mb; mb = mMsgList.next() ) {
 
  249      if ( !mb->parent() ) {
 
  250        emit messagesTransfered( Failed );
 
  253        keepFolderOpen( mb->parent() );
 
  259  transferSelectedMsgs();
 
  262void KMCommand::slotPostTransfer( KMCommand::Result result )
 
  264  disconnect( 
this, TQ_SIGNAL( messagesTransfered( KMCommand::Result ) ),
 
  265              this, TQ_SLOT( slotPostTransfer( KMCommand::Result ) ) );
 
  269  TQPtrListIterator<KMMessage> it( mRetrievedMsgs );
 
  271  while ( (msg = it.current()) != 0 )
 
  277  kmkernel->filterMgr()->deref();
 
  278  if ( !emitsCompletedItself() )
 
  279    emit completed( 
this );
 
  280  if ( !deletesItself() )
 
  284void KMCommand::transferSelectedMsgs()
 
  287  if (KMCommand::mCountJobs > 0) {
 
  288    emit messagesTransfered( Failed );
 
  292  bool complete = 
true;
 
  293  KMCommand::mCountJobs = 0;
 
  295  mRetrievedMsgs.clear();
 
  296  mCountMsgs = mMsgList.count();
 
  302  if ( mCountMsgs > 0 ) {
 
  303    mProgressDialog = 
new KProgressDialog(mParent, 
"transferProgress",
 
  305      i18n(
"Please wait while the message is transferred",
 
  306        "Please wait while the %n messages are transferred", mMsgList.count()),
 
  308    mProgressDialog->setMinimumDuration(1000);
 
  310  for (KMMsgBase *mb = mMsgList.first(); mb; mb = mMsgList.next())
 
  314    if ( mb->isMessage() )
 
  319      int idx = folder->
find(mb);
 
  320      if (idx < 0) 
continue;
 
  321      thisMsg = folder->
getMsg(idx);
 
  323    if (!thisMsg) 
continue;
 
  325         thisMsg->parent()->folderType() == KMFolderTypeImap )
 
  328      thisMsg->parent()->ignoreJobsForMessage( thisMsg );
 
  331    if ( thisMsg->parent() && !thisMsg->
isComplete() &&
 
  332         ( !mProgressDialog || !mProgressDialog->wasCancelled() ) )
 
  334      kdDebug(5006)<<
"### INCOMPLETE\n";
 
  337      KMCommand::mCountJobs++;
 
  338      FolderJob *job = thisMsg->parent()->createJob(thisMsg);
 
  339      job->setCancellable( 
false );
 
  342      connect(job, TQ_SIGNAL(messageRetrieved(
KMMessage*)),
 
  343              this, TQ_SLOT(slotMsgTransfered(
KMMessage*)));
 
  345      connect(job, TQ_SIGNAL(finished()),
 
  346              this, TQ_SLOT(slotJobFinished()));
 
  347      connect(job, TQ_SIGNAL(progress(
unsigned long, 
unsigned long)),
 
  348              this, TQ_SLOT(slotProgress(
unsigned long, 
unsigned long)));
 
  354      mRetrievedMsgs.append(thisMsg);
 
  360    delete mProgressDialog;
 
  362    emit messagesTransfered( OK );
 
  365    if ( mProgressDialog ) {
 
  366      connect(mProgressDialog, TQ_SIGNAL(cancelClicked()),
 
  367              this, TQ_SLOT(slotTransferCancelled()));
 
  368      mProgressDialog->progressBar()->setTotalSteps(totalSize);
 
  373void KMCommand::slotMsgTransfered(
KMMessage* msg)
 
  375  if ( mProgressDialog && mProgressDialog->wasCancelled() ) {
 
  376    emit messagesTransfered( Canceled );
 
  381  mRetrievedMsgs.append(msg);
 
  384void KMCommand::slotProgress( 
unsigned long done, 
unsigned long  )
 
  386  mProgressDialog->progressBar()->setProgress( done );
 
  389void KMCommand::slotJobFinished()
 
  392  KMCommand::mCountJobs--;
 
  394  if ( mProgressDialog && mProgressDialog->wasCancelled() ) 
return;
 
  396  if ( (mCountMsgs - 
static_cast<int>(mRetrievedMsgs.count())) > KMCommand::mCountJobs )
 
  399    if ( mProgressDialog )
 
  400      mProgressDialog->hide();
 
  401    slotTransferCancelled();
 
  405  if ( mProgressDialog ) {
 
  406    mProgressDialog->setLabel(i18n(
"Please wait while the message is transferred",
 
  407          "Please wait while the %n messages are transferred", KMCommand::mCountJobs));
 
  409  if (KMCommand::mCountJobs == 0)
 
  412    delete mProgressDialog;
 
  414    emit messagesTransfered( OK );
 
  418void KMCommand::slotTransferCancelled()
 
  421  TQValueListIterator<TQGuardedPtr<KMFolder> > fit;
 
  422  for ( fit = mFolders.begin(); fit != mFolders.end(); ++fit ) {
 
  426    KMFolderImap *imapFolder = 
dynamic_cast<KMFolderImap*
>(folder);
 
  427    if (imapFolder && imapFolder->account()) {
 
  428      imapFolder->account()->killAllJobs();
 
  432  KMCommand::mCountJobs = 0;
 
  435  TQPtrListIterator<KMMessage> it( mRetrievedMsgs );
 
  437  while ( (msg = it.current()) != 0 )
 
  444    int idx = folder->
find(msg);
 
  447  mRetrievedMsgs.clear();
 
  448  emit messagesTransfered( Canceled );
 
  451void KMCommand::keepFolderOpen( 
KMFolder *folder )
 
  453  folder->
open( 
"kmcommand" );
 
  454  mFolders.append( folder );
 
  457KMMailtoComposeCommand::KMMailtoComposeCommand( 
const KURL &url,
 
  459  :mUrl( url ), mMessage( msg )
 
  463KMCommand::Result KMMailtoComposeCommand::execute()
 
  468  if ( mMessage && mMessage->parent() )
 
  469    id = mMessage->parent()->identity();
 
  475  KMail::Composer * win = KMail::makeComposer( msg, 
id );
 
  476  win->setCharset(
"", 
true);
 
  477  win->setFocusToSubject();
 
  484KMMailtoReplyCommand::KMMailtoReplyCommand( TQWidget *parent,
 
  485   const KURL &url, 
KMMessage *msg, 
const TQString &selection )
 
  486  :KMCommand( parent, msg ), mUrl( url ), mSelection( selection  )
 
  490KMCommand::Result KMMailtoReplyCommand::execute()
 
  494  if ( !msg || !msg->
codec() ) {
 
  500  KMail::Composer * win = KMail::makeComposer( rmsg, 0 );
 
  501  win->setCharset(msg->
codec()->mimeName(), 
true);
 
  502  win->setReplyFocus();
 
  509KMMailtoForwardCommand::KMMailtoForwardCommand( TQWidget *parent,
 
  511  :KMCommand( parent, msg ), mUrl( url )
 
  515KMCommand::Result KMMailtoForwardCommand::execute()
 
  519  if ( !msg || !msg->
codec() ) {
 
  525  KMail::Composer * win = KMail::makeComposer( fmsg );
 
  526  win->setCharset(msg->
codec()->mimeName(), 
true);
 
  533KMAddBookmarksCommand::KMAddBookmarksCommand( 
const KURL &url, TQWidget *parent )
 
  534  : KMCommand( parent ), mUrl( url )
 
  538KMCommand::Result KMAddBookmarksCommand::execute()
 
  540  TQString filename = locateLocal( 
"data", TQString::fromLatin1(
"konqueror/bookmarks.xml") );
 
  541  KBookmarkManager *bookManager = KBookmarkManager::managerForFile( filename,
 
  543  KBookmarkGroup group = bookManager->root();
 
  544  group.addBookmark( bookManager, mUrl.path(), KURL( mUrl ) );
 
  545  if( bookManager->save() ) {
 
  546    bookManager->emitChanged( group );
 
  552KMMailtoAddAddrBookCommand::KMMailtoAddAddrBookCommand( 
const KURL &url,
 
  554  : KMCommand( parent ), mUrl( url )
 
  558KMCommand::Result KMMailtoAddAddrBookCommand::execute()
 
  567KMMailtoOpenAddrBookCommand::KMMailtoOpenAddrBookCommand( 
const KURL &url,
 
  569  : KMCommand( parent ), mUrl( url )
 
  573KMCommand::Result KMMailtoOpenAddrBookCommand::execute()
 
  582KMUrlCopyCommand::KMUrlCopyCommand( 
const KURL &url, KMMainWidget *mainWidget )
 
  583  :mUrl( url ), mMainWidget( mainWidget )
 
  587KMCommand::Result KMUrlCopyCommand::execute()
 
  589  TQClipboard* clip = TQApplication::clipboard();
 
  591  if (mUrl.protocol() == 
"mailto") {
 
  594    clip->setSelectionMode( 
true );
 
  595    clip->setText( address );
 
  596    clip->setSelectionMode( 
false );
 
  597    clip->setText( address );
 
  598    KPIM::BroadcastStatus::instance()->setStatusMsg( i18n( 
"Address copied to clipboard." ));
 
  601    clip->setSelectionMode( 
true );
 
  602    clip->setText( mUrl.url() );
 
  603    clip->setSelectionMode( 
false );
 
  604    clip->setText( mUrl.url() );
 
  605    KPIM::BroadcastStatus::instance()->setStatusMsg( i18n( 
"URL copied to clipboard." ));
 
  612KMUrlOpenCommand::KMUrlOpenCommand( 
const KURL &url, 
KMReaderWin *readerWin )
 
  613  :mUrl( url ), mReaderWin( readerWin )
 
  617KMCommand::Result KMUrlOpenCommand::execute()
 
  619  if ( !mUrl.isEmpty() )
 
  620    mReaderWin->slotUrlOpen( mUrl, KParts::URLArgs() );
 
  626KMUrlSaveCommand::KMUrlSaveCommand( 
const KURL &url, TQWidget *parent )
 
  627  : KMCommand( parent ), mUrl( url )
 
  631KMCommand::Result KMUrlSaveCommand::execute()
 
  633  if ( mUrl.isEmpty() )
 
  635  KURL saveUrl = KFileDialog::getSaveURL(mUrl.fileName(), TQString(),
 
  637  if ( saveUrl.isEmpty() )
 
  639  if ( TDEIO::NetAccess::exists( saveUrl, 
false, parentWidget() ) )
 
  641    if (KMessageBox::warningContinueCancel(0,
 
  642        i18n(
"<qt>File <b>%1</b> exists.<br>Do you want to replace it?</qt>")
 
  643        .arg(saveUrl.prettyURL()), i18n(
"Save to File"), i18n(
"&Replace"))
 
  644        != KMessageBox::Continue)
 
  647  TDEIO::Job *job = TDEIO::file_copy(mUrl, saveUrl, -1, 
true);
 
  648  connect(job, TQ_SIGNAL(result(TDEIO::Job*)), TQ_SLOT(slotUrlSaveResult(TDEIO::Job*)));
 
  649  setEmitsCompletedItself( 
true );
 
  653void KMUrlSaveCommand::slotUrlSaveResult( TDEIO::Job *job )
 
  655  if ( job->error() ) {
 
  656    job->showErrorDialog();
 
  658    emit completed( 
this );
 
  662    emit completed( 
this );
 
  667KMEditMsgCommand::KMEditMsgCommand( TQWidget *parent, 
KMMessage *msg )
 
  668  :KMCommand( parent, msg )
 
  672KMCommand::Result KMEditMsgCommand::execute()
 
  675  if ( !msg || !msg->parent() ||
 
  676       ( !kmkernel->folderIsDraftOrOutbox( msg->parent() ) &&
 
  677         !kmkernel->folderIsTemplates( msg->parent() ) ) )
 
  685    parent->
take( parent->
find( msg ) );
 
  687  KMail::Composer * win = KMail::makeComposer();
 
  689  win->setMsg(msg, 
false, 
true);
 
  690  win->setFolder( parent );
 
  696KMUseTemplateCommand::KMUseTemplateCommand( TQWidget *parent, 
KMMessage *msg )
 
  697  :KMCommand( parent, msg )
 
  701KMCommand::Result KMUseTemplateCommand::execute()
 
  704  if ( !msg || !msg->parent() ||
 
  705       !kmkernel->folderIsTemplates( msg->parent() ) )
 
  716  KMail::Composer *win = KMail::makeComposer();
 
  718  win->setMsg( newMsg, 
false, 
true );
 
  724KMShowMsgSrcCommand::KMShowMsgSrcCommand( TQWidget *parent,
 
  726  :KMCommand( parent, msg ), mFixedFont( fixedFont )
 
  732KMCommand::Result KMShowMsgSrcCommand::execute()
 
  735  if ( !msg || !msg->
codec() ) {
 
  742  MailSourceViewer *viewer = 
new MailSourceViewer(); 
 
  743  viewer->setCaption( i18n(
"Message as Plain Text") );
 
  744  viewer->setText(str);
 
  746    viewer->setFont(TDEGlobalSettings::fixedFont());
 
  751  if (TQApplication::desktop()->isVirtualDesktop()) {
 
  752    int scnum = TQApplication::desktop()->screenNumber(TQCursor::pos());
 
  753    viewer->resize(TQApplication::desktop()->screenGeometry(scnum).width()/2,
 
  754                  2*TQApplication::desktop()->screenGeometry(scnum).height()/3);
 
  756    viewer->resize(TQApplication::desktop()->geometry().width()/2,
 
  757                  2*TQApplication::desktop()->geometry().height()/3);
 
  764static KURL subjectToUrl( 
const TQString & subject )
 
  775  const TQString filter = i18n( 
"*.mbox|email messages (*.mbox)\n*|all files (*)" );
 
  776  TQString cleanSubject = subject.stripWhiteSpace()
 
  777                                  .replace( TQDir::separator(), 
'_' )
 
  778                                  .replace( 
": ", 
"_" )
 
  781                                  .replace( 
'~', 
'_' );
 
  782  return KFileDialog::getSaveURL( cleanSubject, filter );
 
  785KMSaveMsgCommand::KMSaveMsgCommand( TQWidget *parent, 
KMMessage * msg )
 
  786  : KMCommand( parent ),
 
  788    mStandAloneMessage( 0 ),
 
  790    mTotalSize( msg ? msg->msgSize() : 0 )
 
  793  setDeletesItself( 
true );
 
  798  if ( msg->getMsgSerNum() != 0 ) {
 
  799    mMsgList.append( msg->getMsgSerNum() );
 
  800    if ( msg->parent() ) {
 
  801      msg->parent()->open( 
"kmsavemsgcommand" );
 
  804    mStandAloneMessage = msg;
 
  806  mUrl = subjectToUrl( msg->cleanSubject() );
 
  809KMSaveMsgCommand::KMSaveMsgCommand( TQWidget *parent,
 
  810                                    const TQPtrList<KMMsgBase> &msgList )
 
  811  : KMCommand( parent ),
 
  813    mStandAloneMessage( 0 ),
 
  817  if (!msgList.getFirst())
 
  819  setDeletesItself( 
true );
 
  820  KMMsgBase *msgBase = msgList.getFirst();
 
  825  TQPtrListIterator<KMMsgBase> it(msgList);
 
  826  while ( it.current() ) {
 
  827    mMsgList.append( (*it)->getMsgSerNum() );
 
  828    mTotalSize += (*it)->msgSize();
 
  829    if ((*it)->parent() != 0)
 
  830      (*it)->parent()->open(
"kmcommand");
 
  834  mUrl = subjectToUrl( msgBase->cleanSubject() );
 
  837KURL KMSaveMsgCommand::url()
 
  842KMCommand::Result KMSaveMsgCommand::execute()
 
  844  mJob = TDEIO::put( mUrl, S_IRUSR|S_IWUSR, 
false, 
false );
 
  845  mJob->slotTotalSize( mTotalSize );
 
  846  mJob->setAsyncDataEnabled( 
true );
 
  847  mJob->setReportDataSent( 
true );
 
  848  connect(mJob, TQ_SIGNAL(dataReq(TDEIO::Job*, TQByteArray &)),
 
  849    TQ_SLOT(slotSaveDataReq()));
 
  850  connect(mJob, TQ_SIGNAL(result(TDEIO::Job*)),
 
  851    TQ_SLOT(slotSaveResult(TDEIO::Job*)));
 
  852  setEmitsCompletedItself( 
true );
 
  856void KMSaveMsgCommand::slotSaveDataReq()
 
  858  int remainingBytes = mData.size() - mOffset;
 
  859  if ( remainingBytes > 0 ) {
 
  861    if ( remainingBytes > MAX_CHUNK_SIZE )
 
  862      remainingBytes = MAX_CHUNK_SIZE;
 
  865    data.duplicate( mData.data() + mOffset, remainingBytes );
 
  866    mJob->sendAsyncData( data );
 
  867    mOffset += remainingBytes;
 
  871  if ( mMsgListIndex < mMsgList.size() ) {
 
  880    const bool alreadyGot = p->
isMessage( idx );
 
  887        mUngetMsgs.append( msg );
 
  890        TQByteArray data = TQByteArray();
 
  891        mJob->sendAsyncData( data );
 
  895        slotMessageRetrievedForSaving( msg );
 
  899          FolderJob *job = msg->parent()->createJob( msg );
 
  900          job->setCancellable( 
false );
 
  901          connect(job, TQ_SIGNAL( messageRetrieved( 
KMMessage* ) ),
 
  902                  this, TQ_SLOT( slotMessageRetrievedForSaving( 
KMMessage* ) ) );
 
  907      mJob->slotError( TDEIO::ERR_ABORTED,
 
  908                       i18n(
"The message was removed while saving it. " 
  909                            "It has not been saved.") );
 
  912    if ( mStandAloneMessage ) {
 
  914      slotMessageRetrievedForSaving( mStandAloneMessage );
 
  915      mStandAloneMessage = 0;
 
  918      TQByteArray data = TQByteArray();
 
  919      mJob->sendAsyncData( data );
 
  924void KMSaveMsgCommand::slotMessageRetrievedForSaving(
KMMessage *msg)
 
  927    mData = KMFolderMbox::escapeFrom( msg->
asDwString() );
 
  936    if( mData.size() > (
unsigned int) MAX_CHUNK_SIZE )
 
  937      size = MAX_CHUNK_SIZE;
 
  941    data.duplicate( mData, size );
 
  942    mJob->sendAsyncData( data );
 
  947  if ( msg && msg->parent() && msg->getMsgSerNum() &&
 
  948       mUngetMsgs.contains( msg ) ) {
 
  952    assert( p == msg->parent() ); assert( idx >= 0 );
 
  954    p->
close(
"kmcommand");
 
  958void KMSaveMsgCommand::slotSaveResult(TDEIO::Job *job)
 
  962    if (job->error() == TDEIO::ERR_FILE_ALREADY_EXIST)
 
  964      if (KMessageBox::warningContinueCancel(0,
 
  965        i18n(
"File %1 exists.\nDo you want to replace it?")
 
  966        .arg(mUrl.prettyURL()), i18n(
"Save to File"), i18n(
"&Replace"))
 
  967        == KMessageBox::Continue) {
 
  970        mJob = TDEIO::put( mUrl, S_IRUSR|S_IWUSR, 
true, 
false );
 
  971        mJob->slotTotalSize( mTotalSize );
 
  972        mJob->setAsyncDataEnabled( 
true );
 
  973        mJob->setReportDataSent( 
true );
 
  974        connect(mJob, TQ_SIGNAL(dataReq(TDEIO::Job*, TQByteArray &)),
 
  975            TQ_SLOT(slotSaveDataReq()));
 
  976        connect(mJob, TQ_SIGNAL(result(TDEIO::Job*)),
 
  977            TQ_SLOT(slotSaveResult(TDEIO::Job*)));
 
  982      job->showErrorDialog();
 
  984      emit completed( 
this );
 
  989    emit completed( 
this );
 
  996KMOpenMsgCommand::KMOpenMsgCommand( TQWidget *parent, 
const KURL & url,
 
  997                                    const TQString & encoding )
 
  998  : KMCommand( parent ),
 
 1000    mEncoding( encoding )
 
 1002  setDeletesItself( 
true );
 
 1005KMCommand::Result KMOpenMsgCommand::execute()
 
 1007  if ( mUrl.isEmpty() ) {
 
 1008    mUrl = KFileDialog::getOpenURL( 
":OpenMessage", 
"message/rfc822 application/mbox",
 
 1009                                    parentWidget(), i18n(
"Open Message") );
 
 1011  if ( mUrl.isEmpty() ) {
 
 1012    setDeletesItself( 
false );
 
 1015  mJob = TDEIO::get( mUrl, 
false, 
false );
 
 1016  mJob->setReportDataSent( 
true );
 
 1017  connect( mJob, TQ_SIGNAL( data( TDEIO::Job *, 
const TQByteArray & ) ),
 
 1018           this, TQ_SLOT( slotDataArrived( TDEIO::Job*, 
const TQByteArray & ) ) );
 
 1019  connect( mJob, TQ_SIGNAL( result( TDEIO::Job * ) ),
 
 1020           TQ_SLOT( slotResult( TDEIO::Job * ) ) );
 
 1021  setEmitsCompletedItself( 
true );
 
 1025void KMOpenMsgCommand::slotDataArrived( TDEIO::Job *, 
const TQByteArray & data )
 
 1027  if ( data.isEmpty() )
 
 1030  mMsgString.append( data.data(), data.size() );
 
 1033void KMOpenMsgCommand::slotResult( TDEIO::Job *job )
 
 1035  if ( job->error() ) {
 
 1037    job->showErrorDialog();
 
 1038    setResult( Failed );
 
 1039    emit completed( 
this );
 
 1042    int startOfMessage = 0;
 
 1043    if ( mMsgString.compare( 0, 5, 
"From ", 5 ) == 0 ) {
 
 1044      startOfMessage = mMsgString.find( 
'\n' );
 
 1045      if ( startOfMessage == -1 ) {
 
 1046        KMessageBox::sorry( parentWidget(),
 
 1047                            i18n( 
"The file does not contain a message." ) );
 
 1048        setResult( Failed );
 
 1049        emit completed( 
this );
 
 1059      startOfMessage += 1; 
 
 1062    bool multipleMessages = 
true;
 
 1063    int endOfMessage = mMsgString.find( 
"\nFrom " );
 
 1064    if ( endOfMessage == -1 ) {
 
 1065      endOfMessage = mMsgString.length();
 
 1066      multipleMessages = 
false;
 
 1068    DwMessage *dwMsg = 
new DwMessage;
 
 1069    dwMsg->FromString( mMsgString.substr( startOfMessage,
 
 1070                                          endOfMessage - startOfMessage ) );
 
 1073    if ( dwMsg->Headers().NumFields() == 0 ) {
 
 1074      KMessageBox::sorry( parentWidget(),
 
 1075                          i18n( 
"The file does not contain a message." ) );
 
 1076      delete dwMsg; dwMsg = 0;
 
 1077      setResult( Failed );
 
 1078      emit completed( 
this );
 
 1088    KMReaderMainWin *win = 
new KMReaderMainWin();
 
 1089    win->showMsg( mEncoding, msg );
 
 1091    if ( multipleMessages )
 
 1092      KMessageBox::information( win,
 
 1093                                i18n( 
"The file contains multiple messages. " 
 1094                                      "Only the first message is shown." ) );
 
 1096    emit completed( 
this );
 
 1105KMReplyToCommand::KMReplyToCommand( TQWidget *parent, 
KMMessage *msg,
 
 1106                                    const TQString &selection )
 
 1107  : KMCommand( parent, msg ), mSelection( selection )
 
 1111KMCommand::Result KMReplyToCommand::execute()
 
 1115  if ( !msg || !msg->
codec() ) {
 
 1120  TQString accountName;
 
 1121  KMFolder* parentFolder = msg->parent();
 
 1123    KMFolderDir* parentFolderDir = parentFolder->parent();
 
 1124    while (parentFolderDir) {
 
 1125      TQString prettyURL = parentFolderDir->
prettyURL();
 
 1126      if (prettyURL != 
"") {
 
 1127        accountName = prettyURL;
 
 1129      parentFolderDir = parentFolderDir->parent();
 
 1133  KMMessage *reply = msg->
createReply( KMail::ReplySmart, mSelection, 
false, 
true, TQString(), accountName );
 
 1134  KMail::Composer * win = KMail::makeComposer( reply );
 
 1135  win->setCharset( msg->
codec()->mimeName(), 
true );
 
 1136  win->setReplyFocus();
 
 1143KMNoQuoteReplyToCommand::KMNoQuoteReplyToCommand( TQWidget *parent,
 
 1145  : KMCommand( parent, msg )
 
 1149KMCommand::Result KMNoQuoteReplyToCommand::execute()
 
 1153  if ( !msg || !msg->
codec() ) {
 
 1157  KMail::Composer * win = KMail::makeComposer( reply );
 
 1158  win->setCharset(msg->
codec()->mimeName(), 
true);
 
 1159  win->setReplyFocus(
false);
 
 1166KMReplyListCommand::KMReplyListCommand( TQWidget *parent,
 
 1167  KMMessage *msg, 
const TQString &selection )
 
 1168 : KMCommand( parent, msg ), mSelection( selection )
 
 1172KMCommand::Result KMReplyListCommand::execute()
 
 1176  if ( !msg || !msg->
codec() ) {
 
 1180  KMail::Composer * win = KMail::makeComposer( reply );
 
 1181  win->setCharset(msg->
codec()->mimeName(), 
true);
 
 1182  win->setReplyFocus(
false);
 
 1189KMReplyToAllCommand::KMReplyToAllCommand( TQWidget *parent,
 
 1190  KMMessage *msg, 
const TQString &selection )
 
 1191  :KMCommand( parent, msg ), mSelection( selection )
 
 1195KMCommand::Result KMReplyToAllCommand::execute()
 
 1199  if ( !msg || !msg->
codec() ) {
 
 1203  KMail::Composer * win = KMail::makeComposer( reply );
 
 1204  win->setCharset( msg->
codec()->mimeName(), 
true );
 
 1205  win->setReplyFocus();
 
 1212KMReplyAuthorCommand::KMReplyAuthorCommand( TQWidget *parent, 
KMMessage *msg,
 
 1213                                            const TQString &selection )
 
 1214  : KMCommand( parent, msg ), mSelection( selection )
 
 1218KMCommand::Result KMReplyAuthorCommand::execute()
 
 1222  if ( !msg || !msg->
codec() ) {
 
 1226  KMail::Composer * win = KMail::makeComposer( reply );
 
 1227  win->setCharset( msg->
codec()->mimeName(), 
true );
 
 1228  win->setReplyFocus();
 
 1235KMForwardInlineCommand::KMForwardInlineCommand( TQWidget *parent,
 
 1236  const TQPtrList<KMMsgBase> &msgList, uint identity )
 
 1237  : KMCommand( parent, msgList ),
 
 1238    mIdentity( identity )
 
 1242KMForwardInlineCommand::KMForwardInlineCommand( TQWidget *parent,
 
 1244  : KMCommand( parent, msg ),
 
 1245    mIdentity( identity )
 
 1249KMCommand::Result KMForwardInlineCommand::execute()
 
 1251  TQPtrList<KMMessage> msgList = retrievedMsgs();
 
 1253  if (msgList.count() >= 2) { 
 
 1256    TQPtrList<KMMessage> linklist;
 
 1257    for ( 
KMMessage *msg = msgList.first(); msg; msg = msgList.next() ) {
 
 1260        id = msg->
headerField( 
"X-KMail-Identity" ).stripWhiteSpace().toUInt();
 
 1263      linklist.append( msg );
 
 1273    for ( 
KMMessage *msg = linklist.first(); msg; msg = linklist.next() ) {
 
 1275      parser.setSelection( msg->
body() ); 
 
 1276      parser.process( msg, 0, 
true );
 
 1278      fwdMsg->
link( msg, KMMsgStatusForwarded );
 
 1282    KMail::Composer * win = KMail::makeComposer( fwdMsg, 
id );
 
 1283    win->setCharset(
"");
 
 1289    if ( !msg || !msg->
codec() )
 
 1295    uint 
id = msg->
headerField( 
"X-KMail-Identity" ).stripWhiteSpace().toUInt();
 
 1299      KMail::Composer * win = KMail::makeComposer( fwdMsg, 
id );
 
 1300      win->setCharset( fwdMsg->
codec()->mimeName(), 
true );
 
 1308KMForwardAttachedCommand::KMForwardAttachedCommand( TQWidget *parent,
 
 1309           const TQPtrList<KMMsgBase> &msgList, uint identity, KMail::Composer *win )
 
 1310  : KMCommand( parent, msgList ), mIdentity( identity ),
 
 1311    mWin( TQGuardedPtr<
KMail::Composer>( win ))
 
 1315KMForwardAttachedCommand::KMForwardAttachedCommand( TQWidget *parent,
 
 1316           KMMessage * msg, uint identity, KMail::Composer *win )
 
 1317  : KMCommand( parent, msg ), mIdentity( identity ),
 
 1318    mWin( TQGuardedPtr< 
KMail::Composer >( win ))
 
 1322KMCommand::Result KMForwardAttachedCommand::execute()
 
 1324  TQPtrList<KMMessage> msgList = retrievedMsgs();
 
 1327  if (msgList.count() >= 2) {
 
 1332  else if (msgList.count() == 1) {
 
 1335    fwdMsg->setSubject( msg->forwardSubject() );
 
 1342    mWin = KMail::makeComposer(fwdMsg, mIdentity);
 
 1345  for (
KMMessage *msg = msgList.first(); msg; msg = msgList.next()) {
 
 1350    KMMessagePart *msgPart = 
new KMMessagePart;
 
 1351    msgPart->setTypeStr(
"message");
 
 1352    msgPart->setSubtypeStr(
"rfc822");
 
 1353    msgPart->setName(
"forwarded message");
 
 1354    msgPart->setContentDescription(msg->
from()+
": "+msg->
subject());
 
 1355    msgPart->setContentDisposition( 
"inline" );
 
 1358    fwdMsg->
link(msg, KMMsgStatusForwarded);
 
 1359    mWin->addAttach(msgPart);
 
 1368KMForwardDigestCommand::KMForwardDigestCommand( TQWidget *parent,
 
 1369           const TQPtrList<KMMsgBase> &msgList, uint identity, KMail::Composer *win )
 
 1370  : KMCommand( parent, msgList ), mIdentity( identity ),
 
 1371    mWin( TQGuardedPtr<
KMail::Composer>( win ))
 
 1375KMForwardDigestCommand::KMForwardDigestCommand( TQWidget *parent,
 
 1376           KMMessage * msg, uint identity, KMail::Composer *win )
 
 1377  : KMCommand( parent, msg ), mIdentity( identity ),
 
 1378    mWin( TQGuardedPtr< 
KMail::Composer >( win ))
 
 1382KMCommand::Result KMForwardDigestCommand::execute()
 
 1384  TQPtrList<KMMessage> msgList = retrievedMsgs();
 
 1386  if ( msgList.count() < 2 )
 
 1391  KMMessagePart *msgPart = 
new KMMessagePart;
 
 1392  TQString msgPartText;
 
 1399  fwdMsg->mMsg->Headers().ContentType().CreateBoundary( 1 );
 
 1400  TQCString boundary( fwdMsg->mMsg->Headers().ContentType().Boundary().c_str() );
 
 1401  msgPartText = i18n(
"\nThis is a MIME digest forward. The content of the" 
 1402                     " message is contained in the attachment(s).\n\n\n");
 
 1404  for ( 
KMMessage *msg = msgList.first(); msg; msg = msgList.next() ) {
 
 1407      id = msg->
headerField( 
"X-KMail-Identity" ).stripWhiteSpace().toUInt();
 
 1409    msgPartText += 
"--";
 
 1410    msgPartText += TQString::fromLatin1( boundary );
 
 1411    msgPartText += 
"\nContent-Type: MESSAGE/RFC822";
 
 1412    msgPartText += TQString( 
"; CHARSET=%1" ).arg( TQString(msg->
charset()) );
 
 1413    msgPartText += 
'\n';
 
 1415    dwh.MessageId().CreateDefault();
 
 1416    msgPartText += TQString( 
"Content-ID: %1\n" ).arg( dwh.MessageId().AsString().c_str() );
 
 1417    msgPartText += TQString( 
"Content-Description: %1" ).arg( msg->
subject() );
 
 1418    if ( !msg->
subject().contains( 
"(fwd)" ) )
 
 1419      msgPartText += 
" (fwd)";
 
 1420    msgPartText += 
"\n\n";
 
 1426    msgPartText += 
'\n';
 
 1427    msgPartText += msg->
body();
 
 1428    msgPartText += 
'\n';     
 
 1430    fwdMsg->
link( msg, KMMsgStatusForwarded );
 
 1436  msgPartText += 
"--";
 
 1437  msgPartText += TQString::fromLatin1( boundary );
 
 1438  msgPartText += 
"--\n";
 
 1440  msgPart->setTypeStr( 
"MULTIPART" );
 
 1441  tmp.sprintf( 
"Digest; boundary=\"%s\"", boundary.data() );
 
 1442  msgPart->setSubtypeStr( tmp );
 
 1443  msgPart->setName( 
"unnamed" );
 
 1444  msgPart->setCte( DwMime::kCte7bit );   
 
 1445  msgPart->setContentDescription( TQString( 
"Digest of %1 messages." ).arg( msgCnt ) );
 
 1447  msgPart->setBodyEncoded( TQCString( msgPartText.ascii() ) );
 
 1449  KMail::Composer * win = KMail::makeComposer( fwdMsg, 
id );
 
 1450  win->addAttach( msgPart );
 
 1455KMRedirectCommand::KMRedirectCommand( TQWidget *parent,
 
 1457  : KMCommand( parent, msg )
 
 1461KMCommand::Result KMRedirectCommand::execute()
 
 1464  if ( !msg || !msg->
codec() )
 
 1468                      kmkernel->msgSender()->sendImmediate() );
 
 1469  if (dlg.exec()==TQDialog::Rejected) 
return Failed;
 
 1474  const KMail::MessageSender::SendMethod method = dlg.sendImmediate()
 
 1475    ? KMail::MessageSender::SendImmediate
 
 1476    : KMail::MessageSender::SendLater;
 
 1477  if ( !kmkernel->msgSender()->send( newMsg, method ) ) {
 
 1478    kdDebug(5006) << 
"KMRedirectCommand: could not redirect message (sending failed)" << endl;
 
 1485KMCustomReplyToCommand::KMCustomReplyToCommand( TQWidget *parent, 
KMMessage *msg,
 
 1486                                                const TQString &selection,
 
 1487                                                const TQString &tmpl )
 
 1488  : KMCommand( parent, msg ), mSelection( selection ), mTemplate( tmpl )
 
 1492KMCommand::Result KMCustomReplyToCommand::execute()
 
 1496  if ( !msg || !msg->
codec() ) {
 
 1500                                       false, 
true, mTemplate );
 
 1501  KMail::Composer * win = KMail::makeComposer( reply );
 
 1502  win->setCharset( msg->
codec()->mimeName(), 
true );
 
 1503  win->setReplyFocus();
 
 1510KMCustomReplyAllToCommand::KMCustomReplyAllToCommand( TQWidget *parent, 
KMMessage *msg,
 
 1511                                                      const TQString &selection,
 
 1512                                                      const TQString &tmpl )
 
 1513  : KMCommand( parent, msg ), mSelection( selection ), mTemplate( tmpl )
 
 1517KMCommand::Result KMCustomReplyAllToCommand::execute()
 
 1521  if ( !msg || !msg->
codec() ) {
 
 1525                                       false, 
true, mTemplate );
 
 1526  KMail::Composer * win = KMail::makeComposer( reply );
 
 1527  win->setCharset( msg->
codec()->mimeName(), 
true );
 
 1528  win->setReplyFocus();
 
 1535KMCustomForwardCommand::KMCustomForwardCommand( TQWidget *parent,
 
 1536  const TQPtrList<KMMsgBase> &msgList, uint identity, 
const TQString &tmpl )
 
 1537  : KMCommand( parent, msgList ),
 
 1538    mIdentity( identity ), mTemplate( tmpl )
 
 1542KMCustomForwardCommand::KMCustomForwardCommand( TQWidget *parent,
 
 1543  KMMessage *msg, uint identity, 
const TQString &tmpl )
 
 1544  : KMCommand( parent, msg ),
 
 1545    mIdentity( identity ), mTemplate( tmpl )
 
 1549KMCommand::Result KMCustomForwardCommand::execute()
 
 1551  TQPtrList<KMMessage> msgList = retrievedMsgs();
 
 1553  if (msgList.count() >= 2) { 
 
 1556    TQPtrList<KMMessage> linklist;
 
 1557    for ( 
KMMessage *msg = msgList.first(); msg; msg = msgList.next() ) {
 
 1560        id = msg->
headerField( 
"X-KMail-Identity" ).stripWhiteSpace().toUInt();
 
 1563      linklist.append( msg );
 
 1573    for ( 
KMMessage *msg = linklist.first(); msg; msg = linklist.next() ) {
 
 1575      parser.setSelection( msg->
body() ); 
 
 1576      parser.process( msg, 0, 
true );
 
 1578      fwdMsg->
link( msg, KMMsgStatusForwarded );
 
 1582    KMail::Composer * win = KMail::makeComposer( fwdMsg, 
id );
 
 1583    win->setCharset(
"");
 
 1589    if ( !msg || !msg->
codec() )
 
 1595    uint 
id = msg->
headerField( 
"X-KMail-Identity" ).stripWhiteSpace().toUInt();
 
 1599      KMail::Composer * win = KMail::makeComposer( fwdMsg, 
id );
 
 1600      win->setCharset( fwdMsg->
codec()->mimeName(), 
true );
 
 1608KMPrintCommand::KMPrintCommand( TQWidget *parent, 
KMMessage *msg,
 
 1610                                const KMail::HeaderStrategy *headerStrategy,
 
 1611                                bool htmlOverride, 
bool htmlLoadExtOverride,
 
 1612                                bool useFixedFont, 
const TQString & encoding )
 
 1613  : KMCommand( parent, msg ),
 
 1614    mHeaderStyle( headerStyle ), mHeaderStrategy( headerStrategy ),
 
 1615    mHtmlOverride( htmlOverride ),
 
 1616    mHtmlLoadExtOverride( htmlLoadExtOverride ),
 
 1617    mUseFixedFont( useFixedFont ), mEncoding( encoding )
 
 1619  if ( GlobalSettings::useDefaultFonts() )
 
 1620    mOverrideFont = TDEGlobalSettings::generalFont();
 
 1622    TDEConfigGroup fonts( KMKernel::config(), 
"Fonts" );
 
 1623    TQString tmp = fonts.readEntry( 
"print-font", TDEGlobalSettings::generalFont().toString() );
 
 1624    mOverrideFont.fromString( tmp );
 
 1629void KMPrintCommand::setOverrideFont( 
const TQFont& font )
 
 1631  mOverrideFont = font;
 
 1634KMCommand::Result KMPrintCommand::execute()
 
 1637  printWin.setPrinting( 
true );
 
 1638  printWin.readConfig();
 
 1639  if ( mHeaderStyle != 0 && mHeaderStrategy != 0 )
 
 1640    printWin.setHeaderStyleAndStrategy( mHeaderStyle, mHeaderStrategy );
 
 1641  printWin.setHtmlOverride( mHtmlOverride );
 
 1642  printWin.setHtmlLoadExtOverride( mHtmlLoadExtOverride );
 
 1643  printWin.setUseFixedFont( mUseFixedFont );
 
 1644  printWin.setOverrideEncoding( mEncoding );
 
 1645  printWin.cssHelper()->setPrintFont( mOverrideFont );
 
 1646  printWin.setDecryptMessageOverwrite( 
true );
 
 1647  printWin.setMsg( retrievedMessage(), 
true );
 
 1648  printWin.printMsg();
 
 1654KMSeStatusCommand::KMSeStatusCommand( KMMsgStatus status,
 
 1655  const TQValueList<TQ_UINT32> &serNums, 
bool toggle )
 
 1656  : mStatus( status ), mSerNums( serNums ), mToggle( toggle )
 
 1660KMCommand::Result KMSeStatusCommand::execute()
 
 1662  TQValueListIterator<TQ_UINT32> it;
 
 1665  bool parenStatus = 
false;
 
 1674      if (msg && (msg->status()&mStatus))
 
 1677        parenStatus = 
false;
 
 1680  TQMap< KMFolder*, TQValueList<int> > folderMap;
 
 1681  for ( it = mSerNums.begin(); it != mSerNums.end(); ++it ) {
 
 1689          if (msg->status()&mStatus)
 
 1693          if (myStatus != parenStatus)
 
 1699      folderMap[folder].append(idx);
 
 1702  TQMapIterator< KMFolder*, TQValueList<int> > it2 = folderMap.begin();
 
 1703  while ( it2 != folderMap.end() ) {
 
 1705     f->
setStatus( (*it2), mStatus, mToggle );
 
 1714KMFilterCommand::KMFilterCommand( 
const TQCString &field, 
const TQString &value )
 
 1715  : mField( field ), mValue( value )
 
 1719KMCommand::Result KMFilterCommand::execute()
 
 1721  kmkernel->filterMgr()->createFilter( mField, mValue );
 
 1727KMFilterActionCommand::KMFilterActionCommand( TQWidget *parent,
 
 1728                                              const TQPtrList<KMMsgBase> &msgList,
 
 1730  : KMCommand( parent, msgList ), mFilter( filter  )
 
 1732  TQPtrListIterator<KMMsgBase> it(msgList);
 
 1733  while ( it.current() ) {
 
 1734    serNumList.append( (*it)->getMsgSerNum() );
 
 1739KMCommand::Result KMFilterActionCommand::execute()
 
 1744  int msgCountToFilter = serNumList.count();
 
 1745  ProgressItem* progressItem =
 
 1746    ProgressManager::createProgressItem ( 
"filter"+ProgressManager::getUniqueID(),
 
 1747                                          i18n( 
"Filtering messages" ) );
 
 1748  progressItem->setTotalItems( msgCountToFilter );
 
 1749  TQValueList<TQ_UINT32>::const_iterator it;
 
 1750  for ( it = serNumList.begin(); it != serNumList.end(); it++ ) {
 
 1751    TQ_UINT32 serNum = *it;
 
 1752    int diff = msgCountToFilter - ++msgCount;
 
 1753    if ( diff < 10 || !( msgCount % 20 ) || msgCount <= 10 ) {
 
 1754      progressItem->updateProgress();
 
 1755      TQString statusMsg = i18n(
"Filtering message %1 of %2");
 
 1756      statusMsg = statusMsg.arg( msgCount ).arg( msgCountToFilter );
 
 1757      KPIM::BroadcastStatus::instance()->setStatusMsg( statusMsg );
 
 1758      tdeApp->eventLoop()->processEvents( TQEventLoop::ExcludeUserInput, 50 );
 
 1761    int filterResult = kmkernel->filterMgr()->process( serNum, mFilter );
 
 1762    if (filterResult == 2) {
 
 1764      perror(
"Critical error");
 
 1765      kmkernel->emergencyExit( i18n(
"Not enough free disk space?" ));
 
 1767    progressItem->incCompletedItems();
 
 1770  progressItem->setComplete();
 
 1776KMMetaFilterActionCommand::KMMetaFilterActionCommand( KMFilter *filter,
 
 1778                                                      KMMainWidget *main )
 
 1780      mFilter( filter ), mHeaders( headers ), mMainWidget( main )
 
 1784void KMMetaFilterActionCommand::start()
 
 1786  if (ActionScheduler::isEnabled() ) {
 
 1788    KMFilterMgr::FilterSet set = KMFilterMgr::All;
 
 1789    TQValueList<KMFilter*> filters;
 
 1790    filters.append( mFilter );
 
 1791    ActionScheduler *scheduler = 
new ActionScheduler( set, filters, mHeaders );
 
 1792    scheduler->setAlwaysMatch( 
true );
 
 1793    scheduler->setAutoDestruct( 
true );
 
 1795    int contentX, contentY;
 
 1796    HeaderItem *nextItem = mHeaders->prepareMove( &contentX, &contentY );
 
 1797    TQPtrList<KMMsgBase> msgList = *mHeaders->selectedMsgs(
true);
 
 1798    mHeaders->finalizeMove( nextItem, contentX, contentY );
 
 1800    for (KMMsgBase *msg = msgList.first(); msg; msg = msgList.next())
 
 1801      scheduler->execFilters( msg );
 
 1803    KMCommand *filterCommand =
 
 1804      new KMFilterActionCommand( mMainWidget,
 
 1805                                 *mHeaders->selectedMsgs(), mFilter );
 
 1806    filterCommand->start();
 
 1807    int contentX, contentY;
 
 1808    HeaderItem *item = mHeaders->prepareMove( &contentX, &contentY );
 
 1809    mHeaders->finalizeMove( item, contentX, contentY );
 
 1813FolderShortcutCommand::FolderShortcutCommand( KMMainWidget *mainwidget,
 
 1815    : mMainWidget( mainwidget ), mFolder( folder ), mAction( 0 )
 
 1820FolderShortcutCommand::~FolderShortcutCommand()
 
 1822  if ( mAction ) mAction->unplugAll();
 
 1826void FolderShortcutCommand::start()
 
 1828  mMainWidget->slotSelectFolder( mFolder );
 
 1831void FolderShortcutCommand::setAction( TDEAction* action )
 
 1836KMMailingListFilterCommand::KMMailingListFilterCommand( TQWidget *parent,
 
 1838  : KMCommand( parent, msg )
 
 1842KMCommand::Result KMMailingListFilterCommand::execute()
 
 1850  if ( !MailingList::name( msg, name, value ).isEmpty() ) {
 
 1851    kmkernel->filterMgr()->createFilter( name, value );
 
 1859void KMMenuCommand::folderToPopupMenu(
bool move,
 
 1860  TQObject *receiver, KMMenuToFolder *aMenuToFolder, TQPopupMenu *menu )
 
 1862  while ( menu->count() )
 
 1864    TQPopupMenu *popup = menu->findItem( menu->idAt( 0 ) )->popup();
 
 1868      menu->removeItemAt( 0 );
 
 1871  if (!kmkernel->imapFolderMgr()->dir().first() &&
 
 1872      !kmkernel->dimapFolderMgr()->dir().first())
 
 1874    makeFolderMenu( &kmkernel->folderMgr()->dir(), move,
 
 1875                    receiver, aMenuToFolder, menu );
 
 1878    TQPopupMenu* subMenu = 
new TQPopupMenu(menu);
 
 1879    makeFolderMenu( &kmkernel->folderMgr()->dir(),
 
 1880                    move, receiver, aMenuToFolder, subMenu );
 
 1881    menu->insertItem( i18n( 
"Local Folders" ), subMenu );
 
 1882    KMFolderDir* fdir = &kmkernel->imapFolderMgr()->dir();
 
 1883    for (KMFolderNode *node = fdir->first(); node; node = fdir->next()) {
 
 1886      subMenu = 
new TQPopupMenu(menu);
 
 1887      makeFolderMenu( node, move, receiver, aMenuToFolder, subMenu );
 
 1888      menu->insertItem( node->label(), subMenu );
 
 1890    fdir = &kmkernel->dimapFolderMgr()->dir();
 
 1891    for (KMFolderNode *node = fdir->first(); node; node = fdir->next()) {
 
 1894      subMenu = 
new TQPopupMenu(menu);
 
 1895      makeFolderMenu( node, move, receiver, aMenuToFolder, subMenu );
 
 1896      menu->insertItem( node->label(), subMenu );
 
 1901void KMMenuCommand::makeFolderMenu(KMFolderNode* node, 
bool move,
 
 1902  TQObject *receiver, KMMenuToFolder *aMenuToFolder, TQPopupMenu *menu )
 
 1907    disconnect(menu, TQ_SIGNAL(activated(
int)), receiver,
 
 1908           TQ_SLOT(moveSelectedToFolder(
int)));
 
 1909    connect(menu, TQ_SIGNAL(activated(
int)), receiver,
 
 1910             TQ_SLOT(moveSelectedToFolder(
int)));
 
 1912    disconnect(menu, TQ_SIGNAL(activated(
int)), receiver,
 
 1913           TQ_SLOT(copySelectedToFolder(
int)));
 
 1914    connect(menu, TQ_SIGNAL(activated(
int)), receiver,
 
 1915             TQ_SLOT(copySelectedToFolder(
int)));
 
 1920  if (node->isDir()) {
 
 1923    folder = 
static_cast<KMFolder*
>(node);
 
 1924    folderDir = folder->
child();
 
 1931      menuId = menu->insertItem(i18n(
"Move to This Folder"));
 
 1933      menuId = menu->insertItem(i18n(
"Copy to This Folder"));
 
 1934    aMenuToFolder->insert( menuId, folder );
 
 1935    menu->setItemEnabled( menuId, !folder->
isReadOnly() );
 
 1936    menu->insertSeparator();
 
 1942  for (KMFolderNode *it = folderDir->first(); it; it = folderDir->next() ) {
 
 1946    TQString label = child->
label();
 
 1947    label.replace(
"&",
"&&");
 
 1948    if (child->
child() && child->
child()->first()) {
 
 1950      TQPopupMenu *subMenu = 
new TQPopupMenu(menu, 
"subMenu");
 
 1951      makeFolderMenu( child, move, receiver,
 
 1952                      aMenuToFolder, subMenu );
 
 1953      menu->insertItem( label, subMenu );
 
 1956      int menuId = menu->insertItem( label );
 
 1957      aMenuToFolder->insert( menuId, child );
 
 1958      menu->setItemEnabled( menuId, !child->
isReadOnly() );
 
 1965KMCopyCommand::KMCopyCommand( 
KMFolder* destFolder,
 
 1966                              const TQPtrList<KMMsgBase> &msgList )
 
 1967:mDestFolder( destFolder ), mMsgList( msgList )
 
 1969  setDeletesItself( 
true );
 
 1973  :mDestFolder( destFolder )
 
 1975  setDeletesItself( 
true );
 
 1979KMCommand::Result KMCopyCommand::execute()
 
 1985  TQPtrList<KMMessage> list;
 
 1986  TQPtrList<KMMessage> localList;
 
 1988  if (mDestFolder && mDestFolder->open(
"kmcommand") != 0)
 
 1994  setEmitsCompletedItself( 
true );
 
 1997  for (msgBase = mMsgList.first(); msgBase; msgBase = mMsgList.next() )
 
 1999    KMFolder *srcFolder = msgBase->parent();
 
 2000    if (( isMessage = msgBase->isMessage() ))
 
 2004      idx = srcFolder->
find(msgBase);
 
 2006      msg = srcFolder->
getMsg(idx);
 
 2009        KMessageBox::error( parentWidget(), i18n(
"Corrupt IMAP cache detected in folder %1. " 
 2010            "Copying of messages aborted.").arg( srcFolder->
prettyURL() ) );
 
 2016    if (srcFolder && mDestFolder &&
 
 2017        (srcFolder->
folderType()== KMFolderTypeImap) &&
 
 2018        (mDestFolder->folderType() == KMFolderTypeImap) &&
 
 2019        (
static_cast<KMFolderImap*
>(srcFolder->storage())->account() ==
 
 2020         static_cast<KMFolderImap*
>(mDestFolder->storage())->account()))
 
 2025      newMsg = 
new KMMessage( 
new DwMessage( *msg->asDwMessage() ) );
 
 2035        newMsg->setParent(msg->parent());
 
 2036        FolderJob *job = srcFolder->
createJob(newMsg);
 
 2037        job->setCancellable( 
false );
 
 2038        mPendingJobs << job;
 
 2039        connect(job, TQ_SIGNAL(messageRetrieved(
KMMessage*)),
 
 2040                mDestFolder, TQ_SLOT(reallyAddCopyOfMsg(
KMMessage*)));
 
 2041        connect( job, TQ_SIGNAL(result(KMail::FolderJob*)),
 
 2042                 this, TQ_SLOT(slotJobFinished(KMail::FolderJob*)) );
 
 2046        localList.append(newMsg);
 
 2050    if (srcFolder && !isMessage && list.isEmpty())
 
 2058  bool deleteNow = 
false;
 
 2059  if (!localList.isEmpty())
 
 2061    TQValueList<int> index;
 
 2062    mDestFolder->addMsg( localList, index );
 
 2063    for ( TQValueListIterator<int> it = index.begin(); it != index.end(); ++it ) {
 
 2064      mDestFolder->unGetMsg( *it );
 
 2066    if ( mDestFolder->folderType() == KMFolderTypeImap ) {
 
 2067      if ( mPendingJobs.isEmpty() ) {
 
 2069        KMFolderImap *imapDestFolder = 
static_cast<KMFolderImap*
>(mDestFolder->storage());
 
 2070        connect( imapDestFolder, TQ_SIGNAL( folderComplete( KMFolderImap*, 
bool ) ),
 
 2071            this, TQ_SLOT( slotFolderComplete( KMFolderImap*, 
bool ) ) );
 
 2074      deleteNow = list.isEmpty() && mPendingJobs.isEmpty(); 
 
 2080  if (!list.isEmpty())
 
 2083    KMFolderImap *imapDestFolder = 
static_cast<KMFolderImap*
>(mDestFolder->storage());
 
 2084    connect( imapDestFolder, TQ_SIGNAL( folderComplete( KMFolderImap*, 
bool ) ),
 
 2085        this, TQ_SLOT( slotFolderComplete( KMFolderImap*, 
bool ) ) );
 
 2086    imapDestFolder->copyMsg(list);
 
 2087    imapDestFolder->getFolder();
 
 2094    mDestFolder->close(
"kmcommand");
 
 2096    emit completed( 
this );
 
 2103void KMCopyCommand::slotJobFinished(KMail::FolderJob * job)
 
 2105  mPendingJobs.remove( job );
 
 2106  if ( job->error() ) {
 
 2107    kdDebug(5006) << k_funcinfo << 
"folder job failed: " << job->error() << endl;
 
 2109    for ( TQValueList<KMail::FolderJob*>::Iterator it = mPendingJobs.begin(); it != mPendingJobs.end(); ++it ) {
 
 2110      disconnect( (*it), TQ_SIGNAL(result(KMail::FolderJob*)),
 
 2111                  this, TQ_SLOT(slotJobFinished(KMail::FolderJob*)) );
 
 2114    mPendingJobs.clear();
 
 2115    setResult( Failed );
 
 2118  if ( mPendingJobs.isEmpty() )
 
 2120    mDestFolder->close(
"kmcommand");
 
 2121    emit completed( 
this );
 
 2126void KMCopyCommand::slotFolderComplete( KMFolderImap*, 
bool success )
 
 2128  kdDebug(5006) << k_funcinfo << success << endl;
 
 2130    setResult( Failed );
 
 2131  mDestFolder->close( 
"kmcommand" );
 
 2132  emit completed( 
this );
 
 2137KMMoveCommand::KMMoveCommand( 
KMFolder* destFolder,
 
 2138                              const TQPtrList<KMMsgBase> &msgList)
 
 2139  : mDestFolder( destFolder ), mProgressItem( 0 )
 
 2141  TQPtrList<KMMsgBase> tmp = msgList;
 
 2142  for ( KMMsgBase *msgBase = tmp.first(); msgBase; msgBase = tmp.next() )
 
 2143    mSerNumList.append( msgBase->getMsgSerNum() );
 
 2146KMMoveCommand::KMMoveCommand( 
KMFolder* destFolder,
 
 2148  : mDestFolder( destFolder ), mProgressItem( 0 )
 
 2150  mSerNumList.append( msg->getMsgSerNum() );
 
 2153KMMoveCommand::KMMoveCommand( 
KMFolder* destFolder,
 
 2154                              KMMsgBase *msgBase )
 
 2155  : mDestFolder( destFolder ), mProgressItem( 0 )
 
 2157  mSerNumList.append( msgBase->getMsgSerNum() );
 
 2160KMMoveCommand::KMMoveCommand( TQ_UINT32 )
 
 2161  : mProgressItem( 0 )
 
 2165KMCommand::Result KMMoveCommand::execute()
 
 2167  setEmitsCompletedItself( 
true );
 
 2168  setDeletesItself( 
true );
 
 2169  typedef TQMap< KMFolder*, TQPtrList<KMMessage>* > FolderToMessageListMap;
 
 2170  FolderToMessageListMap folderDeleteList;
 
 2172  if (mDestFolder && mDestFolder->open(
"kmcommand") != 0) {
 
 2173    completeMove( Failed );
 
 2179  Q_ASSERT( !mProgressItem );
 
 2181     ProgressManager::createProgressItem (
 
 2182         "move"+ProgressManager::getUniqueID(),
 
 2183         mDestFolder ? i18n( 
"Moving messages" ) : i18n( 
"Deleting messages" ) );
 
 2184  connect( mProgressItem, TQ_SIGNAL( progressItemCanceled( KPIM::ProgressItem* ) ),
 
 2185           this, TQ_SLOT( slotMoveCanceled() ) );
 
 2190  TQPtrList<KMMessage> list;
 
 2192  mCompleteWithAddedMsg = 
false;
 
 2195    connect (mDestFolder, TQ_SIGNAL(msgAdded(
KMFolder*, TQ_UINT32)),
 
 2196             this, TQ_SLOT(slotMsgAddedToDestFolder(
KMFolder*, TQ_UINT32)));
 
 2197    mLostBoys = mSerNumList;
 
 2199  mProgressItem->setTotalItems( mSerNumList.count() );
 
 2201  for ( TQValueList<TQ_UINT32>::ConstIterator it = mSerNumList.constBegin(); it != mSerNumList.constEnd(); ++it ) {
 
 2203      kdDebug(5006) << k_funcinfo << 
"serial number == 0!" << endl;
 
 2209    if (srcFolder == mDestFolder)
 
 2214      srcFolder->
open( 
"kmmovecommand" );
 
 2215      mOpenedFolders.append( srcFolder );
 
 2217    msg = srcFolder->
getMsg(idx);
 
 2219      kdDebug(5006) << k_funcinfo << 
"No message found for serial number " << *it << endl;
 
 2222    bool undo = msg->enableUndo();
 
 2225         srcFolder->
folderType() == KMFolderTypeImap )
 
 2229      static_cast<KMFolderImap*
>(srcFolder->storage())->ignoreJobsForMessage( msg );
 
 2233      if (mDestFolder->folderType() == KMFolderTypeImap) {
 
 2237        KMFolderImap *imapFolder = 
static_cast<KMFolderImap*
> ( mDestFolder->storage() );
 
 2238        disconnect (imapFolder, TQ_SIGNAL(folderComplete( KMFolderImap*, 
bool )),
 
 2239                 this, TQ_SLOT(slotImapFolderCompleted( KMFolderImap*, 
bool )));
 
 2241        connect (imapFolder, TQ_SIGNAL(folderComplete( KMFolderImap*, 
bool )),
 
 2242                 this, TQ_SLOT(slotImapFolderCompleted( KMFolderImap*, 
bool )));
 
 2246        if ( srcFolder->
folderType() == KMFolderTypeImap )
 
 2249          mCompleteWithAddedMsg = 
true;
 
 2251        rc = mDestFolder->moveMsg(msg, &index);
 
 2252        if (rc == 0 && index != -1) {
 
 2253          KMMsgBase *mb = mDestFolder->unGetMsg( mDestFolder->count() - 1 );
 
 2257              undoId = kmkernel->undoStack()->newUndoAction( srcFolder, mDestFolder );
 
 2258            kmkernel->undoStack()->addMsgToAction( undoId, mb->getMsgSerNum() );
 
 2260        } 
else if (rc != 0) {
 
 2263          completeMove( Failed );
 
 2270      if (srcFolder->
folderType() == KMFolderTypeImap) {
 
 2271        if (!folderDeleteList[srcFolder])
 
 2272          folderDeleteList[srcFolder] = 
new TQPtrList<KMMessage>;
 
 2273        folderDeleteList[srcFolder]->append( msg );
 
 2275        srcFolder->removeMsg(idx);
 
 2280  if (!list.isEmpty() && mDestFolder) {
 
 2282    mDestFolder->moveMsg(list, &index);
 
 2284    FolderToMessageListMap::Iterator it;
 
 2285    for ( it = folderDeleteList.begin(); it != folderDeleteList.end(); ++it ) {
 
 2286      it.key()->removeMsg(*it.data());
 
 2289    if ( !mCompleteWithAddedMsg ) {
 
 2298void KMMoveCommand::slotImapFolderCompleted(KMFolderImap* imapFolder, 
bool success)
 
 2300  disconnect (imapFolder, TQ_SIGNAL(folderComplete( KMFolderImap*, 
bool )),
 
 2301      this, TQ_SLOT(slotImapFolderCompleted( KMFolderImap*, 
bool )));
 
 2309    if ( !mLostBoys.isEmpty() ) {
 
 2310      kdDebug(5006) <<  
"### Not all moved messages reported back that they were " << endl
 
 2311                    <<  
"### added to the target folder. Did uidValidity change? " << endl;
 
 2316    completeMove( Failed );
 
 2320void KMMoveCommand::slotMsgAddedToDestFolder(
KMFolder *folder, TQ_UINT32 serNum)
 
 2322  if ( folder != mDestFolder || mLostBoys.find( serNum ) == mLostBoys.end() ) {
 
 2327  mLostBoys.remove(serNum);
 
 2328  if ( mLostBoys.isEmpty() ) {
 
 2330    disconnect (mDestFolder, TQ_SIGNAL(msgAdded(
KMFolder*, TQ_UINT32)),
 
 2331             this, TQ_SLOT(slotMsgAddedToDestFolder(
KMFolder*, TQ_UINT32)));
 
 2332    if (mDestFolder && mDestFolder->folderType() != KMFolderTypeImap) {
 
 2333      mDestFolder->sync();
 
 2335    if ( mCompleteWithAddedMsg ) {
 
 2339    if ( mProgressItem ) {
 
 2340      mProgressItem->incCompletedItems();
 
 2341      mProgressItem->updateProgress();
 
 2346void KMMoveCommand::completeMove( Result result )
 
 2349    mDestFolder->close(
"kmcommand");
 
 2350  while ( !mOpenedFolders.empty() ) {
 
 2351    KMFolder *folder = mOpenedFolders.back();
 
 2352    mOpenedFolders.pop_back();
 
 2353    folder->
close(
"kmcommand");
 
 2355  if ( mProgressItem ) {
 
 2356    mProgressItem->setComplete();
 
 2359  setResult( result );
 
 2360  emit completed( 
this );
 
 2364void KMMoveCommand::slotMoveCanceled()
 
 2366  completeMove( Canceled );
 
 2370KMDeleteMsgCommand::KMDeleteMsgCommand( 
KMFolder* srcFolder,
 
 2371  const TQPtrList<KMMsgBase> &msgList )
 
 2372:KMMoveCommand( findTrashFolder( srcFolder ), msgList)
 
 2374  srcFolder->
open(
"kmcommand");
 
 2375  mOpenedFolders.push_back( srcFolder );
 
 2379:KMMoveCommand( findTrashFolder( srcFolder ), msg)
 
 2381  srcFolder->
open(
"kmcommand");
 
 2382  mOpenedFolders.push_back( srcFolder );
 
 2385KMDeleteMsgCommand::KMDeleteMsgCommand( TQ_UINT32 sernum )
 
 2386:KMMoveCommand( sernum )
 
 2397    KMMsgBase *msg = srcFolder->
getMsgBase( idx );
 
 2398    srcFolder->
open(
"kmcommand");
 
 2399    mOpenedFolders.push_back( srcFolder );
 
 2402  setDestFolder( findTrashFolder( srcFolder ) );
 
 2409    trash = kmkernel->trashFolder();
 
 2410  if( trash != folder )
 
 2416KMUrlClickedCommand::KMUrlClickedCommand( 
const KURL &url, uint identity,
 
 2417  KMReaderWin *readerWin, 
bool htmlPref, KMMainWidget *mainWidget )
 
 2418  :mUrl( url ), mIdentity( identity ), mReaderWin( readerWin ),
 
 2419   mHtmlPref( htmlPref ), mMainWidget( mainWidget )
 
 2423KMCommand::Result KMUrlClickedCommand::execute()
 
 2427  if (mUrl.protocol() == 
"mailto")
 
 2433    TQString query=mUrl.query();
 
 2434    while (!query.isEmpty()) {
 
 2436      int secondQuery = query.find(
'?',1);
 
 2437      if (secondQuery != -1)
 
 2438        queryPart = query.left(secondQuery);
 
 2441      query = query.mid(queryPart.length());
 
 2443      if (queryPart.left(9) == 
"?subject=")
 
 2444        msg->setSubject( KURL::decode_string(queryPart.mid(9)) );
 
 2445      else if (queryPart.left(6) == 
"?body=")
 
 2448        msg->
setBody( KURL::decode_string(queryPart.mid(6)).latin1() );
 
 2449      else if (queryPart.left(4) == 
"?cc=")
 
 2450        msg->setCc( KURL::decode_string(queryPart.mid(4)) );
 
 2453    KMail::Composer * win = KMail::makeComposer( msg, mIdentity );
 
 2454    win->setCharset(
"", 
true);
 
 2457  else if ( mUrl.protocol() == 
"im" )
 
 2459    kmkernel->imProxy()->chatWithContact( mUrl.path() );
 
 2461  else if ((mUrl.protocol() == 
"http") || (mUrl.protocol() == 
"https") ||
 
 2462           (mUrl.protocol() == 
"ftp")  || (mUrl.protocol() == 
"file")  ||
 
 2463           (mUrl.protocol() == 
"ftps") || (mUrl.protocol() == 
"sftp" ) ||
 
 2464           (mUrl.protocol() == 
"help") || (mUrl.protocol() == 
"vnc")   ||
 
 2465           (mUrl.protocol() == 
"smb")  || (mUrl.protocol() == 
"fish")  ||
 
 2466           (mUrl.protocol() == 
"news"))
 
 2468    KPIM::BroadcastStatus::instance()->setStatusMsg( i18n(
"Opening URL..."));
 
 2469    KMimeType::Ptr mime = KMimeType::findByURL( mUrl );
 
 2470    if (mime->name() == 
"application/x-desktop" ||
 
 2471        mime->name() == 
"application/x-executable" ||
 
 2472        mime->name() == 
"application/x-msdos-program" ||
 
 2473        mime->name() == 
"application/x-shellscript" )
 
 2475      if (KMessageBox::warningYesNo( 0, i18n( 
"<qt>Do you really want to execute <b>%1</b>?</qt>" )
 
 2476        .arg( mUrl.prettyURL() ), TQString(), i18n(
"Execute"), KStdGuiItem::cancel() ) != KMessageBox::Yes)
 
 2479    KRun * runner = 
new KRun( mUrl );
 
 2480    runner->setRunExecutables( 
false );
 
 2488KMSaveAttachmentsCommand::KMSaveAttachmentsCommand( TQWidget *parent, 
KMMessage *msg )
 
 2489  : KMCommand( parent, msg ), mImplicitAttachments( true ), mEncoded( false )
 
 2493KMSaveAttachmentsCommand::KMSaveAttachmentsCommand( TQWidget *parent, 
const TQPtrList<KMMsgBase>& msgs )
 
 2494  : KMCommand( parent, msgs ), mImplicitAttachments( true ), mEncoded( false )
 
 2498KMSaveAttachmentsCommand::KMSaveAttachmentsCommand( TQWidget *parent, TQPtrList<partNode>& attachments,
 
 2500  : KMCommand( parent ), mImplicitAttachments( false ), mEncoded( encoded )
 
 2502  for ( TQPtrListIterator<partNode> it( attachments ); it.current(); ++it ) {
 
 2503    mAttachmentMap.insert( it.current(), msg );
 
 2507KMCommand::Result KMSaveAttachmentsCommand::execute()
 
 2509  setEmitsCompletedItself( 
true );
 
 2510  if ( mImplicitAttachments ) {
 
 2511    TQPtrList<KMMessage> msgList = retrievedMsgs();
 
 2513    for ( TQPtrListIterator<KMMessage> itr( msgList );
 
 2514          ( msg = itr.current() );
 
 2516      partNode *rootNode = partNode::fromMessage( msg );
 
 2517      for ( partNode *child = rootNode; child;
 
 2518            child = child->firstChild() ) {
 
 2519        for ( partNode *node = child; node; node = node->nextSibling() ) {
 
 2520          if ( node->type() != DwMime::kTypeMultipart )
 
 2521            mAttachmentMap.insert( node, msg );
 
 2526  setDeletesItself( 
true );
 
 2528  KMLoadPartsCommand *command = 
new KMLoadPartsCommand( mAttachmentMap );
 
 2529  connect( command, TQ_SIGNAL( partsRetrieved() ),
 
 2530           this, TQ_SLOT( slotSaveAll() ) );
 
 2536void KMSaveAttachmentsCommand::slotSaveAll()
 
 2541  if ( mImplicitAttachments ) {
 
 2542    for ( PartNodeMessageMap::iterator it = mAttachmentMap.begin();
 
 2543          it != mAttachmentMap.end(); ) {
 
 2547      if ( it.key()->msgPart().fileName().stripWhiteSpace().isEmpty() &&
 
 2548           ( it.key()->msgPart().name().stripWhiteSpace().isEmpty() ||
 
 2549             !it.key()->parentNode() ) ) {
 
 2550        PartNodeMessageMap::iterator delIt = it;
 
 2552        mAttachmentMap.remove( delIt );
 
 2557    if ( mAttachmentMap.isEmpty() ) {
 
 2558      KMessageBox::information( 0, i18n(
"Found no attachments to save.") );
 
 2560      emit completed( 
this );
 
 2567  if ( mAttachmentMap.count() > 1 ) {
 
 2569    dirUrl = KDirSelectDialog::selectDirectory( TQString(), 
false,
 
 2571                                                i18n(
"Save Attachments To") );
 
 2572    if ( !dirUrl.isValid() ) {
 
 2573      setResult( Canceled );
 
 2574      emit completed( 
this );
 
 2580    dirUrl.adjustPath( 1 );
 
 2584    partNode *node = mAttachmentMap.begin().key();
 
 2587      node->msgPart().fileName().stripWhiteSpace().replace( 
':', 
'_' );
 
 2589      s = node->msgPart().name().stripWhiteSpace().replace( 
':', 
'_' );
 
 2591      s = i18n(
"filename for an unnamed attachment", 
"attachment.1");
 
 2592    url = KFileDialog::getSaveURL( s, TQString(), parentWidget(),
 
 2594    if ( url.isEmpty() ) {
 
 2595      setResult( Canceled );
 
 2596      emit completed( 
this );
 
 2602  TQMap< TQString, int > renameNumbering;
 
 2604  Result globalResult = OK;
 
 2605  int unnamedAtmCount = 0;
 
 2606  for ( PartNodeMessageMap::const_iterator it = mAttachmentMap.begin();
 
 2607        it != mAttachmentMap.end();
 
 2610    if ( !dirUrl.isEmpty() ) {
 
 2613        it.key()->msgPart().fileName().stripWhiteSpace().replace( 
':', 
'_' );
 
 2615        s = it.key()->msgPart().name().stripWhiteSpace().replace( 
':', 
'_' );
 
 2616      if ( s.isEmpty() ) {
 
 2618        s = i18n(
"filename for the %1-th unnamed attachment",
 
 2620            .arg( unnamedAtmCount );
 
 2622      curUrl.setFileName( s );
 
 2627    if ( !curUrl.isEmpty() ) {
 
 2631     TQString origFile = curUrl.fileName();
 
 2632     TQString file = origFile;
 
 2634     while ( renameNumbering.contains(file) ) {
 
 2636       int num = renameNumbering[file] + 1;
 
 2637       int dotIdx = file.findRev(
'.');
 
 2638       file = file.insert( (dotIdx>=0) ? dotIdx : file.length(), TQString(
"_") + TQString::number(num) );
 
 2640     curUrl.setFileName(file);
 
 2643     if ( !renameNumbering.contains(origFile))
 
 2644         renameNumbering[origFile] = 1;
 
 2646         renameNumbering[origFile]++;
 
 2648     if ( file != origFile ) {
 
 2649        if ( !renameNumbering.contains(file))
 
 2650            renameNumbering[file] = 1;
 
 2652            renameNumbering[file]++;
 
 2656      if ( TDEIO::NetAccess::exists( curUrl, 
false, parentWidget() ) ) {
 
 2657        if ( KMessageBox::warningContinueCancel( parentWidget(),
 
 2658              i18n( 
"A file named %1 already exists. Do you want to overwrite it?" )
 
 2659              .arg( curUrl.fileName() ),
 
 2660              i18n( 
"File Already Exists" ), i18n(
"&Overwrite") ) == KMessageBox::Cancel) {
 
 2665      const Result result = saveItem( it.key(), curUrl );
 
 2667        globalResult = result;
 
 2670  setResult( globalResult );
 
 2671  emit completed( 
this );
 
 2675KMCommand::Result KMSaveAttachmentsCommand::saveItem( partNode *node,
 
 2678  bool bSaveEncrypted = 
false;
 
 2679  bool bEncryptedParts = node->encryptionState() != KMMsgNotEncrypted;
 
 2680  if( bEncryptedParts )
 
 2681    if( KMessageBox::questionYesNo( parentWidget(),
 
 2682          i18n( 
"The part %1 of the message is encrypted. Do you want to keep the encryption when saving?" ).
 
 2683          arg( url.fileName() ),
 
 2684          i18n( 
"KMail Question" ), i18n(
"Keep Encryption"), i18n(
"Do Not Keep") ) ==
 
 2686      bSaveEncrypted = 
true;
 
 2688  bool bSaveWithSig = 
true;
 
 2689  if( node->signatureState() != KMMsgNotSigned )
 
 2690    if( KMessageBox::questionYesNo( parentWidget(),
 
 2691          i18n( 
"The part %1 of the message is signed. Do you want to keep the signature when saving?" ).
 
 2692          arg( url.fileName() ),
 
 2693          i18n( 
"KMail Question" ), i18n(
"Keep Signature"), i18n(
"Do Not Keep") ) !=
 
 2695      bSaveWithSig = 
false;
 
 2706    if( bSaveEncrypted || !bEncryptedParts) {
 
 2707      partNode *dataNode = node;
 
 2708      TQCString rawReplyString;
 
 2709      bool gotRawReplyString = 
false;
 
 2710      if( !bSaveWithSig ) {
 
 2711        if( DwMime::kTypeMultipart == node->type() &&
 
 2712            DwMime::kSubtypeSigned == node->subType() ){
 
 2714          if( node->findType( DwMime::kTypeApplication,
 
 2715                DwMime::kSubtypePgpSignature,
 
 2717            dataNode = node->findTypeNot( DwMime::kTypeApplication,
 
 2718                DwMime::kSubtypePgpSignature,
 
 2720          }
else if( node->findType( DwMime::kTypeApplication,
 
 2721                DwMime::kSubtypePkcs7Mime,
 
 2723            dataNode = node->findTypeNot( DwMime::kTypeApplication,
 
 2724                DwMime::kSubtypePkcs7Mime,
 
 2727            dataNode = node->findTypeNot( DwMime::kTypeMultipart,
 
 2728                DwMime::kSubtypeUnknown,
 
 2732      ObjectTreeParser otp( 0, 0, 
false, 
false, 
false );
 
 2735      dataNode->setProcessed( 
false, 
true );
 
 2736      otp.parseObjectTree( dataNode );
 
 2738      rawReplyString = otp.rawReplyString();
 
 2739      gotRawReplyString = 
true;
 
 2742      TQByteArray cstr = gotRawReplyString
 
 2744                         : dataNode->msgPart().bodyDecodedBinary();
 
 2746      size_t size = cstr.size();
 
 2747      if ( dataNode->msgPart().type() == DwMime::kTypeText ) {
 
 2751      data.resize( size );
 
 2757  tf.setAutoDelete( 
true );
 
 2758  if ( url.isLocalFile() )
 
 2761    file.setName( url.path() );
 
 2762    if ( !file.open( IO_WriteOnly ) )
 
 2764      KMessageBox::error( parentWidget(),
 
 2765          i18n( 
"%2 is detailed error description",
 
 2766            "Could not write the file %1:\n%2" )
 
 2768          .arg( TQString::fromLocal8Bit( strerror( errno ) ) ),
 
 2769          i18n( 
"KMail Error" ) );
 
 2774    if ( GlobalSettings::self()->disregardUmask() )
 
 2775      fchmod( file.handle(), S_IRUSR | S_IWUSR );
 
 2777    ds.setDevice( &file );
 
 2781    ds.setDevice( tf.file() );
 
 2784  ds.writeRawBytes( data.data(), data.size() );
 
 2785  if ( !url.isLocalFile() )
 
 2788    if ( !TDEIO::NetAccess::upload( tf.name(), url, parentWidget() ) )
 
 2790      KMessageBox::error( parentWidget(),
 
 2791          i18n( 
"Could not write the file %1." )
 
 2793          i18n( 
"KMail Error" ) );
 
 2801KMLoadPartsCommand::KMLoadPartsCommand( TQPtrList<partNode>& parts, 
KMMessage *msg )
 
 2802  : mNeedsRetrieval( 0 )
 
 2804  for ( TQPtrListIterator<partNode> it( parts ); it.current(); ++it ) {
 
 2805    mPartMap.insert( it.current(), msg );
 
 2809KMLoadPartsCommand::KMLoadPartsCommand( partNode *node, 
KMMessage *msg )
 
 2810  : mNeedsRetrieval( 0 )
 
 2812  mPartMap.insert( node, msg );
 
 2815KMLoadPartsCommand::KMLoadPartsCommand( PartNodeMessageMap& partMap )
 
 2816  : mNeedsRetrieval( 0 ), mPartMap( partMap )
 
 2820void KMLoadPartsCommand::slotStart()
 
 2822  for ( PartNodeMessageMap::const_iterator it = mPartMap.begin();
 
 2823        it != mPartMap.end();
 
 2825    if ( !it.key()->msgPart().isComplete() &&
 
 2826         !it.key()->msgPart().partSpecifier().isEmpty() ) {
 
 2829      KMFolder* curFolder = it.data()->parent();
 
 2832          curFolder->
createJob( it.data(), FolderJob::tGetMessage,
 
 2833                                0, it.key()->msgPart().partSpecifier() );
 
 2834        job->setCancellable( 
false );
 
 2835        connect( job, TQ_SIGNAL(messageUpdated(
KMMessage*, TQString)),
 
 2836                 this, TQ_SLOT(slotPartRetrieved(
KMMessage*, TQString)) );
 
 2839        kdWarning(5006) << 
"KMLoadPartsCommand - msg has no parent" << endl;
 
 2842  if ( mNeedsRetrieval == 0 )
 
 2846void KMLoadPartsCommand::slotPartRetrieved( 
KMMessage *msg,
 
 2847                                            TQString partSpecifier )
 
 2853    for ( PartNodeMessageMap::const_iterator it = mPartMap.begin();
 
 2854          it != mPartMap.end();
 
 2856      if ( it.key()->dwPart()->partId() == part->partId() )
 
 2857        it.key()->setDwPart( part );
 
 2860    kdWarning(5006) << 
"KMLoadPartsCommand::slotPartRetrieved - could not find bodypart!" << endl;
 
 2862  if ( mNeedsRetrieval == 0 )
 
 2866KMCommand::Result KMLoadPartsCommand::execute()
 
 2868  emit partsRetrieved();
 
 2870  emit completed( 
this );
 
 2875KMResendMessageCommand::KMResendMessageCommand( TQWidget *parent,
 
 2877  :KMCommand( parent, msg )
 
 2881KMCommand::Result KMResendMessageCommand::execute()
 
 2884   if ( !msg || !msg->
codec() ) {
 
 2889   TQStringList whiteList;
 
 2890   whiteList << 
"To" << 
"Cc" << 
"Bcc" << 
"Subject";
 
 2893   if( newMsg->type() == DwMime::kTypeText) {
 
 2896   newMsg->setParent( 0 );
 
 2902   KMail::Composer * win = KMail::makeComposer();
 
 2903   win->setMsg(newMsg, 
false, 
true);
 
 2909KMMailingListCommand::KMMailingListCommand( TQWidget *parent, 
KMFolder *folder )
 
 2910  : KMCommand( parent ), mFolder( folder )
 
 2914KMCommand::Result KMMailingListCommand::execute()
 
 2916  KURL::List lst = urls();
 
 2917  TQString handler = ( mFolder->mailingList().handler() == MailingList::KMail )
 
 2918    ? 
"mailto" : 
"https";
 
 2920  KMCommand *command = 0;
 
 2921  for ( KURL::List::Iterator itr = lst.begin(); itr != lst.end(); ++itr ) {
 
 2922    if ( handler == (*itr).protocol() ) {
 
 2923      command = 
new KMUrlClickedCommand( *itr, mFolder->identity(), 0, 
false );
 
 2926  if ( !command && !lst.empty() ) {
 
 2928      new KMUrlClickedCommand( lst.first(), mFolder->identity(), 0, 
false );
 
 2931    connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
 
 2932             this, TQ_SLOT( commandCompleted( KMCommand * ) ) );
 
 2933    setDeletesItself( 
true );
 
 2934    setEmitsCompletedItself( 
true );
 
 2941void KMMailingListCommand::commandCompleted( KMCommand *command )
 
 2943  setResult( command->result() );
 
 2944  emit completed( 
this );
 
 2948KMMailingListPostCommand::KMMailingListPostCommand( TQWidget *parent, 
KMFolder *folder )
 
 2949  : KMMailingListCommand( parent, folder )
 
 2952KURL::List KMMailingListPostCommand::urls()
 const 
 2954  return mFolder->mailingList().postURLS();
 
 2957KMMailingListSubscribeCommand::KMMailingListSubscribeCommand( TQWidget *parent, 
KMFolder *folder )
 
 2958  : KMMailingListCommand( parent, folder )
 
 2961KURL::List KMMailingListSubscribeCommand::urls()
 const 
 2963  return mFolder->mailingList().subscribeURLS();
 
 2966KMMailingListUnsubscribeCommand::KMMailingListUnsubscribeCommand( TQWidget *parent, 
KMFolder *folder )
 
 2967  : KMMailingListCommand( parent, folder )
 
 2970KURL::List KMMailingListUnsubscribeCommand::urls()
 const 
 2972  return mFolder->mailingList().unsubscribeURLS();
 
 2975KMMailingListArchivesCommand::KMMailingListArchivesCommand( TQWidget *parent, 
KMFolder *folder )
 
 2976  : KMMailingListCommand( parent, folder )
 
 2979KURL::List KMMailingListArchivesCommand::urls()
 const 
 2981  return mFolder->mailingList().archiveURLS();
 
 2984KMMailingListHelpCommand::KMMailingListHelpCommand( TQWidget *parent, 
KMFolder *folder )
 
 2985  : KMMailingListCommand( parent, folder )
 
 2988KURL::List KMMailingListHelpCommand::urls()
 const 
 2990  return mFolder->mailingList().helpURLS();
 
 2993KMIMChatCommand::KMIMChatCommand( 
const KURL &url, 
KMMessage *msg )
 
 2994  :mUrl( url ), mMessage( msg )
 
 2998KMCommand::Result KMIMChatCommand::execute()
 
 3000  kdDebug( 5006 ) << k_funcinfo << 
" URL is: " << mUrl << endl;
 
 3003  TDEABC::AddressBook *addressBook = TDEABC::StdAddressBook::self( 
true );
 
 3004  TDEABC::AddresseeList addressees = addressBook->findByEmail( KPIM::getEmailAddress( addr ) ) ;
 
 3007  if( addressees.count() == 1 ) {
 
 3008    kmkernel->imProxy()->chatWithContact( addressees[0].uid() );
 
 3013    kdDebug( 5006 ) << 
"Didn't find exactly one addressee, couldn't tell who to chat to for that email address.  Count = " << addressees.count() << endl;
 
 3016    if ( addressees.isEmpty() )
 
 3017      apology = i18n( 
"There is no Address Book entry for this email address. Add them to the Address Book and then add instant messaging addresses using your preferred messaging client." );
 
 3020      apology = i18n( 
"More than one Address Book entry uses this email address:\n %1\n it is not possible to determine who to chat with." );
 
 3021      TQStringList nameList;
 
 3022      TDEABC::AddresseeList::const_iterator it = addressees.begin();
 
 3023      TDEABC::AddresseeList::const_iterator end = addressees.end();
 
 3024      for ( ; it != end; ++it )
 
 3026          nameList.append( (*it).realName() );
 
 3028      TQString names = nameList.join( TQString::fromLatin1( 
",\n" ) );
 
 3029      apology = apology.arg( names );
 
 3032    KMessageBox::sorry( parentWidget(), apology );
 
 3037KMHandleAttachmentCommand::KMHandleAttachmentCommand( partNode* node,
 
 3038     KMMessage* msg, 
int atmId, 
const TQString& atmName,
 
 3039     AttachmentAction action, KService::Ptr offer, TQWidget* parent )
 
 3040: KMCommand( parent ), mNode( node ), mMsg( msg ), mAtmId( atmId ), mAtmName( atmName ),
 
 3041  mAction( action ), mOffer( offer ), mJob( 0 )
 
 3045void KMHandleAttachmentCommand::slotStart()
 
 3047  if ( !mNode->msgPart().isComplete() )
 
 3050    kdDebug(5006) << 
"load part" << endl;
 
 3051    KMLoadPartsCommand *command = 
new KMLoadPartsCommand( mNode, mMsg );
 
 3052    connect( command, TQ_SIGNAL( partsRetrieved() ),
 
 3053        this, TQ_SLOT( slotPartComplete() ) );
 
 3061void KMHandleAttachmentCommand::slotPartComplete()
 
 3066KMCommand::Result KMHandleAttachmentCommand::execute()
 
 3085    case ChiasmusEncrypt:
 
 3086      atmEncryptWithChiasmus();
 
 3090      kdDebug(5006) << 
"unknown action " << mAction << endl;
 
 3094  emit completed( 
this );
 
 3099TQString KMHandleAttachmentCommand::createAtmFileLink()
 const 
 3101  TQFileInfo atmFileInfo( mAtmName );
 
 3103  if ( atmFileInfo.size() == 0 )
 
 3105    kdDebug(5006) << k_funcinfo << 
"rewriting attachment" << endl;
 
 3107    TQByteArray data = mNode->msgPart().bodyDecodedBinary();
 
 3108    size_t size = data.size();
 
 3109    if ( mNode->msgPart().type() == DwMime::kTypeText && size) {
 
 3113    KPIM::kBytesToFile( data.data(), size, mAtmName, 
false, 
false, 
false );
 
 3116  KTempFile *linkFile = 
new KTempFile( locateLocal(
"tmp", atmFileInfo.fileName() +
"_["),
 
 3117                          "]."+ atmFileInfo.extension() );
 
 3119  linkFile->setAutoDelete(
true);
 
 3120  TQString linkName = linkFile->name();
 
 3123  if ( ::link(TQFile::encodeName( mAtmName ), TQFile::encodeName( linkName )) == 0 ) {
 
 3129KService::Ptr KMHandleAttachmentCommand::getServiceOffer()
 
 3131  KMMessagePart& msgPart = mNode->msgPart();
 
 3132  const TQString contentTypeStr =
 
 3133    ( msgPart.typeStr() + 
'/' + msgPart.subtypeStr() ).lower();
 
 3135  if ( contentTypeStr == 
"text/x-vcard" ) {
 
 3140  KMimeType::Ptr mimetype;
 
 3142  mimetype = KMimeType::mimeType( contentTypeStr );
 
 3143  if ( mimetype->name() == 
"application/octet-stream" ) {
 
 3145    mimetype = KMimeType::findByPath( mAtmName, 0, 
true  );
 
 3147  if ( ( mimetype->name() == 
"application/octet-stream" )
 
 3148       && msgPart.isComplete() ) {
 
 3151    mimetype = KMimeType::findByFileContent( mAtmName );
 
 3153  return KServiceTypeProfile::preferredService( mimetype->name(), 
"Application" );
 
 3156void KMHandleAttachmentCommand::atmOpen()
 
 3159    mOffer = getServiceOffer();
 
 3161    kdDebug(5006) << k_funcinfo << 
"got no offer" << endl;
 
 3167  bool autoDelete = 
true;
 
 3168  TQString fname = createAtmFileLink();
 
 3170  if ( fname.isNull() ) {
 
 3175  url.setPath( fname );
 
 3177  if ( (KRun::run( *mOffer, lst, autoDelete ) <= 0) && autoDelete ) {
 
 3178      TQFile::remove(url.path());
 
 3182void KMHandleAttachmentCommand::atmOpenWith()
 
 3186  bool autoDelete = 
true;
 
 3187  TQString fname = createAtmFileLink();
 
 3189  if ( fname.isNull() ) {
 
 3194  url.setPath( fname );
 
 3196  if ( (! KRun::displayOpenWithDialog(lst, autoDelete)) && autoDelete ) {
 
 3197    TQFile::remove( url.path() );
 
 3201void KMHandleAttachmentCommand::atmView()
 
 3204  emit showAttachment( mAtmId, mAtmName );
 
 3207void KMHandleAttachmentCommand::atmSave()
 
 3209  TQPtrList<partNode> parts;
 
 3210  parts.append( mNode );
 
 3212  KMSaveAttachmentsCommand *command =
 
 3213    new KMSaveAttachmentsCommand( parentWidget(), parts, mMsg, 
false );
 
 3217void KMHandleAttachmentCommand::atmProperties()
 
 3220  KMMessagePart& msgPart = mNode->msgPart();
 
 3221  dlg.setMsgPart( &msgPart );
 
 3225void KMHandleAttachmentCommand::atmEncryptWithChiasmus()
 
 3227  const partNode * node = mNode;
 
 3233  if ( !mAtmName.endsWith( 
".xia", 
false ) )
 
 3236  const Kleo::CryptoBackend::Protocol * chiasmus =
 
 3237    Kleo::CryptoBackendFactory::instance()->protocol( 
"Chiasmus" );
 
 3238  Q_ASSERT( chiasmus );
 
 3242  const STD_NAMESPACE_PREFIX unique_ptr<Kleo::SpecialJob> listjob( chiasmus->specialJob( 
"x-obtain-keys", TQStringVariantMap() ) );
 
 3244    const TQString msg = i18n( 
"Chiasmus backend does not offer the " 
 3245                              "\"x-obtain-keys\" function. Please report this bug." );
 
 3246    KMessageBox::error( parentWidget(), msg, i18n( 
"Chiasmus Backend Error" ) );
 
 3250  if ( listjob->exec() ) {
 
 3251    listjob->showErrorDialog( parentWidget(), i18n( 
"Chiasmus Backend Error" ) );
 
 3255  const TQVariant result = listjob->property( 
"result" );
 
 3256  if ( result.type() != TQVariant::StringList ) {
 
 3257    const TQString msg = i18n( 
"Unexpected return value from Chiasmus backend: " 
 3258                              "The \"x-obtain-keys\" function did not return a " 
 3259                              "string list. Please report this bug." );
 
 3260    KMessageBox::error( parentWidget(), msg, i18n( 
"Chiasmus Backend Error" ) );
 
 3264  const TQStringList keys = result.toStringList();
 
 3265  if ( keys.empty() ) {
 
 3266    const TQString msg = i18n( 
"No keys have been found. Please check that a " 
 3267                              "valid key path has been set in the Chiasmus " 
 3269    KMessageBox::error( parentWidget(), msg, i18n( 
"Chiasmus Backend Error" ) );
 
 3273  ChiasmusKeySelector selectorDlg( parentWidget(), i18n( 
"Chiasmus Decryption Key Selection" ),
 
 3274                                   keys, GlobalSettings::chiasmusDecryptionKey(),
 
 3275                                   GlobalSettings::chiasmusDecryptionOptions() );
 
 3276  if ( selectorDlg.exec() != TQDialog::Accepted )
 
 3279  GlobalSettings::setChiasmusDecryptionOptions( selectorDlg.options() );
 
 3280  GlobalSettings::setChiasmusDecryptionKey( selectorDlg.key() );
 
 3281  assert( !GlobalSettings::chiasmusDecryptionKey().isEmpty() );
 
 3283  Kleo::SpecialJob * job = chiasmus->specialJob( 
"x-decrypt", TQStringVariantMap() );
 
 3285    const TQString msg = i18n( 
"Chiasmus backend does not offer the " 
 3286                              "\"x-decrypt\" function. Please report this bug." );
 
 3287    KMessageBox::error( parentWidget(), msg, i18n( 
"Chiasmus Backend Error" ) );
 
 3291  const TQByteArray input = node->msgPart().bodyDecodedBinary();
 
 3293  if ( !job->setProperty( 
"key", GlobalSettings::chiasmusDecryptionKey() ) ||
 
 3294       !job->setProperty( 
"options", GlobalSettings::chiasmusDecryptionOptions() ) ||
 
 3295       !job->setProperty( 
"input", input ) ) {
 
 3296    const TQString msg = i18n( 
"The \"x-decrypt\" function does not accept " 
 3297                              "the expected parameters. Please report this bug." );
 
 3298    KMessageBox::error( parentWidget(), msg, i18n( 
"Chiasmus Backend Error" ) );
 
 3302  setDeletesItself( 
true ); 
 
 3303  if ( job->start() ) {
 
 3304    job->showErrorDialog( parentWidget(), i18n( 
"Chiasmus Decryption Error" ) );
 
 3309  connect( job, TQ_SIGNAL(result(
const GpgME::Error&,
const TQVariant&)),
 
 3310           this, TQ_SLOT(slotAtmDecryptWithChiasmusResult(
const GpgME::Error&,
const TQVariant&)) );
 
 3313static const TQString chomp( 
const TQString & base, 
const TQString & suffix, 
bool cs ) {
 
 3314  return base.endsWith( suffix, cs ) ? base.left( base.length() - suffix.length() ) : base ;
 
 3317void KMHandleAttachmentCommand::slotAtmDecryptWithChiasmusResult( 
const GpgME::Error & err, 
const TQVariant & result )
 
 3319  LaterDeleterWithCommandCompletion d( 
this );
 
 3322  Q_ASSERT( mJob == sender() );
 
 3323  if ( mJob != sender() )
 
 3325  Kleo::Job * job = mJob;
 
 3327  if ( err.isCanceled() )
 
 3330    job->showErrorDialog( parentWidget(), i18n( 
"Chiasmus Decryption Error" ) );
 
 3334  if ( result.type() != TQVariant::ByteArray ) {
 
 3335    const TQString msg = i18n( 
"Unexpected return value from Chiasmus backend: " 
 3336                              "The \"x-decrypt\" function did not return a " 
 3337                              "byte array. Please report this bug." );
 
 3338    KMessageBox::error( parentWidget(), msg, i18n( 
"Chiasmus Backend Error" ) );
 
 3342  const KURL url = KFileDialog::getSaveURL( chomp( mAtmName, 
".xia", 
false ), TQString(), parentWidget() );
 
 3343  if ( url.isEmpty() )
 
 3346  bool overwrite = KMail::Util::checkOverwrite( url, parentWidget() );
 
 3350  d.setDisabled( 
true ); 
 
 3351  TDEIO::Job * uploadJob = TDEIO::storedPut( result.toByteArray(), url, -1, overwrite, 
false  );
 
 3352  uploadJob->setWindow( parentWidget() );
 
 3353  connect( uploadJob, TQ_SIGNAL(result(TDEIO::Job*)),
 
 3354           this, TQ_SLOT(slotAtmDecryptWithChiasmusUploadResult(TDEIO::Job*)) );
 
 3357void KMHandleAttachmentCommand::slotAtmDecryptWithChiasmusUploadResult( TDEIO::Job * job )
 
 3360    job->showErrorDialog();
 
 3361  LaterDeleterWithCommandCompletion d( 
this );
 
 3366AttachmentModifyCommand::AttachmentModifyCommand(partNode * node, 
KMMessage * msg, TQWidget * parent) :
 
 3367    KMCommand( parent, msg ),
 
 3368    mPartIndex( node->nodeId() ),
 
 3373AttachmentModifyCommand::AttachmentModifyCommand( 
int nodeId, 
KMMessage *msg, TQWidget *parent )
 
 3374  : KMCommand( parent, msg ),
 
 3375    mPartIndex( nodeId ),
 
 3380AttachmentModifyCommand::~ AttachmentModifyCommand()
 
 3384KMCommand::Result AttachmentModifyCommand::execute()
 
 3389  mSernum = msg->getMsgSerNum();
 
 3391  mFolder = msg->parent();
 
 3392  if ( !mFolder || !mFolder->storage() )
 
 3395  Result res = doAttachmentModify();
 
 3399  setEmitsCompletedItself( 
true );
 
 3400  setDeletesItself( 
true );
 
 3404void AttachmentModifyCommand::storeChangedMessage(
KMMessage * msg)
 
 3406  if ( !mFolder || !mFolder->storage() ) {
 
 3407    kdWarning(5006) << k_funcinfo << 
"We lost the folder!" << endl;
 
 3408    setResult( Failed );
 
 3409    emit completed( 
this );
 
 3412  int res = mFolder->addMsg( msg ) != 0;
 
 3413  if ( mFolder->folderType() == KMFolderTypeImap ) {
 
 3414    KMFolderImap *f = 
static_cast<KMFolderImap*
>( mFolder->storage() );
 
 3415    connect( f, TQ_SIGNAL(folderComplete(KMFolderImap*,
bool)),
 
 3416             TQ_SLOT(messageStoreResult(KMFolderImap*,
bool)) );
 
 3418    messageStoreResult( 0, res == 0 );
 
 3422void AttachmentModifyCommand::messageStoreResult(KMFolderImap* folder, 
bool success )
 
 3426    KMCommand *delCmd = 
new KMDeleteMsgCommand( mSernum );
 
 3427    connect( delCmd, TQ_SIGNAL(completed(KMCommand*)), TQ_SLOT(messageDeleteResult(KMCommand*)) );
 
 3431  kdWarning(5006) << k_funcinfo << 
"Adding modified message failed." << endl;
 
 3432  setResult( Failed );
 
 3433  emit completed( 
this );
 
 3437void AttachmentModifyCommand::messageDeleteResult(KMCommand * cmd)
 
 3439  setResult( cmd->result() );
 
 3440  emit completed( 
this );
 
 3444KMDeleteAttachmentCommand::KMDeleteAttachmentCommand(partNode * node, 
KMMessage * msg, TQWidget * parent) :
 
 3447  kdDebug(5006) << k_funcinfo << endl;
 
 3450KMDeleteAttachmentCommand::KMDeleteAttachmentCommand( 
int nodeId, 
KMMessage *msg, TQWidget *parent )
 
 3453  kdDebug(5006) << k_funcinfo << endl;
 
 3456KMDeleteAttachmentCommand::~KMDeleteAttachmentCommand()
 
 3458  kdDebug(5006) << k_funcinfo << endl;
 
 3461KMCommand::Result KMDeleteAttachmentCommand::doAttachmentModify()
 
 3471  storeChangedMessage( newMsg );
 
 3476KMEditAttachmentCommand::KMEditAttachmentCommand(partNode * node, 
KMMessage * msg, TQWidget * parent) :
 
 3479  kdDebug(5006) << k_funcinfo << endl;
 
 3480  mTempFile.setAutoDelete( 
true );
 
 3483KMEditAttachmentCommand::KMEditAttachmentCommand( 
int nodeId, 
KMMessage *msg, TQWidget *parent )
 
 3486  kdDebug(5006) << k_funcinfo << endl;
 
 3487  mTempFile.setAutoDelete( 
true );
 
 3490KMEditAttachmentCommand::~ KMEditAttachmentCommand()
 
 3494KMCommand::Result KMEditAttachmentCommand::doAttachmentModify()
 
 3501  DwBodyPart *dwpart = msg->findPart( mPartIndex );
 
 3505  if ( !part.isComplete() )
 
 3508  if( !
dynamic_cast<DwBody*
>( dwpart->Parent() ) )
 
 3511  mTempFile.file()->writeBlock( part.bodyDecodedBinary() );
 
 3512  mTempFile.file()->flush();
 
 3516                                    part.typeStr() + 
"/" + part.subtypeStr(),
 
 3517                                    false, 
this, parentWidget() );
 
 3519  if ( !watcher->start() )
 
 3521  setEmitsCompletedItself( 
true );
 
 3522  setDeletesItself( 
true );
 
 3528  kdDebug(5006) << k_funcinfo << endl;
 
 3530  if ( !watcher->fileChanged() ) {
 
 3531    kdDebug(5006) << k_funcinfo << 
"File has not been changed" << endl;
 
 3532    setResult( Canceled );
 
 3533    emit completed( 
this );
 
 3537  mTempFile.file()->reset();
 
 3538  TQByteArray data = mTempFile.file()->readAll();
 
 3543  DwBodyPart *dwpart = msg->findPart( mPartIndex );
 
 3546  DwBody *parentNode = 
dynamic_cast<DwBody*
>( dwpart->Parent() );
 
 3547  assert( parentNode );
 
 3548  parentNode->RemoveBodyPart( dwpart );
 
 3551  att.duplicate( part );
 
 3552  att.setBodyEncodedBinary( data );
 
 3555  parentNode->AddBodyPart( newDwPart );
 
 3556  msg->getTopLevelPart()->Assemble();
 
 3562  storeChangedMessage( newMsg );
 
 3566CreateTodoCommand::CreateTodoCommand(TQWidget * parent, 
KMMessage * msg)
 
 3567  : KMCommand( parent, msg )
 
 3571KMCommand::Result CreateTodoCommand::execute()
 
 3574  if ( !msg || !msg->
codec() ) {
 
 3578  KMail::KorgHelper::ensureRunning();
 
 3580  TQString txt = i18n(
"From: %1\nTo: %2\nSubject: %3").arg( msg->
from() )
 
 3581                .arg( msg->
to() ).arg( msg->
subject() );
 
 3584  tf.setAutoDelete( 
true );
 
 3585  TQString uri = 
"kmail:" + TQString::number( msg->getMsgSerNum() ) + 
"/" + msg->
msgId();
 
 3589  KCalendarIface_stub *iface = 
new KCalendarIface_stub( tdeApp->dcopClient(), 
"korganizer", 
"CalendarIface" );
 
 3590  iface->openTodoEditor( i18n(
"Mail: %1").arg( msg->
subject() ), txt, uri,
 
 3591                         tf.name(), TQStringList(), 
"message/rfc822", 
true );
 
 3597#include "kmcommands.moc" 
Base class for commands modifying attachements of existing messages.
 
sets a cursor and makes sure it's restored on destruction Create a KCursorSaver object when you want ...
 
static void sendMDN(KMMessage *msg, KMime::MDN::DispositionType d, const TQValueList< KMime::MDN::DispositionModifier > &m=TQValueList< KMime::MDN::DispositionModifier >())
Automates the sending of MDNs from filter actions.
 
KMail list that manages the contents of one directory that may contain folders and/or other directori...
 
virtual TQString prettyURL() const
URL of the node for visualization purposes.
 
bool isOpened() const
Test if folder is opened.
 
KMFolder * trashFolder() const
If this folder has a special trash folder set, return it.
 
virtual TQString prettyURL() const
URL of the node for visualization purposes.
 
virtual TQString label() const
Returns the label of the folder for visualization.
 
KMMsgInfo * unGetMsg(int idx)
Replace KMMessage with KMMsgInfo and delete KMMessage
 
FolderJob * createJob(KMMessage *msg, FolderJob::JobType jt=FolderJob::tGetMessage, KMFolder *folder=0, TQString partSpecifier=TQString(), const AttachmentStrategy *as=0) const
These methods create respective FolderJob (You should derive FolderJob for each derived KMFolder).
 
bool isMessage(int idx)
Checks if the message is already "gotten" with getMsg.
 
KMMessage * take(int idx)
Detach message from this folder.
 
void close(const char *owner, bool force=false)
Close folder.
 
KMMessage * getMsg(int idx)
Read message at given index.
 
const KMMsgBase * getMsgBase(int idx) const
Provides access to the basic message fields that are also stored in the index.
 
KMFolderType folderType() const
Returns the type of this folder.
 
void setStatus(int idx, KMMsgStatus status, bool toggle=false)
Set the status of the message at index idx to status.
 
int open(const char *owner)
Open folder for access.
 
bool noContent() const
Returns, if the folder can't contain mails, but only subfolder.
 
KMFolderDir * child() const
Returns the folder directory associated with this node or 0 if no such directory exists.
 
int find(const KMMsgBase *msg) const
Returns the index of the given message or -1 if not found.
 
bool isReadOnly() const
Is the folder read-only?
 
uint identityUoid() const
 
void link(const KMMessage *aMsg, KMMsgStatus aStatus)
Links this message to aMsg, setting link type to aStatus.
 
void setBody(const TQCString &aStr)
Set the message body.
 
DwBodyPart * getFirstDwBodyPart() const
Get the 1st DwBodyPart.
 
void setReadyToShow(bool v)
Set if the message is ready to be shown.
 
static void bodyPart(DwBodyPart *aDwBodyPart, KMMessagePart *aPart, bool withBody=true)
Fill the KMMessagePart structure for a given DwBodyPart.
 
size_t msgSizeServer() const
Get/set size on server.
 
void setTransferInProgress(bool value, bool force=false)
Set that the message shall not be deleted because it is still required.
 
TQCString body() const
Get the message body.
 
TQString msgId() const
Get or set the 'Message-Id' header field.
 
TQString from() const
Get or set the 'From' header field.
 
TQCString charset() const
Get the message charset.
 
void setAutomaticFields(bool isMultipart=false)
Set fields that are either automatically set (Message-id) or that do not change from one message to a...
 
void setCharset(const TQCString &charset, DwEntity *entity=0)
Sets the charset of the message or a subpart of the message.
 
void setStatus(const KMMsgStatus status, int idx=-1)
Set status and mark dirty.
 
bool deleteBodyPart(int partIndex)
Delete a body part with the specified part index.
 
TQString to() const
Get or set the 'To' header field.
 
TQString subject() const
Get or set the 'Subject' header field.
 
KMMessage * createForward(const TQString &tmpl=TQString())
Create a new message that is a forward of this message, filling all required header fields with the p...
 
void removeHeaderField(const TQCString &name)
Remove header field with given name.
 
void fromDwString(const DwString &str, bool setStatus=false)
Parse the string and create this message from it.
 
KMMessage * createReply(KMail::ReplyStrategy replyStrategy=KMail::ReplySmart, TQString selection=TQString(), bool noQuote=false, bool allowDecryption=true, const TQString &tmpl=TQString(), const TQString &originatingAccount=TQString())
Create a new message that is a reply to this message, filling all required header fields with the pro...
 
TQCString asString() const
Return the entire message contents as a string.
 
KMMessage * createRedirect(const TQString &toStr)
Create a new message that is a redirect to this message, filling all required header fields with the ...
 
KMMsgBase & toMsgBase()
Get KMMsgBase for this object.
 
void removePrivateHeaderFields()
Remove all private header fields: Status: and X-KMail-
 
const DwString & asDwString() const
Return the entire message contents in the DwString.
 
bool transferInProgress() const
Return, if the message should not be deleted.
 
void sanitizeHeaders(const TQStringList &whiteList=TQStringList())
Remove all headers but the content description ones, and those in the white list.
 
static TQString decodeMailtoUrl(const TQString &url)
Decodes a mailto URL.
 
const TQTextCodec * codec() const
Get a TQTextCodec suitable for this message part.
 
void setComplete(bool v)
Set if the message is a complete message.
 
KMMsgStatus status() const
Status of the message.
 
TQString headerField(const TQCString &name) const
Returns the value of a header field with the given name.
 
void applyIdentity(uint id)
Set the from, to, cc, bcc, encrytion etc headers as specified in the given identity.
 
TQCString mboxMessageSeparator()
Returns an mbox message separator line for this message, i.e.
 
void initFromMessage(const KMMessage *msg, bool idHeaders=true)
Initialize headers fields according to the identity and the transport header of the given original me...
 
bool isComplete() const
Return true if the complete message is available without referring to the backing store.
 
TQString headerAsString() const
Return header as string.
 
void initHeader(uint identity=0)
Initialize header fields.
 
void setHeaderField(const TQCString &name, const TQString &value, HeaderFieldType type=Unstructured, bool prepend=false)
Set the header field with the given name to the given value.
 
DwBodyPart * findDwBodyPart(int type, int subtype) const
Return the first DwBodyPart matching a given Content-Type or zero, if no found.
 
DwBodyPart * createDWBodyPart(const KMMessagePart *aPart)
Compose a DwBodyPart (needed for adding a part to the message).
 
void getLocation(unsigned long key, KMFolder **retFolder, int *retIndex) const
Returns the folder the message represented by the serial number key is in and the index in that folde...
 
static const KMMsgDict * instance()
Access the globally unique MessageDict.
 
The attachment dialog with convenience backward compatible methods.
 
This class implements a "reader window", that is a window used for reading or viewing messages.
 
Starts an editor for the given URL and emits an signal when editing has been finished.
 
KMail message redirection dialog.
 
Window class for secondary KMail window like the composer window and the separate message window.
 
A LaterDeleter is intended to be used with the RAII ( Resource Acquisition is Initialization ) paradi...
 
The TemplateParser transforms a message with a given template.
 
void append(TQByteArray &that, const TQByteArray &str)
Append a bytearray to a bytearray.
 
TQByteArray ByteArray(const DwString &str)
Construct a TQByteArray from a DwString.
 
size_t crlf2lf(char *str, const size_t strLen)
Convert all sequences of "\r\n" (carriage return followed by a line feed) to a single "\n" (line feed...