void KNArticleManager::moveIntoFolder(KNLocalArticle::List &l, KNFolder *f) { if(!f) return; kDebug(5003) <<" Target folder:" << f->name(); f->setNotUnloadable(true); if (!f->isLoaded() && !knGlobals.folderManager()->loadHeaders(f)) { f->setNotUnloadable(false); return; } if ( f->saveArticles( l ) ) { for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) knGlobals.memoryManager()->updateCacheEntry( (*it) ); knGlobals.memoryManager()->updateCacheEntry(f); } else { for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) if ( (*it)->isOrphant() ) delete (*it); // ok, this is ugly; we simply delete orphant articles KNHelper::displayInternalFileError(); } f->setNotUnloadable(false); }
bool KNArticleManager::deleteArticles(KNLocalArticle::List &l, bool ask) { if(ask) { QStringList lst; for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) { if ( (*it)->isLocked() ) continue; if ( (*it)->subject()->isEmpty() ) lst << i18n("no subject"); else lst << (*it)->subject()->asUnicodeString(); } if( KMessageBox::Cancel == KMessageBox::warningContinueCancelList( knGlobals.topWidget, i18n("Do you really want to delete these articles?"), lst, i18n("Delete Articles"), KGuiItem(i18n("&Delete"),"edit-delete")) ) return false; } for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) knGlobals.memoryManager()->removeCacheEntry( (*it) ); KNFolder *f=static_cast<KNFolder*>(l.first()->collection()); if ( f ) { f->removeArticles( l, true ); knGlobals.memoryManager()->updateCacheEntry( f ); return false; // composers for those articles were already removed in removeArticles } else { for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) delete (*it); } return true; }
void KNFolder::removeArticles( KNLocalArticle::List &l, bool del ) { if( !isLoaded() || l.isEmpty() ) return; int idx = 0, delCnt = 0, *positions; positions = new int[l.count()]; KNLocalArticle *a = 0; for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it, ++idx ) { if ( (*it)->isLocked() ) positions[idx] = -1; else positions[idx] = a_rticles.indexForId( (*it)->id() ); } for ( idx = 0; idx < (int)(l.count()); ++idx ) { if(positions[idx]==-1) continue; a=at(positions[idx]); //update knGlobals.artFactory->deleteComposerForArticle(a); ArticleWindow::closeAllWindowsForArticle( a ); ArticleWidget::articleRemoved( a ); delete a->listItem(); //delete article a_rticles.remove( positions[idx], del ); delCnt++; if(!del) a->setId(-1); } if(delCnt>0) { compact(); c_ount-=delCnt; updateListItem(); i_ndexDirty=true; } delete[] positions; }
void KNFolder::removeArticles( KNLocalArticle::List &l, bool del ) { if( !isLoaded() || l.isEmpty() ) return; int delCnt = 0; for ( int idx = 0; idx < l.count(); ++idx ) { KNLocalArticle::Ptr a = l[ idx ]; if ( a->isLocked() ) { continue; } // check if this article belongs to this folder a = byId( a->id() ); if ( !a ) { continue; } //update KNGlobals::self()->articleFactory()->deleteComposerForArticle(a); ArticleWindow::closeAllWindowsForArticle( a ); ArticleWidget::articleRemoved( a ); delete a->listItem(); //delete article remove( a ); delCnt++; if(!del) a->setId(-1); } if(delCnt>0) { compact(); c_ount-=delCnt; updateListItem(); i_ndexDirty=true; } }
bool KNFolder::saveArticles( KNLocalArticle::List &l ) { if(!isLoaded()) // loading should not be done here - keep the StorageManager in sync !! return false; if(!m_boxFile.open(QIODevice::WriteOnly | QIODevice::Append)) { kError(5003) <<"KNFolder::saveArticles() : cannot open mbox-file!"; closeFiles(); return false; } int addCnt=0; bool ret=true; bool clear=false; QTextStream ts(&m_boxFile); ts.setCodec( "ISO 8859-1" ); for ( KNLocalArticle::List::Iterator it = l.begin(); it != l.end(); ++it ) { clear=false; if ( (*it)->id() == -1 || (*it)->collection().get() != this ) { if ( (*it)->id() != -1 ) { KNFolder::Ptr oldFolder = boost::static_pointer_cast<KNFolder>( (*it)->collection() ); if ( !(*it)->hasContent() ) if( !( clear = oldFolder->loadArticle( (*it) ) ) ) { ret = false; continue; } KNLocalArticle::List l; l.append( (*it) ); oldFolder->removeArticles( l, false ); } append( (*it) ); (*it)->setCollection( thisFolderPtr() ); addCnt++; } if ( byId( (*it)->id() ) == (*it) ) { //MBox ts << "From aaa@aaa Mon Jan 01 00:00:00 1997\n"; ts.flush(); (*it)->setStartOffset( m_boxFile.pos() ); //save offset //write overview information ts << "X-KNode-Overview: "; ts << (*it)->subject()->as7BitString(false) << '\t'; KMime::Headers::Base* h; if( ( h = (*it)->newsgroups( false ) ) !=0 ) ts << h->as7BitString(false); ts << '\t'; if( (h = (*it)->to( false ) ) != 0 ) ts << h->as7BitString(false); ts << '\t'; ts << (*it)->lines()->as7BitString(false) << '\n'; //write article (*it)->toStream( ts ); ts << "\n"; ts.flush(); (*it)->setEndOffset( m_boxFile.pos() ); //save offset //update ArticleWidget::articleChanged( (*it) ); i_ndexDirty=true; } else { kError(5003) <<"KNFolder::saveArticle() : article not in folder!"; ret=false; } if ( clear ) (*it)->KNLocalArticle::Content::clear(); } closeFiles(); syncIndex(); if(addCnt>0) { c_ount=length(); updateListItem(); knGlobals.articleManager()->updateViewForCollection( thisFolderPtr() ); } return ret; }