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