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.
 
 
 

683 lines
15 KiB

// -*- mode: C++; c-file-style: "gnu" -*-
// kmfolder.cpp
// Author: Stefan Taferner <taferner@alpin.or.at>
#include <config.h>
#include "kmfolder.h"
#include "kmfolderdir.h"
#include "kmfoldermbox.h"
#include "folderstorage.h"
#include "kmfoldercachedimap.h"
#include "kmfoldersearch.h"
#include "kmfolderimap.h"
#include "kmfoldermgr.h"
#include <errno.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <qfile.h>
KMFolder::KMFolder( KMFolderDir* aParent, const QString& aFolderName,
KMFolderType aFolderType )
: KMFolderNode( aParent, aFolderName ), mParent( aParent ), mChild( 0 ),
mIsSystemFolder( false ),
mExpireMessages( false ), mUnreadExpireAge( 28 ),
mReadExpireAge( 14 ), mUnreadExpireUnits( expireNever ),
mReadExpireUnits( expireNever ),
mUseCustomIcons( false )
{
if( aFolderType == KMFolderTypeCachedImap )
mStorage = new KMFolderCachedImap( this, aFolderName.latin1() );
else if( aFolderType == KMFolderTypeImap )
mStorage = new KMFolderImap( this, aFolderName.latin1() );
else if( aFolderType == KMFolderTypeMaildir )
mStorage = new KMFolderMaildir( this, aFolderName.latin1() );
else if( aFolderType == KMFolderTypeSearch )
mStorage = new KMFolderSearch( this, aFolderName.latin1() );
else
mStorage = new KMFolderMbox( this, aFolderName.latin1() );
if ( aParent ) {
connect( mStorage, SIGNAL( msgAdded( KMFolder*, Q_UINT32 ) ),
aParent->manager(), SIGNAL( msgAdded( KMFolder*, Q_UINT32 ) ) );
connect( mStorage, SIGNAL( msgRemoved( KMFolder*, Q_UINT32 ) ),
parent()->manager(), SIGNAL( msgRemoved( KMFolder*, Q_UINT32 ) ) );
connect( this, SIGNAL( msgChanged( KMFolder*, Q_UINT32, int ) ),
parent()->manager(), SIGNAL( msgChanged( KMFolder*, Q_UINT32, int ) ) );
connect( this, SIGNAL( msgHeaderChanged( KMFolder*, int ) ),
parent()->manager(), SIGNAL( msgHeaderChanged( KMFolder*, int ) ) );
}
// Resend all mStorage signals
connect( mStorage, SIGNAL( changed() ), SIGNAL( changed() ) );
connect( mStorage, SIGNAL( cleared() ), SIGNAL( cleared() ) );
connect( mStorage, SIGNAL( expunged() ), SIGNAL( expunged() ) );
connect( mStorage, SIGNAL( nameChanged() ), SIGNAL( nameChanged() ) );
connect( mStorage, SIGNAL( msgRemoved( KMFolder*, Q_UINT32 ) ),
SIGNAL( msgRemoved( KMFolder*, Q_UINT32 ) ) );
connect( mStorage, SIGNAL( msgRemoved( int, QString, QString ) ),
SIGNAL( msgRemoved( int, QString, QString ) ) );
connect( mStorage, SIGNAL( msgRemoved( KMFolder* ) ),
SIGNAL( msgRemoved( KMFolder* ) ) );
connect( mStorage, SIGNAL( msgAdded( int ) ), SIGNAL( msgAdded( int ) ) );
connect( mStorage, SIGNAL( msgAdded( KMFolder*, Q_UINT32 ) ),
SIGNAL( msgAdded( KMFolder*, Q_UINT32 ) ) );
connect( mStorage, SIGNAL( msgChanged( KMFolder*, Q_UINT32 , int ) ),
SIGNAL( msgChanged( KMFolder*, Q_UINT32 , int ) ) );
connect( mStorage, SIGNAL( msgHeaderChanged( KMFolder*, int ) ),
SIGNAL( msgHeaderChanged( KMFolder*, int ) ) );
connect( mStorage, SIGNAL( statusMsg( const QString& ) ),
SIGNAL( statusMsg( const QString& ) ) );
connect( mStorage, SIGNAL( numUnreadMsgsChanged( KMFolder* ) ),
SIGNAL( numUnreadMsgsChanged( KMFolder* ) ) );
connect( mStorage, SIGNAL( syncRunning( KMFolder*, bool ) ),
SIGNAL( syncRunning( KMFolder*, bool ) ) );
}
KMFolder::~KMFolder()
{
delete mStorage;
}
void KMFolder::readConfig( KConfig* config )
{
mExpireMessages = config->readBoolEntry("ExpireMessages", false);
mReadExpireAge = config->readNumEntry("ReadExpireAge", 3);
mReadExpireUnits = (ExpireUnits)config->readNumEntry("ReadExpireUnits", expireMonths);
mUnreadExpireAge = config->readNumEntry("UnreadExpireAge", 12);
mUnreadExpireUnits = (ExpireUnits)config->readNumEntry("UnreadExpireUnits", expireNever);
mUseCustomIcons = config->readBoolEntry("UseCustomIcons", false );
mNormalIconPath = config->readEntry("NormalIconPath" );
mUnreadIconPath = config->readEntry("UnreadIconPath" );
if ( mUseCustomIcons )
emit iconsChanged();
}
void KMFolder::writeConfig( KConfig* config ) const
{
config->writeEntry("ExpireMessages", mExpireMessages);
config->writeEntry("ReadExpireAge", mReadExpireAge);
config->writeEntry("ReadExpireUnits", mReadExpireUnits);
config->writeEntry("UnreadExpireAge", mUnreadExpireAge);
config->writeEntry("UnreadExpireUnits", mUnreadExpireUnits);
config->writeEntry("UseCustomIcons", mUseCustomIcons);
config->writeEntry("NormalIconPath", mNormalIconPath);
config->writeEntry("UnreadIconPath", mUnreadIconPath);
}
KMFolderType KMFolder::folderType() const
{
return mStorage->folderType();
}
QString KMFolder::fileName() const
{
return mStorage->fileName();
}
QString KMFolder::location() const
{
return mStorage->location();
}
QString KMFolder::indexLocation() const
{
return mStorage->indexLocation();
}
QString KMFolder::subdirLocation() const
{
QString sLocation( path() );
if( !sLocation.isEmpty() )
sLocation += '/';
sLocation += '.' + FolderStorage::dotEscape( fileName() ) + ".directory";
return sLocation;
}
KMFolderDir* KMFolder::createChildFolder()
{
if( mChild )
return mChild;
QString childName = "." + fileName() + ".directory";
QString childDir = path() + "/" + childName;
if (access(QFile::encodeName(childDir), W_OK) != 0) // Not there or not writable
{
if (mkdir(QFile::encodeName(childDir), S_IRWXU) != 0
&& chmod(QFile::encodeName(childDir), S_IRWXU) != 0) {
QString wmsg = QString(" '%1': %2").arg(childDir).arg(strerror(errno));
KMessageBox::information(0,i18n("Failed to create folder") + wmsg);
return 0;
}
}
mChild = new KMFolderDir(parent(), childName,
(folderType() == KMFolderTypeImap) ? KMImapDir : KMStandardDir);
if( !mChild )
return 0;
mChild->reload();
parent()->append( mChild );
return mChild;
}
bool KMFolder::noContent() const
{
return mStorage->noContent();
}
void KMFolder::setNoContent( bool aNoContent )
{
mStorage->setNoContent( aNoContent );
}
KMMessage* KMFolder::getMsg( int idx )
{
return mStorage->getMsg( idx );
}
KMMsgInfo* KMFolder::unGetMsg( int idx )
{
return mStorage->unGetMsg( idx );
}
bool KMFolder::isMessage( int idx )
{
return mStorage->isMessage( idx );
}
QCString& KMFolder::getMsgString( int idx, QCString& mDest )
{
return mStorage->getMsgString( idx, mDest );
}
DwString KMFolder::getDwString( int idx )
{
return mStorage->getDwString( idx );
}
void KMFolder::ignoreJobsForMessage( KMMessage* m )
{
mStorage->ignoreJobsForMessage( m );
}
FolderJob* KMFolder::createJob( KMMessage *msg, FolderJob::JobType jt,
KMFolder *folder, QString partSpecifier,
const AttachmentStrategy *as ) const
{
return mStorage->createJob( msg, jt, folder, partSpecifier, as );
}
FolderJob* KMFolder::createJob( QPtrList<KMMessage>& msgList,
const QString& sets,
FolderJob::JobType jt, KMFolder *folder ) const
{
return mStorage->createJob( msgList, sets, jt, folder );
}
const KMMsgBase* KMFolder::getMsgBase( int idx ) const
{
return mStorage->getMsgBase( idx );
}
KMMsgBase* KMFolder::getMsgBase( int idx )
{
return mStorage->getMsgBase( idx );
}
const KMMsgBase* KMFolder::operator[]( int idx ) const
{
return mStorage->operator[]( idx );
}
KMMsgBase* KMFolder::operator[]( int idx )
{
return mStorage->operator[]( idx );
}
KMMessage* KMFolder::take( int idx )
{
return mStorage->take( idx );
}
void KMFolder::take( QPtrList<KMMessage> msgList )
{
mStorage->take( msgList );
}
int KMFolder::addMsg( KMMessage* msg, int* index_return )
{
return mStorage->addMsg( msg, index_return );
}
int KMFolder::addMsgKeepUID( KMMessage* msg, int* index_return )
{
return mStorage->addMsgKeepUID( msg, index_return );
}
void KMFolder::emitMsgAddedSignals( int idx )
{
mStorage->emitMsgAddedSignals( idx );
}
bool KMFolder::canAddMsgNow( KMMessage* aMsg, int* aIndex_ret )
{
return mStorage->canAddMsgNow( aMsg, aIndex_ret );
}
void KMFolder::removeMsg( int i, bool imapQuiet )
{
mStorage->removeMsg( i, imapQuiet );
}
void KMFolder::removeMsg( QPtrList<KMMessage> msgList, bool imapQuiet )
{
mStorage->removeMsg( msgList, imapQuiet );
}
int KMFolder::expungeOldMsg( int days )
{
return mStorage->expungeOldMsg( days );
}
int KMFolder::moveMsg( KMMessage* msg, int* index_return )
{
return mStorage->moveMsg( msg, index_return );
}
int KMFolder::moveMsg(QPtrList<KMMessage> q, int* index_return )
{
return mStorage->moveMsg( q, index_return );
}
int KMFolder::find( const KMMsgBase* msg ) const
{
return mStorage->find( msg );
}
int KMFolder::find( const KMMessage* msg ) const
{
return mStorage->find( msg );
}
int KMFolder::count( bool cache ) const
{
return mStorage->count( cache );
}
int KMFolder::countUnread()
{
return mStorage->countUnread();
}
int KMFolder::countUnreadRecursive()
{
KMFolder *folder;
int count = countUnread();
KMFolderDir *dir = child();
if (!dir)
return count;
QPtrListIterator<KMFolderNode> it(*dir);
for ( ; it.current(); ++it )
if (!it.current()->isDir()) {
folder = static_cast<KMFolder*>(it.current());
count += folder->countUnreadRecursive();
}
return count;
}
void KMFolder::msgStatusChanged( const KMMsgStatus oldStatus,
const KMMsgStatus newStatus, int idx )
{
mStorage->msgStatusChanged( oldStatus, newStatus, idx );
}
int KMFolder::open()
{
return mStorage->open();
}
int KMFolder::canAccess()
{
return mStorage->canAccess();
}
void KMFolder::close( bool force )
{
mStorage->close( force );
}
void KMFolder::sync()
{
mStorage->sync();
}
bool KMFolder::isOpened() const
{
return mStorage->isOpened();
}
void KMFolder::markNewAsUnread()
{
mStorage->markNewAsUnread();
}
void KMFolder::markUnreadAsRead()
{
mStorage->markUnreadAsRead();
}
int KMFolder::create( bool imap )
{
return mStorage->create( imap );
}
int KMFolder::remove()
{
return mStorage->remove();
}
int KMFolder::expunge()
{
return mStorage->expunge();
}
int KMFolder::compact()
{
return mStorage->compact();
}
int KMFolder::rename( const QString& newName, KMFolderDir *aParent )
{
return mStorage->rename( newName, aParent );
}
bool KMFolder::autoCreateIndex() const
{
return mStorage->autoCreateIndex();
}
void KMFolder::setAutoCreateIndex( bool b )
{
mStorage->setAutoCreateIndex( b );
}
bool KMFolder::dirty() const
{
return mStorage->dirty();
}
void KMFolder::setDirty( bool f )
{
mStorage->setDirty( f );
}
bool KMFolder::needsCompacting() const
{
return mStorage->needsCompacting();
}
void KMFolder::setNeedsCompacting( bool f )
{
mStorage->setNeedsCompacting( f );
}
void KMFolder::quiet( bool beQuiet )
{
mStorage->quiet( beQuiet );
}
bool KMFolder::isReadOnly() const
{
return mStorage->isReadOnly();
}
QString KMFolder::label() const
{
return mStorage->label();
}
void KMFolder::setLabel( const QString& lbl )
{
mStorage->setLabel( lbl );
}
const char* KMFolder::type() const
{
return mStorage->type();
}
QCString KMFolder::protocol() const
{
return mStorage->protocol();
}
bool KMFolder::hasAccounts() const
{
return mStorage->hasAccounts();
}
void KMFolder::setMailingList( bool enabled )
{
mStorage->setMailingList( enabled );
}
bool KMFolder::isMailingList() const
{
return mStorage->isMailingList();
}
void KMFolder::setMailingListPostAddress( const QString& address )
{
mStorage->setMailingListPostAddress( address );
}
QString KMFolder::mailingListPostAddress() const
{
return mStorage->mailingListPostAddress();
}
void KMFolder::setMailingListAdminAddress( const QString& address )
{
mStorage->setMailingListAdminAddress( address );
}
QString KMFolder::mailingListAdminAddress() const
{
return mStorage->mailingListAdminAddress();
}
void KMFolder::setIdentity( uint identity )
{
mStorage->setIdentity( identity );
}
uint KMFolder::identity() const
{
return mStorage->identity();
}
QString KMFolder::whoField() const
{
return mStorage->whoField();
}
void KMFolder::setWhoField(const QString& aWhoField )
{
mStorage->setWhoField( aWhoField );
}
QString KMFolder::userWhoField()
{
return mStorage->userWhoField();
}
void KMFolder::setUserWhoField( const QString& whoField, bool writeConfig )
{
mStorage->setUserWhoField( whoField, writeConfig );
}
void KMFolder::correctUnreadMsgsCount()
{
mStorage->correctUnreadMsgsCount();
}
QString KMFolder::idString() const
{
return mStorage->idString();
}
void KMFolder::setAutoExpire( bool enabled )
{
if( enabled != mExpireMessages ) {
mExpireMessages = enabled;
mStorage->writeConfig();
}
}
void KMFolder::setUnreadExpireAge( int age )
{
if( age >= 0 && age != mUnreadExpireAge ) {
mUnreadExpireAge = age;
mStorage->writeConfig();
}
}
void KMFolder::setUnreadExpireUnits( ExpireUnits units )
{
if (units >= expireNever && units < expireMaxUnits)
mUnreadExpireUnits = units;
}
void KMFolder::setReadExpireAge( int age )
{
if( age >= 0 && age != mReadExpireAge ) {
mReadExpireAge = age;
mStorage->writeConfig();
}
}
void KMFolder::setReadExpireUnits( ExpireUnits units )
{
if (units >= expireNever && units <= expireMaxUnits)
mReadExpireUnits = units;
}
static int daysToExpire( int number, ExpireUnits units )
{
switch (units) {
case expireDays: // Days
return number;
case expireWeeks: // Weeks
return number * 7;
case expireMonths: // Months - this could be better rather than assuming 31day months.
return number * 31;
default: // this avoids a compiler warning (not handled enumeration values)
;
}
return -1;
}
void KMFolder::daysToExpire(int& unreadDays, int& readDays) {
unreadDays = ::daysToExpire( getUnreadExpireAge(), getUnreadExpireUnits() );
readDays = ::daysToExpire( getReadExpireAge(), getReadExpireUnits() );
}
void KMFolder::expireOldMessages()
{
FolderJob *job = createJob( 0, FolderJob::tExpireMessages );
job->start();
}
int KMFolder::writeIndex( bool createEmptyIndex )
{
return mStorage->writeIndex( createEmptyIndex );
}
void KMFolder::fillMsgDict( KMMsgDict* dict )
{
mStorage->fillMsgDict( dict );
}
int KMFolder::writeMsgDict( KMMsgDict* dict)
{
return mStorage->writeMsgDict( dict );
}
int KMFolder::touchMsgDict()
{
return mStorage->touchMsgDict();
}
int KMFolder::appendtoMsgDict( int idx )
{
return mStorage->appendtoMsgDict( idx );
}
void KMFolder::setRDict( KMMsgDictREntry* rentry )
{
mStorage->setRDict( rentry );
}
KMMsgDictREntry* KMFolder::rDict() const
{
return mStorage->rDict();
}
void KMFolder::setStatus( int idx, KMMsgStatus status, bool toggle )
{
mStorage->setStatus( idx, status, toggle );
}
void KMFolder::setStatus( QValueList<int>& ids, KMMsgStatus status,
bool toggle )
{
mStorage->setStatus( ids, status, toggle);
}
void KMFolder::setIconPaths( const QString &normalPath,
const QString &unreadPath )
{
mNormalIconPath = normalPath;
mUnreadIconPath = unreadPath;
mStorage->writeConfig();
emit iconsChanged();
}
void KMFolder::removeJobs()
{
mStorage->removeJobs();
}
size_t KMFolder::crlf2lf( char* str, const size_t strLen )
{
return FolderStorage::crlf2lf( str, strLen );
}
int KMFolder::updateIndex()
{
return mStorage->updateIndex();
}
void KMFolder::reallyAddMsg( KMMessage* aMsg )
{
mStorage->reallyAddMsg( aMsg );
}
void KMFolder::reallyAddCopyOfMsg( KMMessage* aMsg )
{
mStorage->reallyAddCopyOfMsg( aMsg );
}
#include "kmfolder.moc"