void KMSearch::stop()
{
  if ( !running() ) {
    return;
  }

  mIncompleteFolders.clear();
  QList<QPointer<KMFolder> >::ConstIterator jt;
  for ( jt = mOpenedFolders.constBegin(); jt != mOpenedFolders.constEnd(); ++jt ) {
    KMFolder *folder = *jt;
    if ( !folder ) {
      continue;
    }
    // explicitly stop jobs for this folder as it will not be closed below
    // when the folder is currently selected
    if ( folder->folderType() == KMFolderTypeImap ) {
      KMAcctImap *account =
        static_cast<KMFolderImap*>( folder->storage() )->account();
      account->ignoreJobsForFolder( folder );
    }
    folder->storage()->search( 0 );
    mSearchCount += folder->count();
    folder->close( "kmsearch" );
  }
  mRemainingFolders = -1;
  mOpenedFolders.clear();
  mFolders.clear();
  mLastFolder.clear();
  mRunning = false;
  emit finished(false);
}
Exemple #2
0
//-----------------------------------------------------------------------------
int KMFolder::moveMsg(KMMessage* aMsg, int* aIndex_ret)
{
  KMFolder* msgParent;
  int rc;

  assert(aMsg != NULL);
  msgParent = aMsg->parent();

  if (msgParent)
  {
    msgParent->open();
    aMsg = msgParent->take(msgParent->find(aMsg));
    msgParent->close();
  }

  open();
  rc = addMsg(aMsg, aIndex_ret);
  close();

  // debug("KMFolder::moveMsg() rc=%i",rc);
  return rc;
}
void MailManagerImpl::Register( const QDBusObjectPath &registrarPath, uint lastModseq )
{
  Q_UNUSED( lastModseq );
  registrars.append( registrarPath );

  QDBusMessage m = QDBusMessage::createMethodCall( message().service(),
                     registrarPath.path(),
                     "org.freedesktop.email.metadata.Registrar", "Cleanup" );
  QList<QVariant> args;
  args.append ( static_cast<uint> ( time( 0 ) ) );
  m.setArguments( args );
  QDBusConnection::sessionBus().send( m );

  QList< QPointer< KMFolder > > folders = kmkernel->allFolders();
  QList< QPointer< KMFolder > >::Iterator it = folders.begin();

  while ( it != folders.end() ) {
    uint i = 0;

    KMFolder *folder = (*it);
    ++it;

    folder->open("DBus");

    uint fcount = folder->count();

    while ( i < fcount ) {

      QVector<QStringList> predicatesArray;
      QVector<QStringList> valuesArray;
      QStringList subjects;

      uint processed = 0;

      for ( ; i < fcount; ++i ) {
        const KMMsgBase *msg = folder->getMsgBase( i );

        processMsgBase( msg, subjects, predicatesArray, valuesArray );
        processed++;

        if ( processed >= max_per_dbus_call )
          break;
      }

      if (!subjects.isEmpty()) {
        QDBusMessage m = QDBusMessage::createMethodCall( message().service(),
                                registrarPath.path(),
                                "org.freedesktop.email.metadata.Registrar", "SetMany" );
        QList<QVariant> args;

        args.append( subjects );
        args.append( qVariantFromValue( predicatesArray ) );
        args.append( qVariantFromValue( valuesArray ) );
        args.append( static_cast<uint> ( time( 0 ) ) );

        m.setArguments( args );

        QDBusConnection::sessionBus().send( m );
      }
    }

    folder->close( "DBus", false );
  }
}
Exemple #4
0
//-----------------------------------------------------------------------------
int KMFolder::compact(void)
{
  KMFolder* tempFolder;
  KMMessage* msg;
  QString tempName, msgStr;
  int openCount = mOpenCount;
  int num, numStatus;


  if (!needsCompact)
  {
    //debug ("Not compacting %s; it's clean", name().data());
    return 0;
  }
  
  debug ("Compacting %s ", name().data());
  
  tempName = "." + name();
  tempName.detach();
  tempName += ".compacted";
  unlink(tempName);
  //tempFolder = parent()->createFolder(tempName); //sven: shouldn't be in list
  tempFolder = new KMFolder(parent(), tempName);   //sven: we create it
  if(tempFolder->create()) {
    debug("KMFolder::compact() Creating tempFolder failed!\n");
    delete tempFolder;                             //sven: and we delete it
    return 0;
  }

  quiet(TRUE);
  tempFolder->open();
  open();

  for(num=1,numStatus=9; count() > 0; num++, numStatus--)
  {
    if (numStatus <= 0)
    {
      msgStr.sprintf(i18n("Compacting folder: %d messages done"), num);
      emit statusMsg(msgStr);
      numStatus = 10;
    }

    msg = getMsg(0);
    if(msg)
      tempFolder->moveMsg(msg);
  }
  tempName = tempFolder->location();
  tempFolder->close(TRUE);
  close(TRUE);
  mMsgList.clear(TRUE);

  _rename(tempName, location());
  _rename(tempFolder->indexLocation(), indexLocation());

  // Now really free all memory
  delete tempFolder;                //sven: we delete it, not the manager

  if (openCount > 0)
  {
    open();
    mOpenCount = openCount;
  }
  quiet(FALSE);

  if (!mQuiet) emit changed();
  needsCompact = false;             // We are clean now
  return 0;
}
Exemple #5
0
//-----------------------------------------------------------------------------
void KMSender::doSendMsg()
{
    if(!kmkernel)   //To handle message sending in progress when kaplan is exited
        return;	//TODO: handle this case better

    const bool someSent = mCurrentMsg;
    if(someSent)
    {
        mSentMessages++;
        mSentBytes += mCurrentMsg->msgSize();
    }

    // Post-process sent message (filtering)
    KMFolder *sentFolder = 0, *imapSentFolder = 0;
    if(mCurrentMsg  && kmkernel->filterMgr())
    {
        mCurrentMsg->setTransferInProgress(false);
        if(mCurrentMsg->hasUnencryptedMsg())
        {
            kdDebug(5006) << "KMSender::doSendMsg() post-processing: replace mCurrentMsg body by unencryptedMsg data" << endl;
            // delete all current body parts
            mCurrentMsg->deleteBodyParts();
            // copy Content-[..] headers from unencrypted message to current one
            KMMessage &newMsg(*mCurrentMsg->unencryptedMsg());
            mCurrentMsg->dwContentType() = newMsg.dwContentType();
            mCurrentMsg->setContentTransferEncodingStr(newMsg.contentTransferEncodingStr());
            QCString newDispo = newMsg.headerField("Content-Disposition").latin1();
            if(newDispo.isEmpty())
                mCurrentMsg->removeHeaderField("Content-Disposition");
            else
                mCurrentMsg->setHeaderField("Content-Disposition", newDispo);
            // copy the body
            mCurrentMsg->setBody(newMsg.body());
            // copy all the body parts
            KMMessagePart msgPart;
            for(int i = 0; i < newMsg.numBodyParts(); ++i)
            {
                newMsg.bodyPart(i, &msgPart);
                mCurrentMsg->addBodyPart(&msgPart);
            }
        }
        mCurrentMsg->setStatus(KMMsgStatusSent);
        mCurrentMsg->setStatus(KMMsgStatusRead); // otherwise it defaults to new on imap
        mCurrentMsg->updateAttachmentState();

        const KPIM::Identity &id = kmkernel->identityManager()
                                   ->identityForUoidOrDefault(mCurrentMsg->headerField("X-KMail-Identity").stripWhiteSpace().toUInt());
        if(!mCurrentMsg->fcc().isEmpty())
        {
            sentFolder = kmkernel->folderMgr()->findIdString(mCurrentMsg->fcc());
            if(sentFolder == 0)
                // This is *NOT* supposed to be imapSentFolder!
                sentFolder =
                    kmkernel->dimapFolderMgr()->findIdString(mCurrentMsg->fcc());
            if(sentFolder == 0)
                imapSentFolder =
                    kmkernel->imapFolderMgr()->findIdString(mCurrentMsg->fcc());
        }
        // No, or no usable sentFolder, and no, or no usable imapSentFolder,
        // let's try the on in the identity
        if((sentFolder == 0 || sentFolder->isReadOnly())
                && (imapSentFolder == 0 || imapSentFolder->isReadOnly())
                && !id.fcc().isEmpty())
        {
            sentFolder = kmkernel->folderMgr()->findIdString(id.fcc());
            if(sentFolder == 0)
                // This is *NOT* supposed to be imapSentFolder!
                sentFolder = kmkernel->dimapFolderMgr()->findIdString(id.fcc());
            if(sentFolder == 0)
                imapSentFolder = kmkernel->imapFolderMgr()->findIdString(id.fcc());
        }
        if(imapSentFolder
                && (imapSentFolder->noContent() || imapSentFolder->isReadOnly()))
            imapSentFolder = 0;

        if(sentFolder == 0 || sentFolder->isReadOnly())
            sentFolder = kmkernel->sentFolder();

        if(sentFolder)
        {
            if(const int err = sentFolder->open("sentFolder"))
            {
                Q_UNUSED(err);
                cleanup();
                return;
            }
        }

        // Disable the emitting of msgAdded signal, because the message is taken out of the
        // current folder (outbox) and re-added, to make filter actions changing the message
        // work. We don't want that to screw up message counts.
        if(mCurrentMsg->parent()) mCurrentMsg->parent()->quiet(true);
        const int processResult = kmkernel->filterMgr()->process(mCurrentMsg, KMFilterMgr::Outbound);
        if(mCurrentMsg->parent()) mCurrentMsg->parent()->quiet(false);

        // 0==processed ok, 1==no filter matched, 2==critical error, abort!
        switch(processResult)
        {
            case 2:
                perror("Critical error: Unable to process sent mail (out of space?)");
                KMessageBox::information(0, i18n("Critical error: "
                                                 "Unable to process sent mail (out of space?)"
                                                 "Moving failing message to \"sent-mail\" folder."));
                if(sentFolder)
                {
                    sentFolder->moveMsg(mCurrentMsg);
                    sentFolder->close("sentFolder");
                }
                cleanup();
                return;
            case 1:
                if(sentFolder && sentFolder->moveMsg(mCurrentMsg) != 0)
                {
                    KMessageBox::error(0, i18n("Moving the sent message \"%1\" from the "
                                               "\"outbox\" to the \"sent-mail\" folder failed.\n"
                                               "Possible reasons are lack of disk space or write permission. "
                                               "Please try to fix the problem and move the message manually.")
                                       .arg(mCurrentMsg->subject()));
                    cleanup();
                    return;
                }
                if(imapSentFolder)
                {
                    // Does proper folder refcounting and message locking
                    KMCommand *command = new KMMoveCommand(imapSentFolder, mCurrentMsg);
                    command->keepFolderOpen(sentFolder);   // will open it, and close it once done
                    command->start();
                }
            default:
                break;
        }
        setStatusByLink(mCurrentMsg);
        if(mCurrentMsg->parent() && !imapSentFolder)
        {
            // for speed optimization, this code assumes that mCurrentMsg is the
            // last one in it's parent folder; make sure that's really the case:
            assert(mCurrentMsg->parent()->find(mCurrentMsg)
                   == mCurrentMsg->parent()->count() - 1);
            // unGet this message:
            mCurrentMsg->parent()->unGetMsg(mCurrentMsg->parent()->count() - 1);
        }

        mCurrentMsg = 0;
    }

    // See if there is another queued message
    mCurrentMsg = mOutboxFolder->getMsg(mFailedMessages);
    if(mCurrentMsg && !mCurrentMsg->transferInProgress() &&
            mCurrentMsg->sender().isEmpty())
    {
        // if we do not have a sender address then use the email address of the
        // message's identity or of the default identity unless those two are also
        // empty
        const KPIM::Identity &id = kmkernel->identityManager()
                                   ->identityForUoidOrDefault(mCurrentMsg->headerField("X-KMail-Identity").stripWhiteSpace().toUInt());
        if(!id.emailAddr().isEmpty())
        {
            mCurrentMsg->setFrom(id.fullEmailAddr());
        }
        else if(!kmkernel->identityManager()->defaultIdentity().emailAddr().isEmpty())
        {
            mCurrentMsg->setFrom(kmkernel->identityManager()->defaultIdentity().fullEmailAddr());
        }
        else
        {
            KMessageBox::sorry(0, i18n("It's not possible to send messages "
                                       "without specifying a sender address.\n"
                                       "Please set the email address of "
                                       "identity '%1' in the Identities "
                                       "section of the configuration dialog "
                                       "and then try again.")
                               .arg(id.identityName()));
            mOutboxFolder->unGetMsg(mFailedMessages);
            mCurrentMsg = 0;
        }
    }
    if(!mCurrentMsg || mCurrentMsg->transferInProgress())
    {
        // a message is locked finish the send
        if(mCurrentMsg && mCurrentMsg->transferInProgress())
            mCurrentMsg = 0;
        // no more message: cleanup and done
        if(sentFolder != 0)
            sentFolder->close("sentFolder");
        if(someSent)
        {
            if(mSentMessages == mTotalMessages)
            {
                setStatusMsg(i18n("%n queued message successfully sent.",
                                  "%n queued messages successfully sent.",
                                  mSentMessages));
            }
            else
            {
                setStatusMsg(i18n("%1 of %2 queued messages successfully sent.")
                             .arg(mSentMessages).arg(mTotalMessages));
            }
        }
        cleanup();
        return;
    }
    mCurrentMsg->setTransferInProgress(true);

    // start the sender process or initialize communication
    if(!mSendInProgress)
    {
        Q_ASSERT(!mProgressItem);
        mProgressItem = KPIM::ProgressManager::createProgressItem(
                            "Sender",
                            i18n("Sending messages"),
                            i18n("Initiating sender process..."),
                            true);
        connect(mProgressItem, SIGNAL(progressItemCanceled(KPIM::ProgressItem *)),
                this, SLOT(slotAbortSend()));
        kapp->ref();
        mSendInProgress = true;
    }