kmfolderdir.cpp
00001
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
00032
00033
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
00182 continue;
00183 }
00184 else if( fname == ".directory" ) {
00185
00186 continue;
00187 }
00188 else if (fileInfo->isDir())
00189 {
00190 QString maildir(fname + "/new");
00191 QString imapcachefile = QString::fromLatin1(".%1.uidcache").arg(fname);
00192
00193
00194
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
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
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
This file is part of the documentation for kmail Library Version 3.2.2.