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 KMFilterMgr::process(Q_UINT32 serNum, const KMFilter *filter)
{
    bool stopIt = false;
    int result = 1;

    if(!filter)
        return 1;

    if(isMatching(serNum, filter))
    {
        KMFolder *folder = 0;
        int idx = -1;
        // get the message with the serNum
        KMMsgDict::instance()->getLocation(serNum, &folder, &idx);
        if(!folder || (idx == -1) || (idx >= folder->count()))
        {
            return 1;
        }
        KMFolderOpener openFolder(folder, "filtermgr");
        KMMsgBase *msgBase = folder->getMsgBase(idx);
        bool unGet = !msgBase->isMessage();
        KMMessage *msg = folder->getMsg(idx);
        // do the actual filtering stuff
        if(!msg || !beginFiltering(msg))
        {
            if(unGet)
                folder->unGetMsg(idx);
            return 1;
        }
        if(filter->execActions(msg, stopIt) == KMFilter::CriticalError)
        {
            if(unGet)
                folder->unGetMsg(idx);
            return 2;
        }

        KMFolder *targetFolder = MessageProperty::filterFolder(msg);

        endFiltering(msg);
        if(targetFolder)
        {
            tempOpenFolder(targetFolder);
            msg->setTransferInProgress(false);
            result = targetFolder->moveMsg(msg);
            msg->setTransferInProgress(true);
        }
        if(unGet)
            folder->unGetMsg(idx);
    }
    else
    {
        result = 1;
    }
    return result;
}
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 );
  }
}