summaryrefslogtreecommitdiffstats
path: root/knode/knfoldermanager.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch)
tree67208f7c145782a7e90b123b982ca78d88cc2c87 /knode/knfoldermanager.cpp
downloadtdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz
tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'knode/knfoldermanager.cpp')
-rw-r--r--knode/knfoldermanager.cpp482
1 files changed, 482 insertions, 0 deletions
diff --git a/knode/knfoldermanager.cpp b/knode/knfoldermanager.cpp
new file mode 100644
index 00000000..5acb4186
--- /dev/null
+++ b/knode/knfoldermanager.cpp
@@ -0,0 +1,482 @@
+/*
+ KNode, the KDE newsreader
+ Copyright (c) 1999-2005 the KNode authors.
+ See file AUTHORS for details
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
+*/
+
+#include <qdir.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+
+#include "knglobals.h"
+#include "knconfigmanager.h"
+#include "knfolder.h"
+#include "utilities.h"
+#include "knfoldermanager.h"
+#include "knarticlemanager.h"
+#include "kncleanup.h"
+#include "knmemorymanager.h"
+#include "knmainwidget.h"
+
+
+KNFolderManager::KNFolderManager(KNArticleManager *a) : a_rtManager(a)
+{
+ //standard folders
+ QString dir(locateLocal("data","knode/")+"folders/");
+ if (dir.isNull()) {
+ KNHelper::displayInternalFileError();
+ return;
+ }
+
+ KNFolder *f;
+
+ f=new KNFolder(0, i18n("Local Folders"), "root");
+ mFolderList.append( f );
+ f->readInfo();
+
+ f=new KNFolder(1, i18n("Drafts"), "drafts", root());
+ mFolderList.append( f );
+ f->readInfo();
+
+ f=new KNFolder(2, i18n("Outbox"), "outbox", root());
+ mFolderList.append( f );
+ f->readInfo();
+
+ f=new KNFolder(3, i18n("Sent"), "sent", root());
+ mFolderList.append( f );
+ f->readInfo();
+
+ l_astId=3;
+
+ //custom folders
+ loadCustomFolders();
+
+ setCurrentFolder(0);
+}
+
+
+KNFolderManager::~KNFolderManager()
+{
+ for ( QValueList<KNFolder*>::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it )
+ delete (*it);
+}
+
+
+void KNFolderManager::setCurrentFolder(KNFolder *f)
+{
+ c_urrentFolder=f;
+ a_rtManager->setFolder(f);
+
+ kdDebug(5003) << "KNFolderManager::setCurrentFolder() : folder changed" << endl;
+
+ if(f && !f->isRootFolder()) {
+ if( loadHeaders(f) )
+ a_rtManager->showHdrs();
+ else
+ KMessageBox::error(knGlobals.topWidget, i18n("Cannot load index-file."));
+ }
+}
+
+
+bool KNFolderManager::loadHeaders(KNFolder *f)
+{
+ if( !f || f->isRootFolder() )
+ return false;
+
+ if (f->isLoaded())
+ return true;
+
+ // we want to delete old stuff first => reduce vm fragmentation
+ knGlobals.memoryManager()->prepareLoad(f);
+
+ if (f->loadHdrs()) {
+ knGlobals.memoryManager()->updateCacheEntry( f );
+ return true;
+ }
+
+ return false;
+}
+
+
+bool KNFolderManager::unloadHeaders(KNFolder *f, bool force)
+{
+ if(!f || !f->isLoaded())
+ return false;
+
+ if (!force && (c_urrentFolder == f))
+ return false;
+
+ if (f->unloadHdrs(force))
+ knGlobals.memoryManager()->removeCacheEntry(f);
+ else
+ return false;
+
+ return true;
+}
+
+
+KNFolder* KNFolderManager::folder(int i)
+{
+ for ( QValueList<KNFolder*>::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it )
+ if ( (*it)->id() == i )
+ return (*it);
+ return 0;
+}
+
+
+KNFolder* KNFolderManager::newFolder(KNFolder *p)
+{
+ if (!p)
+ p = root();
+ KNFolder *f=new KNFolder(++l_astId, i18n("New folder"), p);
+ mFolderList.append( f );
+ emit folderAdded(f);
+ return f;
+}
+
+
+bool KNFolderManager::deleteFolder(KNFolder *f)
+{
+ if(!f || f->isRootFolder() || f->isStandardFolder() || f->lockedArticles()>0)
+ return false;
+
+ QValueList<KNFolder*> del;
+ KNCollection *p;
+
+ // find all subfolders of the folder we want to delete
+ for ( QValueList<KNFolder*>::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
+ p = (*it)->parent();
+ while ( p ) {
+ if ( p == f ) {
+ if ( (*it)->lockedArticles() > 0 )
+ return false;
+ del.append( (*it) );
+ break;
+ }
+ p = p->parent();
+ }
+ }
+
+ emit folderRemoved(f);
+
+ del.append(f);
+ for ( QValueList<KNFolder*>::Iterator it = del.begin(); it != del.end(); ++it ) {
+ if ( c_urrentFolder == (*it) )
+ c_urrentFolder = 0;
+
+ if ( unloadHeaders( (*it), true ) ) {
+ (*it)->deleteFiles();
+ mFolderList.remove( (*it) );
+ delete (*it);
+ } else
+ return false;
+ }
+
+ return true;
+}
+
+
+void KNFolderManager::emptyFolder(KNFolder *f)
+{
+ if(!f || f->isRootFolder())
+ return;
+ knGlobals.memoryManager()->removeCacheEntry(f);
+ f->deleteAll();
+}
+
+
+bool KNFolderManager::moveFolder(KNFolder *f, KNFolder *p)
+{
+ if(!f || p==f->parent()) // nothing to be done
+ return true;
+
+ // is "p" a child of "f" ?
+ KNCollection *p2=p?p->parent():0;
+ while(p2) {
+ if(p2==f)
+ break;
+ p2=p2->parent();
+ }
+
+ if( (p2 && p2==f) || f==p || f->isStandardFolder() || f->isRootFolder()) // no way ;-)
+ return false;
+
+ emit folderRemoved(f);
+
+ // reparent
+ f->setParent(p);
+ f->saveInfo();
+
+ emit folderAdded(f);
+
+ if(c_urrentFolder==f)
+ emit folderActivated(f);
+
+ return true;
+}
+
+
+int KNFolderManager::unsentForAccount(int accId)
+{
+ int cnt=0;
+
+ for ( QValueList<KNFolder*>::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
+ for ( int idx = 0; idx < (*it)->length(); ++idx ) {
+ KNLocalArticle *a = (*it)->at( idx );
+ if ( a->serverId() == accId && a->doPost() && !a->posted() )
+ cnt++;
+ }
+ }
+
+ return cnt;
+}
+
+
+void KNFolderManager::compactFolder(KNFolder *f)
+{
+ if(!f || f->isRootFolder())
+ return;
+
+ KNCleanUp cup;
+ cup.compactFolder(f);
+}
+
+
+void KNFolderManager::compactAll(KNCleanUp *cup)
+{
+ for ( QValueList<KNFolder*>::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it )
+ if ( !(*it)->isRootFolder() && (*it)->lockedArticles() == 0 )
+ cup->appendCollection( (*it) );
+}
+
+
+void KNFolderManager::compactAll()
+{
+ KNCleanUp *cup = new KNCleanUp();
+ compactAll( cup );
+ cup->start();
+
+ knGlobals.configManager()->cleanup()->setLastCompactDate();
+ delete cup;
+}
+
+
+void KNFolderManager::importFromMBox(KNFolder *f)
+{
+ if(!f || f->isRootFolder())
+ return;
+
+ f->setNotUnloadable(true);
+
+ if (!f->isLoaded() && !loadHeaders(f)) {
+ f->setNotUnloadable(false);
+ return;
+ }
+
+ KNLoadHelper helper(knGlobals.topWidget);
+ KNFile *file = helper.getFile(i18n("Import MBox Folder"));
+ KNLocalArticle::List list;
+ KNLocalArticle *art;
+ QString s;
+ int artStart=0, artEnd=0;
+ bool done=true;
+
+ if (file) {
+ knGlobals.top->setCursorBusy(true);
+ knGlobals.setStatusMsg(i18n(" Importing articles..."));
+ knGlobals.top->secureProcessEvents();
+
+ if (!file->atEnd()) { // search for the first article...
+ s = file->readLine();
+ if (s.left(5) == "From ") {
+ artStart = file->at();
+ done = false;
+ } else {
+ artStart = file->findString("\n\nFrom ");
+ if (artStart != -1) {
+ file->at(artStart+1);
+ s = file->readLine();
+ artStart = file->at();
+ done = false;
+ }
+ }
+ }
+
+ knGlobals.top->secureProcessEvents();
+
+ if (!done) {
+ while (!file->atEnd()) {
+ artEnd = file->findString("\n\nFrom ");
+
+ if (artEnd != -1) {
+ file->at(artStart); // seek the first character of the article
+ int size=artEnd-artStart;
+ QCString buff(size+10);
+ int readBytes=file->readBlock(buff.data(), size);
+
+ if (readBytes != -1) {
+ buff.at(readBytes)='\0'; //terminate string
+ art = new KNLocalArticle(0);
+ art->setEditDisabled(true);
+ art->setContent(buff);
+ art->parse();
+ list.append(art);
+ }
+
+ file->at(artEnd+1);
+ s = file->readLine();
+ artStart = file->at();
+ } else {
+ if ((int)file->size() > artStart) {
+ file->at(artStart); // seek the first character of the article
+ int size=file->size()-artStart;
+ QCString buff(size+10);
+ int readBytes=file->readBlock(buff.data(), size);
+
+ if (readBytes != -1) {
+ buff.at(readBytes)='\0'; //terminate string
+ art = new KNLocalArticle(0);
+ art->setEditDisabled(true);
+ art->setContent(buff);
+ art->parse();
+ list.append(art);
+ }
+ }
+ }
+
+ if (list.count()%75 == 0)
+ knGlobals.top->secureProcessEvents();
+ }
+ }
+
+ knGlobals.setStatusMsg(i18n(" Storing articles..."));
+ knGlobals.top->secureProcessEvents();
+
+ if (!list.isEmpty())
+ knGlobals.articleManager()->moveIntoFolder(list, f);
+
+ knGlobals.setStatusMsg(QString::null);
+ knGlobals.top->setCursorBusy(false);
+ }
+
+ f->setNotUnloadable(false);
+}
+
+
+void KNFolderManager::exportToMBox(KNFolder *f)
+{
+ if(!f || f->isRootFolder())
+ return;
+
+ f->setNotUnloadable(true);
+
+ if (!f->isLoaded() && !loadHeaders(f)) {
+ f->setNotUnloadable(false);
+ return;
+ }
+
+ KNSaveHelper helper(f->name()+".mbox", knGlobals.topWidget);
+ QFile *file = helper.getFile(i18n("Export Folder"));
+
+ if (file) {
+ knGlobals.top->setCursorBusy(true);
+ knGlobals.setStatusMsg(i18n(" Exporting articles..."));
+ knGlobals.top->secureProcessEvents();
+
+ QTextStream ts(file);
+ ts.setEncoding(QTextStream::Latin1);
+ KNLocalArticle *a;
+
+ for(int idx=0; idx<f->length(); idx++) {
+ a=f->at(idx);
+
+ a->setNotUnloadable(true);
+
+ if (a->hasContent() || knGlobals.articleManager()->loadArticle(a)) {
+ ts << "From aaa@aaa Mon Jan 01 00:00:00 1997\n";
+ a->toStream(ts, true);
+ ts << "\n";
+ }
+
+ a->setNotUnloadable(false);
+
+ if (idx%75 == 0)
+ knGlobals.top->secureProcessEvents();
+ }
+
+ knGlobals.setStatusMsg(QString::null);
+ knGlobals.top->setCursorBusy(false);
+ }
+}
+
+
+void KNFolderManager::syncFolders()
+{
+ QString dir(locateLocal("data","knode/")+"folders/");
+ if (dir.isNull()) {
+ KNHelper::displayInternalFileError();
+ return;
+ }
+
+ //sync
+ for ( QValueList<KNFolder*>::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
+ if ( !(*it)->isRootFolder() )
+ (*it)->syncIndex();
+ (*it)->saveInfo();
+ }
+}
+
+
+int KNFolderManager::loadCustomFolders()
+{
+ int cnt=0;
+ QString dir(locateLocal("data","knode/")+"folders/");
+ KNFolder *f;
+
+ if (dir.isNull()) {
+ KNHelper::displayInternalFileError();
+ return 0;
+ }
+
+ QDir d(dir);
+ QStringList entries(d.entryList("custom_*.info")); // ignore info files of standard folders
+ for(QStringList::Iterator it=entries.begin(); it != entries.end(); ++it) {
+ f=new KNFolder();
+ if(f->readInfo(d.absFilePath(*it))) {
+ if(f->id()>l_astId)
+ l_astId=f->id();
+ mFolderList.append( f );
+ cnt++;
+ }
+ else
+ delete f;
+ }
+
+ // set parents
+ if(cnt>0) {
+ for ( QValueList<KNFolder*>::Iterator it = mFolderList.begin(); it != mFolderList.end(); ++it ) {
+ if ( !(*it)->isRootFolder() ) { // the root folder has no parent
+ KNFolder *par = folder( (*it)->parentId() );
+ if ( !par )
+ par = root();
+ (*it)->setParent( par );
+ }
+ }
+ }
+
+ return cnt;
+}
+
+
+#include "knfoldermanager.moc"