00001
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
00033
00034
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
00210
continue;
00211 }
00212
if( fname ==
".directory" ) {
00213
00214
continue;
00215 }
00216
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
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())
00240 {
00241
00242
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
00262
00263
if (fileInfo->isDir())
00264 {
00265
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
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