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 KMFilterMgr::endFiltering(KMMsgBase *msgBase) const { KMFolder *parent = msgBase->parent(); if(parent) { if(parent == MessageProperty::filterFolder(msgBase)) { parent->take(parent->find(msgBase)); } else if(! MessageProperty::filterFolder(msgBase)) { int index = parent->find(msgBase); KMMessage *msg = parent->getMsg(index); parent->take(index); parent->addMsgKeepUID(msg); } } MessageProperty::setFiltering(msgBase, false); }