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 Wed Jul 28 23:58:00 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003