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 
00010 #include <assert.h>
00011 #include <errno.h>
00012 #include <klocale.h>
00013 #include <kmessagebox.h>
00014 #include <kdebug.h>
00015 #include <kstandarddirs.h>
00016 
00017 
00018 //=============================================================================
00019 //=============================================================================
00020 KMFolderRootDir::KMFolderRootDir(KMFolderMgr* manager, const QString& path, 
00021                  KMFolderDirType dirType):
00022   KMFolderDir(0, path, dirType)
00023 {
00024   setPath(path);
00025   mManager = manager;
00026 }
00027 
00028 //-----------------------------------------------------------------------------
00029 KMFolderRootDir::~KMFolderRootDir()
00030 {
00031   // WABA: We can't let KMFolderDir do this because by the time its
00032   // desctructor gets called, KMFolderRootDir is already destructed
00033   // Most notably the path.
00034   clear();
00035 }
00036 
00037 //-----------------------------------------------------------------------------
00038 void KMFolderRootDir::setPath(const QString& aPath)
00039 {
00040   mPath = aPath;
00041 }
00042 
00043 
00044 //-----------------------------------------------------------------------------
00045 QString KMFolderRootDir::path() const
00046 {
00047   return mPath;
00048 }
00049 
00050 
00051 //-----------------------------------------------------------------------------
00052 KMFolderMgr* KMFolderRootDir::manager() const
00053 {
00054   return mManager;
00055 }
00056 
00057 
00058 //=============================================================================
00059 //=============================================================================
00060 KMFolderDir::KMFolderDir(KMFolderDir* parent, const QString& name,
00061              KMFolderDirType dirType):
00062   KMFolderNode(parent,name), KMFolderNodeList()
00063 {
00064 
00065   setAutoDelete(TRUE);
00066 
00067   mType = "dir";
00068   mDirType = dirType;
00069 }
00070 
00071 
00072 //-----------------------------------------------------------------------------
00073 KMFolderDir::~KMFolderDir()
00074 {
00075   clear();
00076 }
00077 
00078 
00079 //-----------------------------------------------------------------------------
00080 KMFolder* KMFolderDir::createFolder(const QString& aFolderName, bool aSysFldr, KMFolderType aFolderType)
00081 {
00082   KMFolder* fld;
00083   int rc;
00084 
00085   assert(!aFolderName.isEmpty());
00086   if (aFolderType == KMFolderTypeCachedImap )
00087     fld = new KMFolderCachedImap(this, aFolderName);
00088   else if (mDirType == KMImapDir)
00089     fld = new KMFolderImap(this, aFolderName);
00090   else if (aFolderType == KMFolderTypeMaildir)
00091     fld = new KMFolderMaildir(this, aFolderName);
00092   else if (aFolderType == KMFolderTypeSearch)
00093     fld = new KMFolderSearch(this, aFolderName);
00094   else
00095     fld = new KMFolderMbox(this, aFolderName);
00096   assert(fld != 0);
00097 
00098   fld->setSystemFolder(aSysFldr);
00099 
00100   rc = fld->create(mDirType == KMImapDir);
00101   if (rc)
00102   {
00103     QString msg = i18n("<qt>Error while creating file <b>%1</b>:<br>%2</qt>").arg(aFolderName).arg(strerror(rc));
00104     KMessageBox::information(0, msg);
00105     delete fld;
00106     fld = 0;
00107     return 0;
00108   }
00109 
00110   KMFolderNode* fNode;
00111   int index = 0;
00112   for (fNode=first(); fNode; fNode=next()) {
00113     if (fNode->name().lower() > fld->name().lower()) {
00114       insert( index, fld );
00115       break;
00116     }
00117     ++index;
00118   }
00119 
00120   if (!fNode)
00121     append(fld);
00122 
00123   fld->correctUnreadMsgsCount();
00124   return fld;
00125 }
00126 
00127 
00128 //----------------------------------------------------------------------------
00129 QString KMFolderDir::path() const
00130 {
00131   static QString p;
00132 
00133   if (parent())
00134   {
00135     p = parent()->path();
00136     p.append("/");
00137     p.append(name());
00138   }
00139   else p = "";
00140 
00141   return p;
00142 }
00143 
00144 
00145 //-----------------------------------------------------------------------------
00146 bool KMFolderDir::reload(void)
00147 {
00148   QDir               dir;
00149   KMFolder*          folder;
00150   QFileInfo*         fileInfo;
00151   QFileInfoList*     fiList;
00152   QStringList        diList;
00153   QPtrList<KMFolder> folderList;
00154   QString fname;
00155   QString fldPath;
00156 
00157   clear();
00158 
00159   fldPath = path();
00160   dir.setFilter(QDir::Files | QDir::Dirs | QDir::Hidden);
00161   dir.setNameFilter("*");
00162 
00163   if (!dir.cd(fldPath, TRUE))
00164   {
00165     QString msg = i18n("<qt>Cannot enter folder <b>%1</b>.</qt>").arg(fldPath);
00166     KMessageBox::information(0, msg);
00167     return FALSE;
00168   }
00169 
00170   if (!(fiList=(QFileInfoList*)dir.entryInfoList()))
00171   {
00172     QString msg = i18n("<qt>Folder <b>%1</b> is unreadable.</qt>").arg(fldPath);
00173     KMessageBox::information(0, msg);
00174     return FALSE;
00175   }
00176 
00177   for (fileInfo=fiList->first(); fileInfo; fileInfo=fiList->next())
00178   {
00179     fname = fileInfo->fileName();
00180     if( ( fname[0] == '.' ) && !fname.endsWith( ".directory" ) ) {
00181       // ignore all hidden files except our subfolder containers
00182       continue;
00183     }
00184     else if( fname == ".directory" ) {
00185       // ignore .directory files (not created by us)
00186       continue;
00187     }
00188     else if (fileInfo->isDir()) // a directory
00189     {
00190       QString maildir(fname + "/new");
00191       QString imapcachefile = QString::fromLatin1(".%1.uidcache").arg(fname);
00192 
00193       // For this to be a cached IMAP folder, it must be in the KMail dimap
00194       // subdir and must be have a uidcache file or be a maildir folder
00195       if( path().startsWith( locateLocal("data", "kmail/dimap") )
00196       && ( dir.exists( imapcachefile) || dir.exists( maildir ) ) )
00197       {
00198     kdDebug(5006) << "KMFolderDir creating new CachedImap folder with name " << fname << endl;
00199     folder = new KMFolderCachedImap(this, fname);
00200         append(folder);
00201         folderList.append(folder);
00202       } else if( ( mDirType != KMImapDir )
00203                  && !( ( fname[0] == '.' ) && fname.endsWith( ".directory" ) )
00204                  && dir.exists( maildir ) ) {
00205     // see if this is a maildir before assuming a subdir
00206         folder = new KMFolderMaildir(this, fname);
00207         append(folder);
00208         folderList.append(folder);
00209       }
00210       else
00211         diList.append(fname);
00212     }
00213     else if (mDirType == KMImapDir)
00214     {
00215       if (KMFolderImap::encodeFileName(KMFolderImap::decodeFileName(fname))
00216           == fname)
00217       {
00218         folder = new KMFolderImap(this, KMFolderImap::decodeFileName(fname));
00219         append(folder);
00220         folderList.append(folder);
00221       }
00222     }
00223     else if (mDirType == KMSearchDir)
00224     {
00225     folder = new KMFolderSearch(this, fname);
00226     append(folder);
00227     folderList.append(folder);
00228     }
00229     else // all other files are folders (at the moment ;-)
00230     {
00231       folder = new KMFolderMbox(this, fname);
00232       append(folder);
00233       folderList.append(folder);
00234     }
00235   }
00236 
00237   for (folder=folderList.first(); folder; folder=folderList.next())
00238   {
00239     for(QStringList::Iterator it = diList.begin();
00240         it != diList.end();
00241         ++it)
00242       if (*it == "." + folder->fileName() + ".directory")
00243       {
00244         KMFolderDir* folderDir = new KMFolderDir(this, *it, mDirType);
00245         folderDir->reload();
00246         append(folderDir);
00247         folder->setChild(folderDir);
00248         break;
00249       }
00250   }
00251 
00252   return TRUE;
00253 }
00254 
00255 
00256 //-----------------------------------------------------------------------------
00257 KMFolderNode* KMFolderDir::hasNamedFolder(const QString& aName)
00258 {
00259   KMFolderNode* fNode;
00260   for (fNode=first(); fNode; fNode=next()) {
00261     if (fNode->name() == aName)
00262       return fNode;
00263   }
00264   return 0;
00265 }
00266 
00267 
00268 //-----------------------------------------------------------------------------
00269 KMFolderMgr* KMFolderDir::manager() const
00270 {
00271   return parent()->manager();
00272 }
00273 
00274 
00275 #include "kmfolderdir.moc"
00276 
KDE Logo
This file is part of the documentation for kmail Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:37:27 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003