From 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: 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 --- kmail/kmfolderdir.cpp | 313 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 kmail/kmfolderdir.cpp (limited to 'kmail/kmfolderdir.cpp') diff --git a/kmail/kmfolderdir.cpp b/kmail/kmfolderdir.cpp new file mode 100644 index 000000000..1092e41cd --- /dev/null +++ b/kmail/kmfolderdir.cpp @@ -0,0 +1,313 @@ +// kmfolderdir.cpp + +#include +#include + +#include "kmfolderdir.h" +#include "kmfoldersearch.h" +#include "kmfoldercachedimap.h" +#include "kmfolder.h" + +#include +#include +#include +#include +#include +#include + + +//============================================================================= +//============================================================================= +KMFolderRootDir::KMFolderRootDir(KMFolderMgr* manager, const QString& path, + KMFolderDirType dirType) + : KMFolderDir( 0, 0, path, dirType ), + mPath( path ), + mManager( manager ) +{ +} + +//----------------------------------------------------------------------------- +KMFolderRootDir::~KMFolderRootDir() +{ + // WABA: We can't let KMFolderDir do this because by the time its + // desctructor gets called, KMFolderRootDir is already destructed + // Most notably the path. + clear(); +} + +//----------------------------------------------------------------------------- +void KMFolderRootDir::setPath(const QString& aPath) +{ + mPath = aPath; +} + + +//----------------------------------------------------------------------------- +QString KMFolderRootDir::path() const +{ + return mPath; +} + + +//----------------------------------------------------------------------------- +QString KMFolderRootDir::prettyURL() const +{ + if ( !mBaseURL.isEmpty() ) + return i18n( mBaseURL.data() ); + else + return QString::null; +} + + +//----------------------------------------------------------------------------- +void KMFolderRootDir::setBaseURL( const QCString &baseURL ) +{ + mBaseURL = baseURL; +} + + +//----------------------------------------------------------------------------- +KMFolderMgr* KMFolderRootDir::manager() const +{ + return mManager; +} + + +//============================================================================= +//============================================================================= +KMFolderDir::KMFolderDir( KMFolder * owner, KMFolderDir* parent, + const QString& name, KMFolderDirType dirType ) + : KMFolderNode( parent, name ), KMFolderNodeList(), + mOwner( owner ), mDirType( dirType ) +{ + setAutoDelete( true ); +} + + +//----------------------------------------------------------------------------- +KMFolderDir::~KMFolderDir() +{ + clear(); +} + + +//----------------------------------------------------------------------------- +KMFolder* KMFolderDir::createFolder(const QString& aFolderName, bool aSysFldr, KMFolderType aFolderType) +{ + KMFolder* fld; + + assert(!aFolderName.isEmpty()); + // FIXME urgs, is this still needed + if (mDirType == KMImapDir) + fld = new KMFolder( this, aFolderName, KMFolderTypeImap ); + else + fld = new KMFolder( this, aFolderName, aFolderType ); + + assert(fld != 0); + fld->setSystemFolder(aSysFldr); + + KMFolderNode* fNode; + int index = 0; + for (fNode=first(); fNode; fNode=next()) { + if (fNode->name().lower() > fld->name().lower()) { + insert( index, fld ); + break; + } + ++index; + } + + if (!fNode) + append(fld); + + fld->correctUnreadMsgsCount(); + return fld; +} + + +//---------------------------------------------------------------------------- +QString KMFolderDir::path() const +{ + static QString p; + + if (parent()) + { + p = parent()->path(); + p.append("/"); + p.append(name()); + } + else p = ""; + + return p; +} + + +//---------------------------------------------------------------------------- +QString KMFolderDir::label() const +{ + if ( mOwner ) + return mOwner->label(); + else + return QString::null; +} + + +//----------------------------------------------------------------------------- +QString KMFolderDir::prettyURL() const +{ + QString parentUrl; + if ( parent() ) + parentUrl = parent()->prettyURL(); + if ( !parentUrl.isEmpty() ) + return parentUrl + '/' + label(); + else + return label(); +} + + +//----------------------------------------------------------------------------- +bool KMFolderDir::reload(void) +{ + QDir dir; + KMFolder* folder; + QFileInfo* fileInfo; + QStringList diList; + QPtrList folderList; + + clear(); + + const QString fldPath = path(); + dir.setFilter(QDir::Files | QDir::Dirs | QDir::Hidden); + dir.setNameFilter("*"); + + if (!dir.cd(fldPath, TRUE)) + { + QString msg = i18n("Cannot enter folder %1.").arg(fldPath); + KMessageBox::information(0, msg); + return FALSE; + } + + QFileInfoList* fiList=(QFileInfoList*)dir.entryInfoList(); + if (!fiList) + { + QString msg = i18n("Folder %1 is unreadable.").arg(fldPath); + KMessageBox::information(0, msg); + return FALSE; + } + + for (fileInfo=fiList->first(); fileInfo; fileInfo=fiList->next()) + { + const QString fname = fileInfo->fileName(); + if( ( fname[0] == '.' ) && !fname.endsWith( ".directory" ) ) { + // ignore all hidden files except our subfolder containers + continue; + } + if( fname == ".directory" ) { + // ignore .directory files (not created by us) + continue; + } + // Collect subdirectories. + if ( fileInfo->isDir() && + fname.startsWith( "." ) && fname.endsWith( ".directory" ) ) { + diList.append(fname); + continue; + } + + if ( mDirType == KMImapDir + && path().startsWith( KMFolderImap::cacheLocation() ) ) + { + // Is the below needed for dimap as well? + if ( KMFolderImap::encodeFileName( + KMFolderImap::decodeFileName( fname ) ) == fname ) + { + folder = new KMFolder( this, KMFolderImap::decodeFileName( fname ), + KMFolderTypeImap ); + append(folder); + folderList.append(folder); + } + } + else if ( mDirType == KMDImapDir + && path().startsWith( KMFolderCachedImap::cacheLocation() ) ) + { + if (fileInfo->isDir()) // a directory + { + // For this to be a cached IMAP folder, it must be in the KMail dimap + // subdir and must be have a uidcache file or be a maildir folder + QString maildir(fname + "/new"); + QString imapcachefile = QString::fromLatin1(".%1.uidcache").arg(fname); + if ( dir.exists( imapcachefile) || dir.exists( maildir ) ) + { + folder = new KMFolder( this, fname, KMFolderTypeCachedImap ); + append(folder); + folderList.append(folder); + } + } + } + else if ( mDirType == KMSearchDir) + { + folder = new KMFolder( this, fname, KMFolderTypeSearch ); + append(folder); + folderList.append(folder); + } + else if ( mDirType == KMStandardDir ) + { + // This is neither an imap, dimap nor a search folder. Can be either + // mbox or maildir. + if (fileInfo->isDir()) + { + // Maildir folder + if( dir.exists( fname + "/new" ) ) + { + folder = new KMFolder( this, fname, KMFolderTypeMaildir ); + append(folder); + folderList.append(folder); + } + } + else + { + // all other files are folders (at the moment ;-) + folder = new KMFolder( this, fname, KMFolderTypeMbox ); + append(folder); + folderList.append(folder); + } + } + } + + for (folder=folderList.first(); folder; folder=folderList.next()) + { + for(QStringList::Iterator it = diList.begin(); + it != diList.end(); + ++it) + if (*it == "." + folder->fileName() + ".directory") + { + KMFolderDir* folderDir = new KMFolderDir( folder, this, *it, mDirType); + folderDir->reload(); + append(folderDir); + folder->setChild(folderDir); + break; + } + } + return TRUE; +} + + +//----------------------------------------------------------------------------- +KMFolderNode* KMFolderDir::hasNamedFolder(const QString& aName) +{ + KMFolderNode* fNode; + for (fNode=first(); fNode; fNode=next()) { + if (fNode->name() == aName) + return fNode; + } + return 0; +} + + +//----------------------------------------------------------------------------- +KMFolderMgr* KMFolderDir::manager() const +{ + return parent()->manager(); +} + + +#include "kmfolderdir.moc" + -- cgit v1.2.1