kmail Library API Documentation

listjob.cpp

00001 00029 #include "listjob.h" 00030 #include "kmfolderimap.h" 00031 #include "kmfoldercachedimap.h" 00032 #include "kmacctimap.h" 00033 #include "kmacctcachedimap.h" 00034 #include "folderstorage.h" 00035 #include "kmfolder.h" 00036 #include "progressmanager.h" 00037 using KPIM::ProgressManager; 00038 00039 #include <kdebug.h> 00040 #include <kurl.h> 00041 #include <kio/scheduler.h> 00042 #include <kio/job.h> 00043 #include <kio/global.h> 00044 #include <klocale.h> 00045 00046 using namespace KMail; 00047 00048 ListJob::ListJob( FolderStorage* storage, ImapAccountBase* account, 00049 ImapAccountBase::ListType type, 00050 bool secondStep, bool complete, bool hasInbox, const QString& path, 00051 KPIM::ProgressItem* item ) 00052 : FolderJob( 0, tOther, (storage ? storage->folder() : 0) ), 00053 mStorage( storage ), mAccount( account ), mType( type ), 00054 mHasInbox( hasInbox ), mSecondStep( secondStep ), mComplete( complete ), 00055 mPath( path ), mParentProgressItem( item ) 00056 { 00057 } 00058 00059 ListJob::~ListJob() 00060 { 00061 } 00062 00063 void ListJob::execute() 00064 { 00065 if ( mAccount->makeConnection() == ImapAccountBase::Error ) 00066 { 00067 kdWarning(5006) << "ListJob - got no connection" << endl; 00068 delete this; 00069 return; 00070 } else if ( mAccount->makeConnection() == ImapAccountBase::Connecting ) 00071 { 00072 // We'll wait for the connectionResult signal from the account. 00073 kdDebug(5006) << "ListJob - waiting for connection" << endl; 00074 connect( mAccount, SIGNAL( connectionResult(int, const QString&) ), 00075 this, SLOT( slotConnectionResult(int, const QString&) ) ); 00076 return; 00077 } 00078 // this is needed until we have a common base class for d(imap) 00079 if ( mPath.isEmpty() ) 00080 { 00081 if ( mStorage && mStorage->folderType() == KMFolderTypeImap ) { 00082 mPath = static_cast<KMFolderImap*>(mStorage)->imapPath(); 00083 } else if ( mStorage && mStorage->folderType() == KMFolderTypeCachedImap ) { 00084 mPath = static_cast<KMFolderCachedImap*>(mStorage)->imapPath(); 00085 } else { 00086 kdError(5006) << "ListJob - no valid path and no folder given" << endl; 00087 delete this; 00088 return; 00089 } 00090 } 00091 // create jobData 00092 ImapAccountBase::jobData jd; 00093 jd.total = 1; jd.done = 0; 00094 jd.cancellable = true; 00095 jd.createInbox = ( mSecondStep && !mHasInbox ) ? true : false; 00096 jd.parent = mDestFolder; 00097 jd.onlySubscribed = ( mType != ImapAccountBase::List ); 00098 jd.path = mPath; 00099 QString status = mDestFolder ? mDestFolder->prettyURL() : QString::null; 00100 if ( mParentProgressItem ) 00101 { 00102 jd.progressItem = ProgressManager::createProgressItem( 00103 mParentProgressItem, 00104 "ListDir" + ProgressManager::getUniqueID(), 00105 status, 00106 i18n("retrieving folders"), 00107 false, 00108 mAccount->useSSL() || mAccount->useTLS() ); 00109 mParentProgressItem->setStatus( status ); 00110 } 00111 00112 // this is needed if you have a prefix 00113 // as the INBOX is located in your root ("/") and needs a special listing 00114 jd.inboxOnly = !mSecondStep && mAccount->prefix() != "/" 00115 && mPath == mAccount->prefix() && !mHasInbox; 00116 // make the URL 00117 QString ltype = "LIST"; 00118 if ( mType == ImapAccountBase::ListSubscribed ) 00119 ltype = "LSUB"; 00120 else if ( mType == ImapAccountBase::ListSubscribedNoCheck ) 00121 ltype = "LSUBNOCHECK"; 00122 KURL url = mAccount->getUrl(); 00123 url.setPath( ( jd.inboxOnly ? QString("/") : mPath ) 00124 + ";TYPE=" + ltype 00125 + ( mComplete ? ";SECTION=COMPLETE" : QString::null) ); 00126 // go 00127 KIO::SimpleJob *job = KIO::listDir( url, false ); 00128 KIO::Scheduler::assignJobToSlave( mAccount->slave(), job ); 00129 mAccount->insertJob( job, jd ); 00130 connect( job, SIGNAL(result(KIO::Job *)), 00131 this, SLOT(slotListResult(KIO::Job *)) ); 00132 connect( job, SIGNAL(entries(KIO::Job *, const KIO::UDSEntryList &)), 00133 this, SLOT(slotListEntries(KIO::Job *, const KIO::UDSEntryList &)) ); 00134 } 00135 00136 void ListJob::slotConnectionResult( int errorCode, const QString& errorMsg ) 00137 { 00138 Q_UNUSED( errorMsg ); 00139 if ( !errorCode ) 00140 execute(); 00141 else { 00142 if ( mParentProgressItem ) 00143 mParentProgressItem->setComplete(); 00144 delete this; 00145 } 00146 } 00147 00148 void ListJob::slotListResult( KIO::Job* job ) 00149 { 00150 ImapAccountBase::JobIterator it = mAccount->findJob( job ); 00151 if ( it == mAccount->jobsEnd() ) 00152 { 00153 delete this; 00154 return; 00155 } 00156 if ( job->error() ) 00157 { 00158 mAccount->handleJobError( job, 00159 i18n( "Error while listing folder %1: " ).arg((*it).path), 00160 true ); 00161 } else 00162 { 00163 // transport the information, include the jobData 00164 emit receivedFolders( mSubfolderNames, mSubfolderPaths, 00165 mSubfolderMimeTypes, mSubfolderAttributes, *it ); 00166 mAccount->removeJob( it ); 00167 } 00168 delete this; 00169 } 00170 00171 void ListJob::slotListEntries( KIO::Job* job, const KIO::UDSEntryList& uds ) 00172 { 00173 ImapAccountBase::JobIterator it = mAccount->findJob( job ); 00174 if ( it == mAccount->jobsEnd() ) 00175 { 00176 delete this; 00177 return; 00178 } 00179 if( (*it).progressItem ) 00180 (*it).progressItem->setProgress( 50 ); 00181 QString name; 00182 KURL url; 00183 QString mimeType; 00184 QString attributes; 00185 for ( KIO::UDSEntryList::ConstIterator udsIt = uds.begin(); 00186 udsIt != uds.end(); udsIt++ ) 00187 { 00188 mimeType = QString::null; 00189 attributes = QString::null; 00190 for ( KIO::UDSEntry::ConstIterator eIt = (*udsIt).begin(); 00191 eIt != (*udsIt).end(); eIt++ ) 00192 { 00193 // get the needed information 00194 if ( (*eIt).m_uds == KIO::UDS_NAME ) 00195 name = (*eIt).m_str; 00196 else if ( (*eIt).m_uds == KIO::UDS_URL ) 00197 url = KURL((*eIt).m_str, 106); // utf-8 00198 else if ( (*eIt).m_uds == KIO::UDS_MIME_TYPE ) 00199 mimeType = (*eIt).m_str; 00200 else if ( (*eIt).m_uds == KIO::UDS_EXTRA ) 00201 attributes = (*eIt).m_str; 00202 } 00203 if ( (mimeType == "inode/directory" || mimeType == "message/digest" 00204 || mimeType == "message/directory") 00205 && name != ".." && (mAccount->hiddenFolders() || name.at(0) != '.') 00206 && (!(*it).inboxOnly || name.upper() == "INBOX") ) 00207 { 00208 if ( ((*it).inboxOnly || 00209 url.path() == "/INBOX/") && name.upper() == "INBOX" && 00210 !mHasInbox ) 00211 { 00212 // our INBOX 00213 (*it).createInbox = true; 00214 } 00215 00216 // Some servers send _lots_ of duplicates 00217 // This check is too slow for huge lists 00218 if ( mSubfolderPaths.count() > 100 || 00219 mSubfolderPaths.findIndex(url.path()) == -1 ) 00220 { 00221 mSubfolderNames.append( name ); 00222 mSubfolderPaths.append( url.path() ); 00223 mSubfolderMimeTypes.append( mimeType ); 00224 mSubfolderAttributes.append( attributes ); 00225 } 00226 } 00227 } 00228 } 00229 00230 #include "listjob.moc"
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:19:24 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003