// kmfolderdir.cpp #include "kmfolderdir.h" #include "kmfoldersearch.h" #include "kmfoldercachedimap.h" #include "kmfolder.h" #include #include #include #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. qDeleteAll( begin(), end() ); // we own the pointers to our folders 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(); } //----------------------------------------------------------------------------- void KMFolderRootDir::setBaseURL( const QByteArray &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 ) {} //----------------------------------------------------------------------------- KMFolderDir::~KMFolderDir() { qDeleteAll( begin(), end() ); // we own the pointers to our folders 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); bool inserted = false; QListIterator it( *this); int index = 0; while ( it.hasNext() ) { KMFolderNode* fNode = it.next(); if (fNode->name().toLower() > fld->name().toLower()) { insert( index, fld ); inserted = true; break; } ++index; } if ( !inserted ) 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(); } //----------------------------------------------------------------------------- QString KMFolderDir::prettyUrl() const { QString parentUrl; if ( parent() ) parentUrl = parent()->prettyUrl(); if ( !parentUrl.isEmpty() ) return parentUrl + '/' + label(); else return label(); } //----------------------------------------------------------------------------- bool KMFolderDir::reload(void) { qDeleteAll( begin(), end() ); // we own the pointers to our folders clear(); const QString fldPath = path(); QDir dir; dir.setFilter(QDir::Files | QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot); dir.setNameFilters(QStringList("*")); if ( !dir.cd(fldPath) ) { QString msg = i18n("Cannot enter folder %1.", fldPath); KMessageBox::information(0, msg); return false; } if ( !dir.isReadable() ) { QString msg = i18n("Folder %1 is unreadable.", fldPath); KMessageBox::information(0, msg); return false; } QSet dirs; QList folderList; const QFileInfoList fiList( dir.entryInfoList() ); Q_FOREACH( const QFileInfo& fileInfo, fiList ) { const QString fname = fileInfo.fileName(); const bool fileIsHidden = fname.startsWith('.'); if ( fileIsHidden && !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() && fileIsHidden && fname.endsWith( ".directory" ) ) { dirs.insert(fname); continue; } if ( mDirType == KMImapDir && path().startsWith( KMFolderImap::cacheLocation() ) ) { // Is the below needed for dimap as well? if ( KMFolderImap::encodeFileName( KMFolderImap::decodeFileName( fname ) ) == fname ) { KMFolder* 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 ) ) { KMFolder* folder = new KMFolder( this, fname, KMFolderTypeCachedImap ); append(folder); folderList.append(folder); } } } else if ( mDirType == KMSearchDir) { KMFolder* 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" ) ) { KMFolder* folder = new KMFolder( this, fname, KMFolderTypeMaildir ); append(folder); folderList.append(folder); } } else { // all other files are folders (at the moment ;-) KMFolder* folder = new KMFolder( this, fname, KMFolderTypeMbox ); append(folder); folderList.append(folder); } } } foreach ( KMFolder* folder, folderList ) { if ( dirs.contains( '.' + folder->fileName() + ".directory" ) ) { KMFolderDir* folderDir = new KMFolderDir( folder, this, '.' + folder->fileName() + ".directory", mDirType ); folderDir->reload(); append(folderDir); folder->setChild(folderDir); } } return true; } //----------------------------------------------------------------------------- KMFolderNode* KMFolderDir::hasNamedFolder(const QString& aName) { QListIterator it(*this); while ( it.hasNext() ) { KMFolderNode* node = it.next(); if ( node && node->name() == aName ) { return node; } } return 0; } //----------------------------------------------------------------------------- KMFolderMgr* KMFolderDir::manager() const { return parent()->manager(); } #include "kmfolderdir.moc"