// -*- mode: C++; c-file-style: "gnu" -*- // kmfolder.cpp // Author: Stefan Taferner #include #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 #include #include #include 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& 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 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 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 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 it(*dir); for ( ; it.current(); ++it ) if (!it.current()->isDir()) { folder = static_cast(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& 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"