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); }
//----------------------------------------------------------------------------- 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 ®istrarPath, 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 ); } }
//----------------------------------------------------------------------------- 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; }
//----------------------------------------------------------------------------- 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; }