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); }
//----------------------------------------------------------------------------- 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; }
//----------------------------------------------------------------------------- int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret) { long offs, size, len; bool opened = FALSE; QString msgText; char endStr[3]; int idx, rc; KMFolder* msgParent; bool editing = false; if (!mStream) { opened = TRUE; rc = open(); debug("addMsg-open: %d", rc); if (rc) return rc; } // take message out of the folder it is currently in, if any msgParent = aMsg->parent(); if (msgParent) { if (msgParent==this) { if (name() == "outbox") //special case for Edit message. { // debug ("Editing message in outbox"); editing = true; } else return 0; } idx = msgParent->find(aMsg); if (idx >= 0) msgParent->take(idx); } aMsg->setStatusFields(); msgText = aMsg->asString(); len = msgText.length(); if (aMsg->status()==KMMsgStatusUnread || aMsg->status()==KMMsgStatusNew) { ++unreadMsgs; emit numUnreadMsgsChanged( this ); } assert(mStream != NULL); if (len <= 0) { debug("Message added to folder `%s' contains no data. Ignoring it.", (const char*)name()); if (opened) close(); return 0; } // write message to folder file fseek(mStream, -2, SEEK_END); fread(endStr, 1, 2, mStream); // ensure separating empty line if (ftell(mStream) > 0 && endStr[0]!='\n') { if (endStr[1]!='\n') { //printf ("****endStr[1]=%c\n", endStr[1]); fwrite("\n\n", 1, 2, mStream); } else fwrite("\n", 1, 1, mStream); } fseek(mStream,0,SEEK_END); // this is needed on solaris and others fwrite("From aaa@aaa Mon Jan 01 00:00:00 1997\n", 38, 1, mStream); offs = ftell(mStream); fwrite(msgText, len, 1, mStream); if (msgText[len-1]!='\n') fwrite("\n\n", 1, 2, mStream); fflush(mStream); size = ftell(mStream) - offs; // store information about the position in the folder file in the message aMsg->setParent(this); aMsg->setFolderOffset(offs); aMsg->setMsgSize(size); idx = mMsgList.append(aMsg); // write index entry if desired if (mAutoCreateIndex) { assert(mIndexStream != NULL); fseek(mIndexStream, 0, SEEK_END); fprintf(mIndexStream, "%s\n", (const char*)aMsg->asIndexString()); fflush(mIndexStream); } // some "paper work" if (aIndex_ret) *aIndex_ret = idx; if (!mQuiet) emit msgAdded(idx); if (opened) close(); return 0; }