kmail Library API Documentation

kmfolderdir.cpp

00001 // kmfolderdir.cpp
00002 
00003 #include <config.h>
00004 #include <qdir.h>
00005 
00006 #include "kmfolderdir.h"
00007 #include "kmfoldersearch.h"
00008 #include "kmfoldercachedimap.h"
00009 #include "kmfolder.h"
00010 
00011 #include <assert.h>
00012 #include <errno.h>
00013 #include <klocale.h>
00014 #include <kmessagebox.h>
00015 #include <kdebug.h>
00016 #include <kstandarddirs.h>
00017 
00018 
00019 //=============================================================================
00020 //=============================================================================
00021 KMFolderRootDir::KMFolderRootDir(KMFolderMgr* manager, const QString& path,
00022                                  KMFolderDirType dirType)
00023   : KMFolderDir( 0, 0, path, dirType ),
00024     mPath( path ),
00025     mManager( manager )
00026 {
00027 }
00028 
00029 //-----------------------------------------------------------------------------
00030 KMFolderRootDir::~KMFolderRootDir()
00031 {
00032   // WABA: We can't let KMFolderDir do this because by the time its
00033   // desctructor gets called, KMFolderRootDir is already destructed
00034   // Most notably the path.
00035   clear();
00036 }
00037 
00038 //-----------------------------------------------------------------------------
00039 void KMFolderRootDir::setPath(const QString& aPath)
00040 {
00041   mPath = aPath;
00042 }
00043 
00044 
00045 //-----------------------------------------------------------------------------
00046 QString KMFolderRootDir::path() const
00047 {
00048   return mPath;
00049 }
00050 
00051 
00052 //-----------------------------------------------------------------------------
00053 QString KMFolderRootDir::prettyURL() const
00054 {
00055   if ( !mBaseURL.isEmpty() )
00056     return '/' + i18n( mBaseURL.data() );
00057   else
00058     return QString::null;
00059 }
00060 
00061 
00062 //-----------------------------------------------------------------------------
00063 void KMFolderRootDir::setBaseURL( const QCString &baseURL )
00064 {
00065   mBaseURL = baseURL;
00066 }
00067 
00068 
00069 //-----------------------------------------------------------------------------
00070 KMFolderMgr* KMFolderRootDir::manager() const
00071 {
00072   return mManager;
00073 }
00074 
00075 
00076 //=============================================================================
00077 //=============================================================================
00078 KMFolderDir::KMFolderDir( KMFolder * owner, KMFolderDir* parent,
00079                           const QString& name, KMFolderDirType dirType )
00080   : KMFolderNode( parent, name ), KMFolderNodeList(),
00081     mOwner( owner ), mDirType( dirType )
00082 {
00083   setAutoDelete( true );
00084   setType( "dir" );
00085 }
00086 
00087 
00088 //-----------------------------------------------------------------------------
00089 KMFolderDir::~KMFolderDir()
00090 {
00091   clear();
00092 }
00093 
00094 
00095 //-----------------------------------------------------------------------------
00096 KMFolder* KMFolderDir::createFolder(const QString& aFolderName, bool aSysFldr, KMFolderType aFolderType)
00097 {
00098   KMFolder* fld;
00099   int rc;
00100 
00101   assert(!aFolderName.isEmpty());
00102   if (mDirType == KMImapDir)
00103     fld = new KMFolder( this, aFolderName, KMFolderTypeImap );
00104   else
00105     fld = new KMFolder( this, aFolderName, aFolderType );
00106   assert(fld != 0);
00107 
00108   fld->setSystemFolder(aSysFldr);
00109 
00110   rc = fld->create(mDirType == KMImapDir);
00111   if (rc)
00112   {
00113     QString msg = i18n("<qt>Error while creating file <b>%1</b>:<br>%2</qt>").arg(aFolderName).arg(strerror(rc));
00114     KMessageBox::information(0, msg);
00115     delete fld;
00116     fld = 0;
00117     return 0;
00118   }
00119 
00120   KMFolderNode* fNode;
00121   int index = 0;
00122   for (fNode=first(); fNode; fNode=next()) {
00123     if (fNode->name().lower() > fld->name().lower()) {
00124       insert( index, fld );
00125       break;
00126     }
00127     ++index;
00128   }
00129 
00130   if (!fNode)
00131     append(fld);
00132 
00133   fld->correctUnreadMsgsCount();
00134   return fld;
00135 }
00136 
00137 
00138 //----------------------------------------------------------------------------
00139 QString KMFolderDir::path() const
00140 {
00141   static QString p;
00142 
00143   if (parent())
00144   {
00145     p = parent()->path();
00146     p.append("/");
00147     p.append(name());
00148   }
00149   else p = "";
00150 
00151   return p;
00152 }
00153 
00154 
00155 //----------------------------------------------------------------------------
00156 QString KMFolderDir::label() const
00157 {
00158   if ( mOwner )
00159     return mOwner->label();
00160   else
00161     return QString::null;
00162 }
00163 
00164 
00165 //-----------------------------------------------------------------------------
00166 QString KMFolderDir::prettyURL() const
00167 {
00168   if ( parent() )
00169     return parent()->prettyURL() + '/' + label();
00170   else
00171     return '/' + label();
00172 }
00173 
00174 
00175 //-----------------------------------------------------------------------------
00176 bool KMFolderDir::reload(void)
00177 {
00178   QDir               dir;
00179   KMFolder*          folder;
00180   QFileInfo*         fileInfo;
00181   QStringList        diList;
00182   QPtrList<KMFolder> folderList;
00183 
00184   clear();
00185 
00186   const QString fldPath = path();
00187   dir.setFilter(QDir::Files | QDir::Dirs | QDir::Hidden);
00188   dir.setNameFilter("*");
00189 
00190   if (!dir.cd(fldPath, TRUE))
00191   {
00192     QString msg = i18n("<qt>Cannot enter folder <b>%1</b>.</qt>").arg(fldPath);
00193     KMessageBox::information(0, msg);
00194     return FALSE;
00195   }
00196 
00197   QFileInfoList* fiList=(QFileInfoList*)dir.entryInfoList();
00198   if (!fiList)
00199   {
00200     QString msg = i18n("<qt>Folder <b>%1</b> is unreadable.</qt>").arg(fldPath);
00201     KMessageBox::information(0, msg);
00202     return FALSE;
00203   }
00204 
00205   for (fileInfo=fiList->first(); fileInfo; fileInfo=fiList->next())
00206   {
00207     const QString fname = fileInfo->fileName();
00208     if( ( fname[0] == '.' ) && !fname.endsWith( ".directory" ) ) {
00209       // ignore all hidden files except our subfolder containers
00210       continue;
00211     }
00212     if( fname == ".directory" ) {
00213       // ignore .directory files (not created by us)
00214       continue;
00215     }
00216     // Collect subdirectories.
00217     if ( fileInfo->isDir() &&
00218          fname.startsWith( "." ) && fname.endsWith( ".directory" ) ) {
00219        diList.append(fname);
00220        continue;
00221     }
00222 
00223     if ( mDirType == KMImapDir
00224       && path().startsWith( KMFolderImap::cacheLocation() ) )
00225     {
00226        // Is the below needed for dimap as well?
00227        if ( KMFolderImap::encodeFileName(
00228                 KMFolderImap::decodeFileName( fname ) ) == fname )
00229        {
00230           folder = new KMFolder(  this, KMFolderImap::decodeFileName( fname ),
00231                                   KMFolderTypeImap );
00232           append(folder);
00233           folderList.append(folder);
00234        }
00235     }
00236     else if ( mDirType == KMDImapDir
00237            && path().startsWith( KMFolderCachedImap::cacheLocation() ) )
00238     {
00239        if (fileInfo->isDir()) // a directory
00240        {
00241           // For this to be a cached IMAP folder, it must be in the KMail dimap
00242           // subdir and must be have a uidcache file or be a maildir folder
00243           QString maildir(fname + "/new");
00244           QString imapcachefile = QString::fromLatin1(".%1.uidcache").arg(fname);
00245           if ( dir.exists( imapcachefile) || dir.exists( maildir ) )
00246           {
00247              folder = new KMFolder( this, fname, KMFolderTypeCachedImap );
00248              append(folder);
00249              folderList.append(folder);
00250           }
00251        }
00252     }
00253     else if ( mDirType == KMSearchDir)
00254     {
00255        folder = new KMFolder( this, fname, KMFolderTypeSearch );
00256        append(folder);
00257        folderList.append(folder);
00258     }
00259     else if ( mDirType == KMStandardDir )
00260     {
00261        // This is neither an imap, dimap nor a search folder. Can be either
00262        // mbox or maildir.
00263        if (fileInfo->isDir())
00264        {
00265           // Maildir folder
00266           if( dir.exists( fname + "/new" ) )
00267           {
00268              folder = new KMFolder( this, fname, KMFolderTypeMaildir );
00269              append(folder);
00270              folderList.append(folder);
00271           }
00272        }
00273        else
00274        {
00275           // all other files are folders (at the moment ;-)
00276           folder = new KMFolder( this, fname, KMFolderTypeMbox );
00277           append(folder);
00278           folderList.append(folder);
00279        }
00280     }
00281   }
00282 
00283   for (folder=folderList.first(); folder; folder=folderList.next())
00284   {
00285     for(QStringList::Iterator it = diList.begin();
00286         it != diList.end();
00287         ++it)
00288       if (*it == "." + folder->fileName() + ".directory")
00289       {
00290         KMFolderDir* folderDir = new KMFolderDir( folder, this, *it, mDirType);
00291         folderDir->reload();
00292         append(folderDir);
00293         folder->setChild(folderDir);
00294         break;
00295       }
00296   }
00297   return TRUE;
00298 }
00299 
00300 
00301 //-----------------------------------------------------------------------------
00302 KMFolderNode* KMFolderDir::hasNamedFolder(const QString& aName)
00303 {
00304   KMFolderNode* fNode;
00305   for (fNode=first(); fNode; fNode=next()) {
00306     if (fNode->name() == aName)
00307       return fNode;
00308   }
00309   return 0;
00310 }
00311 
00312 
00313 //-----------------------------------------------------------------------------
00314 KMFolderMgr* KMFolderDir::manager() const
00315 {
00316   return parent()->manager();
00317 }
00318 
00319 
00320 #include "kmfolderdir.moc"
00321 
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Aug 23 18:21:21 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003