You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

229 lines
5.3 KiB

// kmfolderdir.cpp
#include <qdir.h>
#include "kmfolderdir.h"
#include "kmfoldermaildir.h"
#include "kmfolderimap.h"
#include <assert.h>
#include <errno.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kdebug.h>
//=============================================================================
//=============================================================================
KMFolderRootDir::KMFolderRootDir(const QString& path, bool imap):
KMFolderDir(NULL, path, imap)
{
setPath(path);
}
//-----------------------------------------------------------------------------
KMFolderRootDir::~KMFolderRootDir()
{
// WABA: We can't let KMFolderDir do this because by the time its
// desctructor gets called, KMFolderRootDir is already destructed
// Most notably the path.
clear();
}
//-----------------------------------------------------------------------------
void KMFolderRootDir::setPath(const QString& aPath)
{
mPath = aPath;
}
//-----------------------------------------------------------------------------
QString KMFolderRootDir::path() const
{
return mPath;
}
//=============================================================================
//=============================================================================
KMFolderDir::KMFolderDir(KMFolderDir* parent, const QString& name, bool imap):
KMFolderNode(parent,name), KMFolderNodeList()
{
setAutoDelete(TRUE);
mType = "dir";
mImap = imap;
}
//-----------------------------------------------------------------------------
KMFolderDir::~KMFolderDir()
{
clear();
}
//-----------------------------------------------------------------------------
KMFolder* KMFolderDir::createFolder(const QString& aFolderName, bool aSysFldr, KMFolderType aFolderType)
{
KMFolder* fld;
int rc;
assert(!aFolderName.isEmpty());
if (mImap)
fld = new KMFolderImap(this, aFolderName);
else if (aFolderType == KMFolderTypeMaildir)
fld = new KMFolderMaildir(this, aFolderName);
else
fld = new KMFolderMbox(this, aFolderName);
assert(fld != NULL);
fld->setSystemFolder(aSysFldr);
rc = fld->create(mImap);
if (rc)
{
QString wmsg = i18n("Error while creating file `%1':\n%2").arg(aFolderName).arg(strerror(rc));
KMessageBox::information(0,wmsg );
delete fld;
return NULL;
}
KMFolderNode* fNode;
int index = 0;
for (fNode=first(); fNode; fNode=next()) {
if (fNode->name().lower() > fld->name().lower()) {
insert( index, fld );
break;
}
++index;
}
if (!fNode)
append(fld);
fld->correctUnreadMsgsCount();
return fld;
}
//----------------------------------------------------------------------------
QString KMFolderDir::path() const
{
static QString p;
if (parent())
{
p = parent()->path();
p.append("/");
p.append(name());
}
else p = "";
return p;
}
//-----------------------------------------------------------------------------
bool KMFolderDir::reload(void)
{
QDir dir;
KMFolder* folder;
QFileInfo* fileInfo;
QFileInfoList* fiList;
QStringList diList;
QPtrList<KMFolder> folderList;
QString fname;
QString fldPath;
clear();
fldPath = path();
dir.setFilter(QDir::Files | QDir::Dirs | QDir::Hidden);
dir.setNameFilter("*");
if (!dir.cd(fldPath, TRUE))
{
QString msg = i18n("Cannot enter directory '%1'.\n").arg(fldPath);
KMessageBox::information(0, msg );
return FALSE;
}
if (!(fiList=(QFileInfoList*)dir.entryInfoList()))
{
QString msg = i18n("Directory '%1' is unreadable.\n").arg(fldPath);
KMessageBox::information(0,msg);
return FALSE;
}
for (fileInfo=fiList->first(); fileInfo; fileInfo=fiList->next())
{
fname = fileInfo->fileName();
if ((fname[0]=='.') &&
!(fname.right(10)==".directory"))
continue;
else if (fname == ".directory")
continue;
else if (fileInfo->isDir()) // a directory
{
QString maildir(fname + "/new");
// see if this is a maildir before assuming a subdir
if (!mImap && dir.exists(maildir))
{
folder = new KMFolderMaildir(this, fname);
append(folder);
folderList.append(folder);
}
else
diList.append(fname);
}
else if (mImap)
{
if (KMFolderImap::encodeFileName(KMFolderImap::decodeFileName(fname))
== fname)
{
folder = new KMFolderImap(this, KMFolderImap::decodeFileName(fname));
append(folder);
folderList.append(folder);
}
}
else // all other files are folders (at the moment ;-)
{
folder = new KMFolderMbox(this, fname);
append(folder);
folderList.append(folder);
}
}
for (folder=folderList.first(); folder; folder=folderList.next())
{
for(QStringList::Iterator it = diList.begin();
it != diList.end();
++it)
if (*it == "." + folder->fileName() + ".directory")
{
KMFolderDir* folderDir = new KMFolderDir(this, *it, mImap);
folderDir->reload();
append(folderDir);
folder->setChild(folderDir);
break;
}
}
return TRUE;
}
KMFolderNode* KMFolderDir::hasNamedFolder(const QString& aName)
{
KMFolderNode* fNode;
for (fNode=first(); fNode; fNode=next()) {
if (fNode->name() == aName)
return fNode;
}
return 0;
}
#include "kmfolderdir.moc"