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.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 21 19:46:48 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003