<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US"> <head> <title>kmail: kmfoldercachedimap.cpp Source File (kmail)</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline DE v2.0" l gen true for "http://www.kde.org" r (nz 1 vz 1 lz 1 oz 1 cb 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.kde.org" r (n 0 s 0 v 0 l 0))' /> <meta name="trademark" content="KDE e.V." /> <meta name="description" content="K Desktop Environment Homepage, KDE.org" /> <meta name="MSSmartTagsPreventParsing" content="true" /> <meta name="robots" content="all" /> <link rel="shortcut icon" href="../../favicon.ico" /> <link rel="stylesheet" media="screen" type="text/css" title="APIDOX" href="doxygen.css" /> <style type="text/css"> <!-- hr { display: none; } #content h2 { margin-left: 0px; } table.mdTable { background-color: #f8f8f8; border: .2em solid #d7d7d7; } td.mdRow { padding: 8px 20px; } td.md { font-weight: bold; } td.mdname1 { font-weight: bold; color: #602020; } td.mdname { font-weight: bold; color: #602020; } --> </style> </head> <body> <div id="nav_header_top" align="right"> <a href="#content" class="doNotDisplay" accesskey="2">Skip to main content ::</a> <a href="../.."><img id="nav_header_logo" alt="Home" align="left" src="../../kde_gear_64.png" border="0" /></a> <span class="doNotDisplay">::</span> <img id="nav_header_logo_right" alt="" align="right" src="../../pimlogo.png" border="0" /> <div id="nav_header_title" align="left">KDE PIM API Reference</div> </div> <div id="nav_header_bottom" align="right"> <span class="doNotDisplay">:: <a href="#navigation" accesskey="5">Skip to Link Menu</a><br/></span> <div id="nav_header_bottom_left" style="text-align: left;"> / <a href="../../">API Reference</a> / <a href=".">kmail</a> </div> </div> <table id="main" border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td valign="top" class="menuheader" height="0"></td> <td id="contentcolumn" valign="top" rowspan="2" > <div id="content" style="padding-top: 0px;"><div style="width:100%; margin: 0px; padding: 0px;"> <h2><a name="content"></a>kmail</h2> <!-- Generated by Doxygen 1.5.5 --> <h1>kmfoldercachedimap.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <a name="l00032"></a>00032 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span> <a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include <config.h></span> <a name="l00034"></a>00034 <span class="preprocessor">#endif</span> <a name="l00035"></a>00035 <span class="preprocessor"></span> <a name="l00036"></a>00036 <span class="preprocessor">#include <errno.h></span> <a name="l00037"></a>00037 <a name="l00038"></a>00038 <span class="preprocessor">#include <qvaluevector.h></span> <a name="l00039"></a>00039 <a name="l00040"></a>00040 <span class="preprocessor">#include "kmkernel.h"</span> <a name="l00041"></a>00041 <span class="preprocessor">#include "kmfoldercachedimap.h"</span> <a name="l00042"></a>00042 <span class="preprocessor">#include "undostack.h"</span> <a name="l00043"></a>00043 <span class="preprocessor">#include "kmfoldermgr.h"</span> <a name="l00044"></a>00044 <span class="preprocessor">#include "kmacctcachedimap.h"</span> <a name="l00045"></a>00045 <span class="preprocessor">#include "accountmanager.h"</span> <a name="l00046"></a>00046 <span class="keyword">using</span> <a class="code" href="classKMail_1_1AccountManager.html" title="The account manager is responsible for creating accounts of various types via the...">KMail::AccountManager</a>; <a name="l00047"></a>00047 <span class="preprocessor">#include "kmailicalifaceimpl.h"</span> <a name="l00048"></a>00048 <span class="preprocessor">#include "kmfolder.h"</span> <a name="l00049"></a>00049 <span class="preprocessor">#include "kmglobal.h"</span> <a name="l00050"></a>00050 <span class="preprocessor">#include "acljobs.h"</span> <a name="l00051"></a>00051 <span class="preprocessor">#include "broadcaststatus.h"</span> <a name="l00052"></a>00052 <span class="keyword">using</span> KPIM::BroadcastStatus; <a name="l00053"></a>00053 <span class="preprocessor">#include "progressmanager.h"</span> <a name="l00054"></a>00054 <a name="l00055"></a>00055 <span class="keyword">using</span> KMail::CachedImapJob; <a name="l00056"></a>00056 <span class="preprocessor">#include "imapaccountbase.h"</span> <a name="l00057"></a>00057 <span class="keyword">using</span> KMail::ImapAccountBase; <a name="l00058"></a>00058 <span class="preprocessor">#include "listjob.h"</span> <a name="l00059"></a>00059 <span class="keyword">using</span> <a class="code" href="classKMail_1_1ListJob.html" title="Generic folder list job for (d)imap accounts.">KMail::ListJob</a>; <a name="l00060"></a>00060 <a name="l00061"></a>00061 <span class="preprocessor">#include "kmfolderseldlg.h"</span> <a name="l00062"></a>00062 <span class="preprocessor">#include "kmcommands.h"</span> <a name="l00063"></a>00063 <span class="preprocessor">#include "kmmainwidget.h"</span> <a name="l00064"></a>00064 <a name="l00065"></a>00065 <span class="preprocessor">#include <kapplication.h></span> <a name="l00066"></a>00066 <span class="preprocessor">#include <kmessagebox.h></span> <a name="l00067"></a>00067 <span class="preprocessor">#include <klocale.h></span> <a name="l00068"></a>00068 <span class="preprocessor">#include <kdebug.h></span> <a name="l00069"></a>00069 <span class="preprocessor">#include <kconfig.h></span> <a name="l00070"></a>00070 <span class="preprocessor">#include <kio/global.h></span> <a name="l00071"></a>00071 <span class="preprocessor">#include <kio/scheduler.h></span> <a name="l00072"></a>00072 <span class="preprocessor">#include <qbuffer.h></span> <a name="l00073"></a>00073 <span class="preprocessor">#include <qbuttongroup.h></span> <a name="l00074"></a>00074 <span class="preprocessor">#include <qcombobox.h></span> <a name="l00075"></a>00075 <span class="preprocessor">#include <qfile.h></span> <a name="l00076"></a>00076 <span class="preprocessor">#include <qhbox.h></span> <a name="l00077"></a>00077 <span class="preprocessor">#include <qlabel.h></span> <a name="l00078"></a>00078 <span class="preprocessor">#include <qlayout.h></span> <a name="l00079"></a>00079 <span class="preprocessor">#include <qradiobutton.h></span> <a name="l00080"></a>00080 <span class="preprocessor">#include <qvaluelist.h></span> <a name="l00081"></a>00081 <span class="preprocessor">#include "annotationjobs.h"</span> <a name="l00082"></a>00082 <span class="preprocessor">#include "quotajobs.h"</span> <a name="l00083"></a>00083 <span class="keyword">using namespace </span>KMail; <a name="l00084"></a>00084 <span class="preprocessor">#include <globalsettings.h></span> <a name="l00085"></a>00085 <a name="l00086"></a>00086 <span class="preprocessor">#define UIDCACHE_VERSION 1</span> <a name="l00087"></a>00087 <span class="preprocessor"></span><span class="preprocessor">#define MAIL_LOSS_DEBUGGING 0</span> <a name="l00088"></a>00088 <span class="preprocessor"></span> <a name="l00089"></a>00089 <span class="keyword">static</span> QString incidencesForToString( KMFolderCachedImap::IncidencesFor r ) { <a name="l00090"></a>00090 <span class="keywordflow">switch</span> (r) { <a name="l00091"></a>00091 <span class="keywordflow">case</span> KMFolderCachedImap::IncForNobody: <span class="keywordflow">return</span> <span class="stringliteral">"nobody"</span>; <a name="l00092"></a>00092 <span class="keywordflow">case</span> KMFolderCachedImap::IncForAdmins: <span class="keywordflow">return</span> <span class="stringliteral">"admins"</span>; <a name="l00093"></a>00093 <span class="keywordflow">case</span> KMFolderCachedImap::IncForReaders: <span class="keywordflow">return</span> <span class="stringliteral">"readers"</span>; <a name="l00094"></a>00094 } <a name="l00095"></a>00095 <span class="keywordflow">return</span> QString::null; <span class="comment">// can't happen</span> <a name="l00096"></a>00096 } <a name="l00097"></a>00097 <a name="l00098"></a>00098 <span class="keyword">static</span> KMFolderCachedImap::IncidencesFor incidencesForFromString( <span class="keyword">const</span> QString& str ) { <a name="l00099"></a>00099 <span class="keywordflow">if</span> ( str == <span class="stringliteral">"nobody"</span> ) <span class="keywordflow">return</span> KMFolderCachedImap::IncForNobody; <a name="l00100"></a>00100 <span class="keywordflow">if</span> ( str == <span class="stringliteral">"admins"</span> ) <span class="keywordflow">return</span> KMFolderCachedImap::IncForAdmins; <a name="l00101"></a>00101 <span class="keywordflow">if</span> ( str == <span class="stringliteral">"readers"</span> ) <span class="keywordflow">return</span> KMFolderCachedImap::IncForReaders; <a name="l00102"></a>00102 <span class="keywordflow">return</span> KMFolderCachedImap::IncForAdmins; <span class="comment">// by default</span> <a name="l00103"></a>00103 } <a name="l00104"></a>00104 <a name="l00105"></a>00105 DImapTroubleShootDialog::DImapTroubleShootDialog( QWidget* parent, <a name="l00106"></a>00106 <span class="keyword">const</span> <span class="keywordtype">char</span>* name ) <a name="l00107"></a>00107 : KDialogBase( Plain, i18n( <span class="stringliteral">"Troubleshooting IMAP Cache"</span> ), <a name="l00108"></a>00108 Ok | Cancel, Cancel, parent, name, true ), <a name="l00109"></a>00109 rc( None ) <a name="l00110"></a>00110 { <a name="l00111"></a>00111 QFrame* page = plainPage(); <a name="l00112"></a>00112 QVBoxLayout *topLayout = <span class="keyword">new</span> QVBoxLayout( page, 0 ); <a name="l00113"></a>00113 <span class="comment">// spell "lose" correctly. but don't cause a fuzzy.</span> <a name="l00114"></a>00114 QString txt = i18n( <span class="stringliteral">"<p><b>Troubleshooting the IMAP cache.</b></p>"</span> <a name="l00115"></a>00115 <span class="stringliteral">"<p>If you have problems with synchronizing an IMAP "</span> <a name="l00116"></a>00116 <span class="stringliteral">"folder, you should first try rebuilding the index "</span> <a name="l00117"></a>00117 <span class="stringliteral">"file. This will take some time to rebuild, but will "</span> <a name="l00118"></a>00118 <span class="stringliteral">"not cause any problems.</p><p>If that is not enough, "</span> <a name="l00119"></a>00119 <span class="stringliteral">"you can try refreshing the IMAP cache. If you do this, "</span> <a name="l00120"></a>00120 <span class="stringliteral">"you will loose all your local changes for this folder "</span> <a name="l00121"></a>00121 <span class="stringliteral">"and all its subfolders.</p>"</span>, <a name="l00122"></a>00122 <span class="stringliteral">"<p><b>Troubleshooting the IMAP cache.</b></p>"</span> <a name="l00123"></a>00123 <span class="stringliteral">"<p>If you have problems with synchronizing an IMAP "</span> <a name="l00124"></a>00124 <span class="stringliteral">"folder, you should first try rebuilding the index "</span> <a name="l00125"></a>00125 <span class="stringliteral">"file. This will take some time to rebuild, but will "</span> <a name="l00126"></a>00126 <span class="stringliteral">"not cause any problems.</p><p>If that is not enough, "</span> <a name="l00127"></a>00127 <span class="stringliteral">"you can try refreshing the IMAP cache. If you do this, "</span> <a name="l00128"></a>00128 <span class="stringliteral">"you will lose all your local changes for this folder "</span> <a name="l00129"></a>00129 <span class="stringliteral">"and all its subfolders.</p>"</span> ); <a name="l00130"></a>00130 topLayout->addWidget( <span class="keyword">new</span> QLabel( txt, page ) ); <a name="l00131"></a>00131 <a name="l00132"></a>00132 QButtonGroup *group = <span class="keyword">new</span> QButtonGroup( 0 ); <a name="l00133"></a>00133 <a name="l00134"></a>00134 mIndexButton = <span class="keyword">new</span> QRadioButton( page ); <a name="l00135"></a>00135 mIndexButton->setText( i18n( <span class="stringliteral">"Rebuild &Index"</span> ) ); <a name="l00136"></a>00136 group->insert( mIndexButton ); <a name="l00137"></a>00137 topLayout->addWidget( mIndexButton ); <a name="l00138"></a>00138 <a name="l00139"></a>00139 QHBox *hbox = <span class="keyword">new</span> QHBox( page ); <a name="l00140"></a>00140 QLabel *scopeLabel = <span class="keyword">new</span> QLabel( i18n( <span class="stringliteral">"Scope:"</span> ), hbox ); <a name="l00141"></a>00141 scopeLabel->setEnabled( <span class="keyword">false</span> ); <a name="l00142"></a>00142 mIndexScope = <span class="keyword">new</span> QComboBox( hbox ); <a name="l00143"></a>00143 mIndexScope->insertItem( i18n( <span class="stringliteral">"Only current folder"</span> ) ); <a name="l00144"></a>00144 mIndexScope->insertItem( i18n( <span class="stringliteral">"Current folder and all subfolders"</span> ) ); <a name="l00145"></a>00145 mIndexScope->insertItem( i18n( <span class="stringliteral">"All folders of this account"</span> ) ); <a name="l00146"></a>00146 mIndexScope->setEnabled( <span class="keyword">false</span> ); <a name="l00147"></a>00147 topLayout->addWidget( hbox ); <a name="l00148"></a>00148 <a name="l00149"></a>00149 mCacheButton = <span class="keyword">new</span> QRadioButton( page ); <a name="l00150"></a>00150 mCacheButton->setText( i18n( <span class="stringliteral">"Refresh &Cache"</span> ) ); <a name="l00151"></a>00151 group->insert( mCacheButton ); <a name="l00152"></a>00152 topLayout->addWidget( mCacheButton ); <a name="l00153"></a>00153 <a name="l00154"></a>00154 enableButtonSeparator( <span class="keyword">true</span> ); <a name="l00155"></a>00155 <a name="l00156"></a>00156 connect ( mIndexButton, SIGNAL(toggled(<span class="keywordtype">bool</span>)), mIndexScope, SLOT(setEnabled(<span class="keywordtype">bool</span>)) ); <a name="l00157"></a>00157 connect ( mIndexButton, SIGNAL(toggled(<span class="keywordtype">bool</span>)), scopeLabel, SLOT(setEnabled(<span class="keywordtype">bool</span>)) ); <a name="l00158"></a>00158 <a name="l00159"></a>00159 connect( <span class="keyword">this</span>, SIGNAL( okClicked () ), <span class="keyword">this</span>, SLOT( slotDone() ) ); <a name="l00160"></a>00160 } <a name="l00161"></a>00161 <a name="l00162"></a>00162 <span class="keywordtype">int</span> DImapTroubleShootDialog::run() <a name="l00163"></a>00163 { <a name="l00164"></a>00164 DImapTroubleShootDialog d; <a name="l00165"></a>00165 d.exec(); <a name="l00166"></a>00166 <span class="keywordflow">return</span> d.rc; <a name="l00167"></a>00167 } <a name="l00168"></a>00168 <a name="l00169"></a>00169 <span class="keywordtype">void</span> DImapTroubleShootDialog::slotDone() <a name="l00170"></a>00170 { <a name="l00171"></a>00171 rc = None; <a name="l00172"></a>00172 <span class="keywordflow">if</span> ( mIndexButton->isOn() ) <a name="l00173"></a>00173 rc = mIndexScope->currentItem(); <a name="l00174"></a>00174 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( mCacheButton->isOn() ) <a name="l00175"></a>00175 rc = RefreshCache; <a name="l00176"></a>00176 done( Ok ); <a name="l00177"></a>00177 } <a name="l00178"></a>00178 <a name="l00179"></a>00179 KMFolderCachedImap::KMFolderCachedImap( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* folder, <span class="keyword">const</span> <span class="keywordtype">char</span>* aName ) <a name="l00180"></a>00180 : KMFolderMaildir( folder, aName ), <a name="l00181"></a>00181 mSyncState( SYNC_STATE_INITIAL ), mContentState( imapNoInformation ), <a name="l00182"></a>00182 mSubfolderState( imapNoInformation ), <a name="l00183"></a>00183 mIncidencesFor( IncForAdmins ), <a name="l00184"></a>00184 mIsSelected( false ), <a name="l00185"></a>00185 mCheckFlags( true ), mReadOnly( false ), mAccount( NULL ), uidMapDirty( true ), <a name="l00186"></a>00186 uidWriteTimer( -1 ), mLastUid( 0 ), mTentativeHighestUid( 0 ), <a name="l00187"></a>00187 mFoundAnIMAPDigest( false ), <a name="l00188"></a>00188 mUserRights( 0 ), mOldUserRights( 0 ), mSilentUpload( false ), <a name="l00189"></a>00189 <span class="comment">/*mHoldSyncs( false ),*/</span> <a name="l00190"></a>00190 mFolderRemoved( false ), <a name="l00191"></a>00191 mRecurse( true ), <a name="l00192"></a>00192 mStatusChangedLocally( false ), mAnnotationFolderTypeChanged( false ), <a name="l00193"></a>00193 mIncidencesForChanged( false ), mPersonalNamespacesCheckDone( true ), <a name="l00194"></a>00194 mQuotaInfo(), mAlarmsBlocked( false ), <a name="l00195"></a>00195 mRescueCommandCount( 0 ), <a name="l00196"></a>00196 mPermanentFlags( 31 ) <span class="comment">// assume standard flags by default (see imap4/imapinfo.h for bit fields values)</span> <a name="l00197"></a>00197 { <a name="l00198"></a>00198 setUidValidity(<span class="stringliteral">""</span>); <a name="l00199"></a>00199 <span class="comment">// if we fail to read a uid file but there is one, nuke it</span> <a name="l00200"></a>00200 <span class="keywordflow">if</span> ( readUidCache() == -1 ) { <a name="l00201"></a>00201 <span class="keywordflow">if</span> ( QFile::exists( uidCacheLocation() ) ) { <a name="l00202"></a>00202 KMessageBox::error( 0, <a name="l00203"></a>00203 i18n( <span class="stringliteral">"The UID cache file for folder %1 could not be read. There "</span> <a name="l00204"></a>00204 <span class="stringliteral">"could be a problem with file system permission, or it is corrupted."</span> <a name="l00205"></a>00205 ).arg( folder-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() ) ); <a name="l00206"></a>00206 <span class="comment">// try to unlink it, in case it was corruped. If it couldn't be read</span> <a name="l00207"></a>00207 <span class="comment">// because of permissions, this will fail, which is fine</span> <a name="l00208"></a>00208 unlink( QFile::encodeName( uidCacheLocation() ) ); <a name="l00209"></a>00209 } <a name="l00210"></a>00210 } <a name="l00211"></a>00211 <a name="l00212"></a>00212 mProgress = 0; <a name="l00213"></a>00213 } <a name="l00214"></a>00214 <a name="l00215"></a>00215 KMFolderCachedImap::~KMFolderCachedImap() <a name="l00216"></a>00216 { <a name="l00217"></a>00217 <span class="keywordflow">if</span> (kmkernel->undoStack()) kmkernel->undoStack()->folderDestroyed( folder() ); <a name="l00218"></a>00218 } <a name="l00219"></a>00219 <a name="l00220"></a>00220 <span class="keywordtype">void</span> KMFolderCachedImap::reallyDoClose( <span class="keyword">const</span> <span class="keywordtype">char</span>* owner ) <a name="l00221"></a>00221 { <a name="l00222"></a>00222 <span class="keywordflow">if</span>( !mFolderRemoved ) { <a name="l00223"></a>00223 writeUidCache(); <a name="l00224"></a>00224 } <a name="l00225"></a>00225 KMFolderMaildir::reallyDoClose( owner ); <a name="l00226"></a>00226 } <a name="l00227"></a>00227 <a name="l00228"></a>00228 <span class="keywordtype">void</span> KMFolderCachedImap::initializeFrom( KMFolderCachedImap* parent ) <a name="l00229"></a>00229 { <a name="l00230"></a>00230 setAccount( parent->account() ); <a name="l00231"></a>00231 <span class="comment">// Now that we have an account, tell it that this folder was created:</span> <a name="l00232"></a>00232 <span class="comment">// if this folder was just removed, then we don't really want to remove it from the server.</span> <a name="l00233"></a>00233 mAccount->removeDeletedFolder( imapPath() ); <a name="l00234"></a>00234 setUserRights( parent->userRights() ); <a name="l00235"></a>00235 } <a name="l00236"></a>00236 <a name="l00237"></a>00237 <span class="keywordtype">void</span> KMFolderCachedImap::readConfig() <a name="l00238"></a>00238 { <a name="l00239"></a>00239 KConfig* config = KMKernel::config(); <a name="l00240"></a>00240 KConfigGroupSaver saver( config, <span class="stringliteral">"Folder-"</span> + folder()->idString() ); <a name="l00241"></a>00241 <span class="keywordflow">if</span>( mImapPath.isEmpty() ) mImapPath = config->readEntry( <span class="stringliteral">"ImapPath"</span> ); <a name="l00242"></a>00242 <span class="keywordflow">if</span>( QString( name() ).upper() == <span class="stringliteral">"INBOX"</span> && mImapPath == <span class="stringliteral">"/INBOX/"</span> ) <a name="l00243"></a>00243 { <a name="l00244"></a>00244 folder()-><a class="code" href="classKMFolder.html#3d031323b05f717cb26e441299a5c20f">setLabel</a>( i18n( <span class="stringliteral">"inbox"</span> ) ); <a name="l00245"></a>00245 <span class="comment">// for the icon</span> <a name="l00246"></a>00246 folder()-><a class="code" href="classKMFolder.html#39dc68ff3092dc5ace99dc67da7074e3">setSystemFolder</a>( <span class="keyword">true</span> ); <a name="l00247"></a>00247 } <a name="l00248"></a>00248 mNoContent = config->readBoolEntry( <span class="stringliteral">"NoContent"</span>, <span class="keyword">false</span> ); <a name="l00249"></a>00249 mReadOnly = config->readBoolEntry( <span class="stringliteral">"ReadOnly"</span>, <span class="keyword">false</span> ); <a name="l00250"></a>00250 <span class="keywordflow">if</span> ( !config->readEntry( <span class="stringliteral">"FolderAttributes"</span> ).isEmpty() ) <a name="l00251"></a>00251 mFolderAttributes = config->readEntry( <span class="stringliteral">"FolderAttributes"</span> ); <a name="l00252"></a>00252 <a name="l00253"></a>00253 <span class="keywordflow">if</span> ( mAnnotationFolderType != <span class="stringliteral">"FROMSERVER"</span> ) { <a name="l00254"></a>00254 mAnnotationFolderType = config->readEntry( <span class="stringliteral">"Annotation-FolderType"</span> ); <a name="l00255"></a>00255 <span class="comment">// if there is an annotation, it has to be XML</span> <a name="l00256"></a>00256 <span class="keywordflow">if</span> ( !mAnnotationFolderType.isEmpty() && !mAnnotationFolderType.startsWith( <span class="stringliteral">"mail"</span> ) ) <a name="l00257"></a>00257 kmkernel->iCalIface().setStorageFormat( folder(), KMailICalIfaceImpl::StorageXML ); <a name="l00258"></a>00258 <span class="comment">// kdDebug(5006) << ( mImapPath.isEmpty() ? label() : mImapPath )</span> <a name="l00259"></a>00259 <span class="comment">// << " readConfig: mAnnotationFolderType=" << mAnnotationFolderType << endl;</span> <a name="l00260"></a>00260 } <a name="l00261"></a>00261 mIncidencesFor = incidencesForFromString( config->readEntry( <span class="stringliteral">"IncidencesFor"</span> ) ); <a name="l00262"></a>00262 mAlarmsBlocked = config->readBoolEntry( <span class="stringliteral">"AlarmsBlocked"</span>, <span class="keyword">false</span> ); <a name="l00263"></a>00263 <span class="comment">// kdDebug(5006) << ( mImapPath.isEmpty() ? label() : mImapPath )</span> <a name="l00264"></a>00264 <span class="comment">// << " readConfig: mIncidencesFor=" << mIncidencesFor << endl;</span> <a name="l00265"></a>00265 <a name="l00266"></a>00266 mUserRights = config->readNumEntry( <span class="stringliteral">"UserRights"</span>, 0 ); <span class="comment">// default is we don't know</span> <a name="l00267"></a>00267 mOldUserRights = mUserRights; <a name="l00268"></a>00268 <a name="l00269"></a>00269 <span class="keywordtype">int</span> storageQuotaUsage = config->readNumEntry( <span class="stringliteral">"StorageQuotaUsage"</span>, -1 ); <a name="l00270"></a>00270 <span class="keywordtype">int</span> storageQuotaLimit = config->readNumEntry( <span class="stringliteral">"StorageQuotaLimit"</span>, -1 ); <a name="l00271"></a>00271 QString storageQuotaRoot = config->readEntry( <span class="stringliteral">"StorageQuotaRoot"</span>, QString::null ); <a name="l00272"></a>00272 <span class="keywordflow">if</span> ( !storageQuotaRoot.isNull() ) { <span class="comment">// isEmpty() means we know there is no quota set</span> <a name="l00273"></a>00273 mQuotaInfo.setName( <span class="stringliteral">"STORAGE"</span> ); <a name="l00274"></a>00274 mQuotaInfo.setRoot( storageQuotaRoot ); <a name="l00275"></a>00275 <a name="l00276"></a>00276 <span class="keywordflow">if</span> ( storageQuotaUsage > -1 ) <a name="l00277"></a>00277 mQuotaInfo.setCurrent( storageQuotaUsage ); <a name="l00278"></a>00278 <span class="keywordflow">if</span> ( storageQuotaLimit > -1 ) <a name="l00279"></a>00279 mQuotaInfo.setMax( storageQuotaLimit ); <a name="l00280"></a>00280 } <a name="l00281"></a>00281 <a name="l00282"></a>00282 <a class="code" href="classFolderStorage.html#540a7693b0e4842f8a2a25f1b6f55683" title="Read the config file.">KMFolderMaildir::readConfig</a>(); <a name="l00283"></a>00283 <a name="l00284"></a>00284 mStatusChangedLocally = <a name="l00285"></a>00285 config->readBoolEntry( <span class="stringliteral">"StatusChangedLocally"</span>, <span class="keyword">false</span> ); <a name="l00286"></a>00286 <a name="l00287"></a>00287 mAnnotationFolderTypeChanged = config->readBoolEntry( <span class="stringliteral">"AnnotationFolderTypeChanged"</span>, <span class="keyword">false</span> ); <a name="l00288"></a>00288 mIncidencesForChanged = config->readBoolEntry( <span class="stringliteral">"IncidencesForChanged"</span>, <span class="keyword">false</span> ); <a name="l00289"></a>00289 <span class="keywordflow">if</span> ( mImapPath.isEmpty() ) { <a name="l00290"></a>00290 mImapPathCreation = config->readEntry(<span class="stringliteral">"ImapPathCreation"</span>); <a name="l00291"></a>00291 } <a name="l00292"></a>00292 <a name="l00293"></a>00293 QStringList uids = config->readListEntry( <span class="stringliteral">"UIDSDeletedSinceLastSync"</span> ); <a name="l00294"></a>00294 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00295"></a>00295 <span class="preprocessor"></span> kdDebug( 5006 ) << <span class="stringliteral">"READING IN UIDSDeletedSinceLastSync: "</span> << folder()-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() << endl << uids << endl; <a name="l00296"></a>00296 <span class="preprocessor">#endif</span> <a name="l00297"></a>00297 <span class="preprocessor"></span> <span class="keywordflow">for</span> ( QStringList::iterator it = uids.begin(); it != uids.end(); it++ ) { <a name="l00298"></a>00298 mDeletedUIDsSinceLastSync.insert( (*it).toULong(), 0); <a name="l00299"></a>00299 } <a name="l00300"></a>00300 } <a name="l00301"></a>00301 <a name="l00302"></a>00302 <span class="keywordtype">void</span> KMFolderCachedImap::writeConfig() <a name="l00303"></a>00303 { <a name="l00304"></a>00304 KConfigGroup configGroup( KMKernel::config(), <span class="stringliteral">"Folder-"</span> + folder()->idString() ); <a name="l00305"></a>00305 configGroup.writeEntry( <span class="stringliteral">"ImapPath"</span>, mImapPath ); <a name="l00306"></a>00306 configGroup.writeEntry( <span class="stringliteral">"NoContent"</span>, mNoContent ); <a name="l00307"></a>00307 configGroup.writeEntry( <span class="stringliteral">"ReadOnly"</span>, mReadOnly ); <a name="l00308"></a>00308 configGroup.writeEntry( <span class="stringliteral">"FolderAttributes"</span>, mFolderAttributes ); <a name="l00309"></a>00309 configGroup.writeEntry( <span class="stringliteral">"StatusChangedLocally"</span>, mStatusChangedLocally ); <a name="l00310"></a>00310 <span class="keywordflow">if</span> ( !mImapPathCreation.isEmpty() ) { <a name="l00311"></a>00311 <span class="keywordflow">if</span> ( mImapPath.isEmpty() ) { <a name="l00312"></a>00312 configGroup.writeEntry( <span class="stringliteral">"ImapPathCreation"</span>, mImapPathCreation ); <a name="l00313"></a>00313 } <span class="keywordflow">else</span> { <a name="l00314"></a>00314 configGroup.deleteEntry( <span class="stringliteral">"ImapPathCreation"</span> ); <a name="l00315"></a>00315 } <a name="l00316"></a>00316 } <a name="l00317"></a>00317 <span class="keywordflow">if</span> ( !mDeletedUIDsSinceLastSync.isEmpty() ) { <a name="l00318"></a>00318 QValueList<ulong> uids = mDeletedUIDsSinceLastSync.keys(); <a name="l00319"></a>00319 QStringList uidstrings; <a name="l00320"></a>00320 <span class="keywordflow">for</span>( QValueList<ulong>::iterator it = uids.begin(); it != uids.end(); it++ ) { <a name="l00321"></a>00321 uidstrings.append( QString::number( (*it) ) ); <a name="l00322"></a>00322 } <a name="l00323"></a>00323 configGroup.writeEntry( <span class="stringliteral">"UIDSDeletedSinceLastSync"</span>, uidstrings ); <a name="l00324"></a>00324 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00325"></a>00325 <span class="preprocessor"></span> kdDebug( 5006 ) << <span class="stringliteral">"WRITING OUT UIDSDeletedSinceLastSync in: "</span> << folder( )-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>( ) << endl << uidstrings << endl; <a name="l00326"></a>00326 <span class="preprocessor">#endif</span> <a name="l00327"></a>00327 <span class="preprocessor"></span> } <span class="keywordflow">else</span> { <a name="l00328"></a>00328 configGroup.deleteEntry( <span class="stringliteral">"UIDSDeletedSinceLastSync"</span> ); <a name="l00329"></a>00329 } <a name="l00330"></a>00330 writeConfigKeysWhichShouldNotGetOverwrittenByReadConfig(); <a name="l00331"></a>00331 <a class="code" href="classFolderStorage.html#b9819495eefb7713348092932abce37a" title="Write the config file.">KMFolderMaildir::writeConfig</a>(); <a name="l00332"></a>00332 } <a name="l00333"></a>00333 <a name="l00334"></a>00334 <span class="keywordtype">void</span> KMFolderCachedImap::writeConfigKeysWhichShouldNotGetOverwrittenByReadConfig() <a name="l00335"></a>00335 { <a name="l00336"></a>00336 KConfigGroup configGroup( KMKernel::config(), <span class="stringliteral">"Folder-"</span> + folder()->idString() ); <a name="l00337"></a>00337 <span class="keywordflow">if</span> ( !folder()->noContent() ) <a name="l00338"></a>00338 { <a name="l00339"></a>00339 configGroup.writeEntry( <span class="stringliteral">"AnnotationFolderTypeChanged"</span>, mAnnotationFolderTypeChanged ); <a name="l00340"></a>00340 configGroup.writeEntry( <span class="stringliteral">"Annotation-FolderType"</span>, mAnnotationFolderType ); <a name="l00341"></a>00341 configGroup.writeEntry( <span class="stringliteral">"IncidencesForChanged"</span>, mIncidencesForChanged ); <a name="l00342"></a>00342 configGroup.writeEntry( <span class="stringliteral">"IncidencesFor"</span>, incidencesForToString( mIncidencesFor ) ); <a name="l00343"></a>00343 configGroup.writeEntry( <span class="stringliteral">"AlarmsBlocked"</span>, mAlarmsBlocked ); <a name="l00344"></a>00344 configGroup.writeEntry( <span class="stringliteral">"UserRights"</span>, mUserRights ); <a name="l00345"></a>00345 <a name="l00346"></a>00346 configGroup.deleteEntry( <span class="stringliteral">"StorageQuotaUsage"</span>); <a name="l00347"></a>00347 configGroup.deleteEntry( <span class="stringliteral">"StorageQuotaRoot"</span>); <a name="l00348"></a>00348 configGroup.deleteEntry( <span class="stringliteral">"StorageQuotaLimit"</span>); <a name="l00349"></a>00349 <a name="l00350"></a>00350 <span class="keywordflow">if</span> ( mQuotaInfo.isValid() ) { <a name="l00351"></a>00351 <span class="keywordflow">if</span> ( mQuotaInfo.current().isValid() ) { <a name="l00352"></a>00352 configGroup.writeEntry( <span class="stringliteral">"StorageQuotaUsage"</span>, mQuotaInfo.current().toInt() ); <a name="l00353"></a>00353 } <a name="l00354"></a>00354 <span class="keywordflow">if</span> ( mQuotaInfo.max().isValid() ) { <a name="l00355"></a>00355 configGroup.writeEntry( <span class="stringliteral">"StorageQuotaLimit"</span>, mQuotaInfo.max().toInt() ); <a name="l00356"></a>00356 } <a name="l00357"></a>00357 configGroup.writeEntry( <span class="stringliteral">"StorageQuotaRoot"</span>, mQuotaInfo.root() ); <a name="l00358"></a>00358 } <a name="l00359"></a>00359 } <a name="l00360"></a>00360 } <a name="l00361"></a>00361 <a name="l00362"></a>00362 <span class="keywordtype">int</span> KMFolderCachedImap::create() <a name="l00363"></a>00363 { <a name="l00364"></a>00364 <span class="keywordtype">int</span> rc = KMFolderMaildir::create(); <a name="l00365"></a>00365 <span class="comment">// FIXME why the below? - till</span> <a name="l00366"></a>00366 readConfig(); <a name="l00367"></a>00367 mUnreadMsgs = -1; <a name="l00368"></a>00368 <span class="keywordflow">return</span> rc; <a name="l00369"></a>00369 } <a name="l00370"></a>00370 <a name="l00371"></a>00371 <span class="keywordtype">void</span> KMFolderCachedImap::remove() <a name="l00372"></a>00372 { <a name="l00373"></a>00373 mFolderRemoved = <span class="keyword">true</span>; <a name="l00374"></a>00374 <a name="l00375"></a>00375 QString part1 = folder()->path() + <span class="stringliteral">"/."</span> + dotEscape(name()); <a name="l00376"></a>00376 QString uidCacheFile = part1 + <span class="stringliteral">".uidcache"</span>; <a name="l00377"></a>00377 <span class="comment">// This is the account folder of an account that was just removed</span> <a name="l00378"></a>00378 <span class="comment">// When this happens, be sure to delete all traces of the cache</span> <a name="l00379"></a>00379 <span class="keywordflow">if</span>( QFile::exists(uidCacheFile) ) <a name="l00380"></a>00380 unlink( QFile::encodeName( uidCacheFile ) ); <a name="l00381"></a>00381 <a name="l00382"></a>00382 <a class="code" href="classFolderStorage.html#af966531c48363be4d9181b7c914a1e1" title="Removes the folder physically from disk and empties the contents of the folder in...">FolderStorage::remove</a>(); <a name="l00383"></a>00383 } <a name="l00384"></a>00384 <a name="l00385"></a>00385 QString KMFolderCachedImap::uidCacheLocation()<span class="keyword"> const</span> <a name="l00386"></a>00386 <span class="keyword"></span>{ <a name="l00387"></a>00387 QString sLocation(folder()->path()); <a name="l00388"></a>00388 <span class="keywordflow">if</span> (!sLocation.isEmpty()) sLocation += <span class="charliteral">'/'</span>; <a name="l00389"></a>00389 <span class="keywordflow">return</span> sLocation + <span class="charliteral">'.'</span> + dotEscape(fileName()) + <span class="stringliteral">".uidcache"</span>; <a name="l00390"></a>00390 } <a name="l00391"></a>00391 <a name="l00392"></a>00392 <span class="keywordtype">int</span> KMFolderCachedImap::readUidCache() <a name="l00393"></a>00393 { <a name="l00394"></a>00394 QFile uidcache( uidCacheLocation() ); <a name="l00395"></a>00395 <span class="keywordflow">if</span>( uidcache.open( IO_ReadOnly ) ) { <a name="l00396"></a>00396 <span class="keywordtype">char</span> buf[1024]; <a name="l00397"></a>00397 <span class="keywordtype">int</span> len = uidcache.readLine( buf, <span class="keyword">sizeof</span>(buf) ); <a name="l00398"></a>00398 <span class="keywordflow">if</span>( len > 0 ) { <a name="l00399"></a>00399 <span class="keywordtype">int</span> cacheVersion; <a name="l00400"></a>00400 sscanf( buf, <span class="stringliteral">"# KMail-UidCache V%d\n"</span>, &cacheVersion ); <a name="l00401"></a>00401 <span class="keywordflow">if</span>( cacheVersion == UIDCACHE_VERSION ) { <a name="l00402"></a>00402 len = uidcache.readLine( buf, <span class="keyword">sizeof</span>(buf) ); <a name="l00403"></a>00403 <span class="keywordflow">if</span>( len > 0 ) { <a name="l00404"></a>00404 setUidValidity( QString::fromLocal8Bit(buf).stripWhiteSpace() ); <a name="l00405"></a>00405 len = uidcache.readLine( buf, <span class="keyword">sizeof</span>(buf) ); <a name="l00406"></a>00406 <span class="keywordflow">if</span>( len > 0 ) { <a name="l00407"></a>00407 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00408"></a>00408 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Reading in last uid from cache: "</span> << QString::fromLocal8Bit(buf).stripWhiteSpace() << <span class="stringliteral">" in "</span> << folder()-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() << endl; <a name="l00409"></a>00409 <span class="preprocessor">#endif</span> <a name="l00410"></a>00410 <span class="preprocessor"></span> <span class="comment">// load the last known highest uid from the on disk cache</span> <a name="l00411"></a>00411 setLastUid( QString::fromLocal8Bit(buf).stripWhiteSpace().toULong() ); <a name="l00412"></a>00412 <span class="keywordflow">return</span> 0; <a name="l00413"></a>00413 } <a name="l00414"></a>00414 } <a name="l00415"></a>00415 } <a name="l00416"></a>00416 } <a name="l00417"></a>00417 } <a name="l00418"></a>00418 <span class="keywordflow">return</span> -1; <a name="l00419"></a>00419 } <a name="l00420"></a>00420 <a name="l00421"></a>00421 <span class="keywordtype">int</span> KMFolderCachedImap::writeUidCache() <a name="l00422"></a>00422 { <a name="l00423"></a>00423 <span class="keywordflow">if</span>( uidValidity().isEmpty() || uidValidity() == <span class="stringliteral">"INVALID"</span> ) { <a name="l00424"></a>00424 <span class="comment">// No info from the server yet, remove the file.</span> <a name="l00425"></a>00425 <span class="keywordflow">if</span>( QFile::exists( uidCacheLocation() ) ) <a name="l00426"></a>00426 <span class="keywordflow">return</span> unlink( QFile::encodeName( uidCacheLocation() ) ); <a name="l00427"></a>00427 <span class="keywordflow">return</span> 0; <a name="l00428"></a>00428 } <a name="l00429"></a>00429 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00430"></a>00430 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Writing out UID cache lastuid: "</span> << lastUid() << <span class="stringliteral">" in: "</span> << folder()-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() << endl; <a name="l00431"></a>00431 <span class="preprocessor">#endif</span> <a name="l00432"></a>00432 <span class="preprocessor"></span> QFile uidcache( uidCacheLocation() ); <a name="l00433"></a>00433 <span class="keywordflow">if</span>( uidcache.open( IO_WriteOnly ) ) { <a name="l00434"></a>00434 QTextStream str( &uidcache ); <a name="l00435"></a>00435 str << <span class="stringliteral">"# KMail-UidCache V"</span> << UIDCACHE_VERSION << endl; <a name="l00436"></a>00436 str << uidValidity() << endl; <a name="l00437"></a>00437 str << lastUid() << endl; <a name="l00438"></a>00438 uidcache.flush(); <a name="l00439"></a>00439 <span class="keywordflow">if</span> ( uidcache.status() == IO_Ok ) { <a name="l00440"></a>00440 fsync( uidcache.handle() ); <span class="comment">/* this is probably overkill */</span> <a name="l00441"></a>00441 uidcache.close(); <a name="l00442"></a>00442 <span class="keywordflow">if</span> ( uidcache.status() == IO_Ok ) <a name="l00443"></a>00443 <span class="keywordflow">return</span> 0; <a name="l00444"></a>00444 } <a name="l00445"></a>00445 } <a name="l00446"></a>00446 KMessageBox::error( 0, <a name="l00447"></a>00447 i18n( <span class="stringliteral">"The UID cache file for folder %1 could not be written. There "</span> <a name="l00448"></a>00448 <span class="stringliteral">"could be a problem with file system permission."</span> ).arg( folder()->prettyURL() ) ); <a name="l00449"></a>00449 <a name="l00450"></a>00450 <span class="keywordflow">return</span> -1; <a name="l00451"></a>00451 } <a name="l00452"></a>00452 <a name="l00453"></a>00453 <span class="keywordtype">void</span> KMFolderCachedImap::reloadUidMap() <a name="l00454"></a>00454 { <a name="l00455"></a>00455 <span class="comment">//kdDebug(5006) << "Reloading Uid Map " << endl;</span> <a name="l00456"></a>00456 uidMap.clear(); <a name="l00457"></a>00457 open(<span class="stringliteral">"reloadUdi"</span>); <a name="l00458"></a>00458 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < count(); ++i ) { <a name="l00459"></a>00459 KMMsgBase *msg = getMsgBase( i ); <a name="l00460"></a>00460 <span class="keywordflow">if</span>( !msg ) <span class="keywordflow">continue</span>; <a name="l00461"></a>00461 ulong uid = msg->UID(); <a name="l00462"></a>00462 <span class="comment">//kdDebug(5006) << "Inserting: " << i << " with uid: " << uid << endl;</span> <a name="l00463"></a>00463 uidMap.insert( uid, i ); <a name="l00464"></a>00464 } <a name="l00465"></a>00465 close(<span class="stringliteral">"reloadUdi"</span>); <a name="l00466"></a>00466 uidMapDirty = <span class="keyword">false</span>; <a name="l00467"></a>00467 } <a name="l00468"></a>00468 <a name="l00469"></a>00469 <span class="comment">/* Reimplemented from KMFolderMaildir */</span> <a name="l00470"></a>00470 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* KMFolderCachedImap::take(<span class="keywordtype">int</span> idx) <a name="l00471"></a>00471 { <a name="l00472"></a>00472 uidMapDirty = <span class="keyword">true</span>; <a name="l00473"></a>00473 rememberDeletion( idx ); <a name="l00474"></a>00474 <span class="keywordflow">return</span> KMFolderMaildir::take(idx); <a name="l00475"></a>00475 } <a name="l00476"></a>00476 <a name="l00477"></a>00477 <span class="comment">// Add a message without clearing it's X-UID field.</span> <a name="l00478"></a>00478 <span class="keywordtype">int</span> KMFolderCachedImap::addMsgInternal( <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* msg, <span class="keywordtype">bool</span> newMail, <a name="l00479"></a>00479 <span class="keywordtype">int</span>* index_return ) <a name="l00480"></a>00480 { <a name="l00481"></a>00481 <span class="comment">// Possible optimization: Only dirty if not filtered below</span> <a name="l00482"></a>00482 ulong uid = msg-><a class="code" href="classKMMessage.html#faaaea3bf64efcdbeceafbe146e1addf" title="Get/set UID.">UID</a>(); <a name="l00483"></a>00483 <span class="keywordflow">if</span>( uid != 0 ) { <a name="l00484"></a>00484 uidMapDirty = <span class="keyword">true</span>; <a name="l00485"></a>00485 } <a name="l00486"></a>00486 <a name="l00487"></a>00487 <span class="comment">// Add the message</span> <a name="l00488"></a>00488 <span class="keywordtype">int</span> rc = <a class="code" href="classFolderStorage.html#6d6e2d6fa19a67d119bac1e9e1c3dc97" title="Adds the given messages to the folder.">KMFolderMaildir::addMsg</a>(msg, index_return); <a name="l00489"></a>00489 <a name="l00490"></a>00490 <span class="keywordflow">if</span>( newMail && ( imapPath() == <span class="stringliteral">"/INBOX/"</span> || ( !GlobalSettings::self()->filterOnlyDIMAPInbox() <a name="l00491"></a>00491 && (userRights() <= 0 || userRights() & ACLJobs::Administer ) <a name="l00492"></a>00492 && (contentsType() == ContentsTypeMail || GlobalSettings::self()->filterGroupwareFolders()) ) ) ) <a name="l00493"></a>00493 <span class="comment">// This is a new message. Filter it</span> <a name="l00494"></a>00494 mAccount->processNewMsg( msg ); <a name="l00495"></a>00495 <a name="l00496"></a>00496 <span class="keywordflow">return</span> rc; <a name="l00497"></a>00497 } <a name="l00498"></a>00498 <a name="l00499"></a>00499 <span class="comment">/* Reimplemented from KMFolderMaildir */</span> <a name="l00500"></a>00500 <span class="keywordtype">int</span> <a class="code" href="classFolderStorage.html#6d6e2d6fa19a67d119bac1e9e1c3dc97" title="Adds the given messages to the folder.">KMFolderCachedImap::addMsg</a>(<a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* msg, <span class="keywordtype">int</span>* index_return) <a name="l00501"></a>00501 { <a name="l00502"></a>00502 <span class="keywordflow">if</span> ( !canAddMsgNow( msg, index_return ) ) <span class="keywordflow">return</span> 0; <a name="l00503"></a>00503 <span class="comment">// Add it to storage</span> <a name="l00504"></a>00504 <span class="keywordtype">int</span> rc = KMFolderMaildir::addMsgInternal(msg, index_return, <span class="keyword">true</span> <span class="comment">/*stripUID*/</span>); <a name="l00505"></a>00505 <span class="keywordflow">return</span> rc; <a name="l00506"></a>00506 } <a name="l00507"></a>00507 <a name="l00508"></a>00508 <span class="keywordtype">void</span> KMFolderCachedImap::rememberDeletion( <span class="keywordtype">int</span> idx ) <a name="l00509"></a>00509 { <a name="l00510"></a>00510 KMMsgBase *msg = getMsgBase( idx ); <a name="l00511"></a>00511 assert(msg); <a name="l00512"></a>00512 <span class="keywordtype">long</span> uid = msg->UID(); <a name="l00513"></a>00513 assert(uid>=0); <a name="l00514"></a>00514 mDeletedUIDsSinceLastSync.insert(uid, 0); <a name="l00515"></a>00515 kdDebug(5006) << <span class="stringliteral">"Explicit delete of UID "</span> << uid << <span class="stringliteral">" at index: "</span> << idx << <span class="stringliteral">" in "</span> << folder()-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() << endl; <a name="l00516"></a>00516 } <a name="l00517"></a>00517 <a name="l00518"></a>00518 <span class="comment">/* Reimplemented from KMFolderMaildir */</span> <a name="l00519"></a>00519 <span class="keywordtype">void</span> KMFolderCachedImap::removeMsg(<span class="keywordtype">int</span> idx, <span class="keywordtype">bool</span> imapQuiet) <a name="l00520"></a>00520 { <a name="l00521"></a>00521 uidMapDirty = <span class="keyword">true</span>; <a name="l00522"></a>00522 rememberDeletion( idx ); <a name="l00523"></a>00523 <span class="comment">// Remove it from disk</span> <a name="l00524"></a>00524 KMFolderMaildir::removeMsg(idx,imapQuiet); <a name="l00525"></a>00525 } <a name="l00526"></a>00526 <a name="l00527"></a>00527 <span class="keywordtype">bool</span> KMFolderCachedImap::canRemoveFolder()<span class="keyword"> const </span>{ <a name="l00528"></a>00528 <span class="comment">// If this has subfolders it can't be removed</span> <a name="l00529"></a>00529 <span class="keywordflow">if</span>( folder() && folder()->child() && folder()->child()->count() > 0 ) <a name="l00530"></a>00530 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l00531"></a>00531 <a name="l00532"></a>00532 <span class="preprocessor">#if 0</span> <a name="l00533"></a>00533 <span class="preprocessor"></span> <span class="comment">// No special condition here, so let base class decide</span> <a name="l00534"></a>00534 <span class="keywordflow">return</span> KMFolderMaildir::canRemoveFolder(); <a name="l00535"></a>00535 <span class="preprocessor">#endif</span> <a name="l00536"></a>00536 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00537"></a>00537 } <a name="l00538"></a>00538 <a name="l00539"></a>00539 <span class="comment">/* Reimplemented from KMFolderDir */</span> <a name="l00540"></a>00540 <span class="keywordtype">int</span> KMFolderCachedImap::rename( <span class="keyword">const</span> QString& aName, <a name="l00541"></a>00541 <a class="code" href="classKMFolderDir.html" title="KMail list that manages the contents of one directory that may contain folders and/or...">KMFolderDir</a>* <span class="comment">/*aParent*/</span> ) <a name="l00542"></a>00542 { <a name="l00543"></a>00543 QString oldName = mAccount->renamedFolder( imapPath() ); <a name="l00544"></a>00544 <span class="keywordflow">if</span> ( oldName.isEmpty() ) oldName = name(); <a name="l00545"></a>00545 <span class="keywordflow">if</span> ( aName == oldName ) <a name="l00546"></a>00546 <span class="comment">// Stupid user trying to rename it to it's old name :)</span> <a name="l00547"></a>00547 <span class="keywordflow">return</span> 0; <a name="l00548"></a>00548 <a name="l00549"></a>00549 <span class="keywordflow">if</span>( account() == 0 || imapPath().isEmpty() ) { <span class="comment">// I don't think any of this can happen anymore</span> <a name="l00550"></a>00550 QString err = i18n(<span class="stringliteral">"You must synchronize with the server before renaming IMAP folders."</span>); <a name="l00551"></a>00551 KMessageBox::error( 0, err ); <a name="l00552"></a>00552 <span class="keywordflow">return</span> -1; <a name="l00553"></a>00553 } <a name="l00554"></a>00554 <a name="l00555"></a>00555 <span class="comment">// Make the change appear to the user with setLabel, but we'll do the change</span> <a name="l00556"></a>00556 <span class="comment">// on the server during the next sync. The name() is the name at the time of</span> <a name="l00557"></a>00557 <span class="comment">// the last sync. Only rename if the new one is different. If it's the same,</span> <a name="l00558"></a>00558 <span class="comment">// don't rename, but also make sure the rename is reset, in the case of</span> <a name="l00559"></a>00559 <span class="comment">// A -> B -> A renames.</span> <a name="l00560"></a>00560 <span class="keywordflow">if</span> ( name() != aName ) <a name="l00561"></a>00561 mAccount->addRenamedFolder( imapPath(), folder()->label(), aName ); <a name="l00562"></a>00562 <span class="keywordflow">else</span> <a name="l00563"></a>00563 mAccount->removeRenamedFolder( imapPath() ); <a name="l00564"></a>00564 <a name="l00565"></a>00565 folder()-><a class="code" href="classKMFolder.html#3d031323b05f717cb26e441299a5c20f">setLabel</a>( aName ); <a name="l00566"></a>00566 emit nameChanged(); <span class="comment">// for kmailicalifaceimpl</span> <a name="l00567"></a>00567 <a name="l00568"></a>00568 <span class="keywordflow">return</span> 0; <a name="l00569"></a>00569 } <a name="l00570"></a>00570 <a name="l00571"></a>00571 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* KMFolderCachedImap::trashFolder()<span class="keyword"> const</span> <a name="l00572"></a>00572 <span class="keyword"></span>{ <a name="l00573"></a>00573 QString trashStr = account()->trash(); <a name="l00574"></a>00574 <span class="keywordflow">return</span> kmkernel->dimapFolderMgr()->findIdString( trashStr ); <a name="l00575"></a>00575 } <a name="l00576"></a>00576 <a name="l00577"></a>00577 <span class="keywordtype">void</span> KMFolderCachedImap::setLastUid( ulong uid ) <a name="l00578"></a>00578 { <a name="l00579"></a>00579 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00580"></a>00580 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Setting mLastUid to: "</span> << uid << <span class="stringliteral">" in "</span> << folder()-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() << endl; <a name="l00581"></a>00581 <span class="preprocessor">#endif</span> <a name="l00582"></a>00582 <span class="preprocessor"></span> mLastUid = uid; <a name="l00583"></a>00583 <span class="keywordflow">if</span>( uidWriteTimer == -1 ) <a name="l00584"></a>00584 <span class="comment">// Write in one minute</span> <a name="l00585"></a>00585 uidWriteTimer = startTimer( 60000 ); <a name="l00586"></a>00586 } <a name="l00587"></a>00587 <a name="l00588"></a>00588 <span class="keywordtype">void</span> KMFolderCachedImap::timerEvent( QTimerEvent* ) <a name="l00589"></a>00589 { <a name="l00590"></a>00590 killTimer( uidWriteTimer ); <a name="l00591"></a>00591 uidWriteTimer = -1; <a name="l00592"></a>00592 <span class="keywordflow">if</span> ( writeUidCache() == -1 ) <a name="l00593"></a>00593 unlink( QFile::encodeName( uidCacheLocation() ) ); <a name="l00594"></a>00594 } <a name="l00595"></a>00595 <a name="l00596"></a>00596 ulong KMFolderCachedImap::lastUid() <a name="l00597"></a>00597 { <a name="l00598"></a>00598 <span class="keywordflow">return</span> mLastUid; <a name="l00599"></a>00599 } <a name="l00600"></a>00600 <a name="l00601"></a>00601 KMMsgBase* KMFolderCachedImap::findByUID( ulong uid ) <a name="l00602"></a>00602 { <a name="l00603"></a>00603 <span class="keywordtype">bool</span> mapReloaded = <span class="keyword">false</span>; <a name="l00604"></a>00604 <span class="keywordflow">if</span>( uidMapDirty ) { <a name="l00605"></a>00605 reloadUidMap(); <a name="l00606"></a>00606 mapReloaded = <span class="keyword">true</span>; <a name="l00607"></a>00607 } <a name="l00608"></a>00608 <a name="l00609"></a>00609 QMap<ulong,int>::Iterator it = uidMap.find( uid ); <a name="l00610"></a>00610 <span class="keywordflow">if</span>( it != uidMap.end() ) { <a name="l00611"></a>00611 KMMsgBase *msg = getMsgBase( *it ); <a name="l00612"></a>00612 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00613"></a>00613 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Folder: "</span> << folder()-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() << endl; <a name="l00614"></a>00614 kdDebug(5006) << <span class="stringliteral">"UID "</span> << uid << <span class="stringliteral">" is supposed to be in the map"</span> << endl; <a name="l00615"></a>00615 kdDebug(5006) << <span class="stringliteral">"UID's index is to be "</span> << *it << endl; <a name="l00616"></a>00616 kdDebug(5006) << <span class="stringliteral">"There is a message there? "</span> << (msg != 0) << endl; <a name="l00617"></a>00617 <span class="keywordflow">if</span> ( msg ) { <a name="l00618"></a>00618 kdDebug(5006) << <span class="stringliteral">"Its UID is: "</span> << msg->UID() << endl; <a name="l00619"></a>00619 } <a name="l00620"></a>00620 <span class="preprocessor">#endif</span> <a name="l00621"></a>00621 <span class="preprocessor"></span> <a name="l00622"></a>00622 <span class="keywordflow">if</span>( msg && msg->UID() == uid ) <a name="l00623"></a>00623 <span class="keywordflow">return</span> msg; <a name="l00624"></a>00624 kdDebug(5006) << <span class="stringliteral">"########## Didn't find uid: "</span> << uid << <span class="stringliteral">"in cache athough it's supposed to be there!"</span> << endl; <a name="l00625"></a>00625 } <span class="keywordflow">else</span> { <a name="l00626"></a>00626 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00627"></a>00627 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Didn't find uid: "</span> << uid << <span class="stringliteral">"in cache!"</span> << endl; <a name="l00628"></a>00628 <span class="preprocessor">#endif</span> <a name="l00629"></a>00629 <span class="preprocessor"></span> } <a name="l00630"></a>00630 <span class="comment">// Not found by now</span> <a name="l00631"></a>00631 <span class="comment">// if( mapReloaded )</span> <a name="l00632"></a>00632 <span class="comment">// Not here then</span> <a name="l00633"></a>00633 <span class="keywordflow">return</span> 0; <a name="l00634"></a>00634 <span class="comment">// There could be a problem in the maps. Rebuild them and try again</span> <a name="l00635"></a>00635 reloadUidMap(); <a name="l00636"></a>00636 it = uidMap.find( uid ); <a name="l00637"></a>00637 <span class="keywordflow">if</span>( it != uidMap.end() ) <a name="l00638"></a>00638 <span class="comment">// Since the uid map is just rebuilt, no need for the sanity check</span> <a name="l00639"></a>00639 <span class="keywordflow">return</span> getMsgBase( *it ); <a name="l00640"></a>00640 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l00641"></a>00641 <span class="preprocessor"></span> <span class="keywordflow">else</span> <a name="l00642"></a>00642 kdDebug(5006) << <span class="stringliteral">"Reloaded, but stil didn't find uid: "</span> << uid << endl; <a name="l00643"></a>00643 <span class="preprocessor">#endif</span> <a name="l00644"></a>00644 <span class="preprocessor"></span> <span class="comment">// Then it's not here</span> <a name="l00645"></a>00645 <span class="keywordflow">return</span> 0; <a name="l00646"></a>00646 } <a name="l00647"></a>00647 <a name="l00648"></a>00648 <span class="comment">// This finds and sets the proper account for this folder if it has</span> <a name="l00649"></a>00649 <span class="comment">// not been done</span> <a name="l00650"></a>00650 KMAcctCachedImap *KMFolderCachedImap::account()<span class="keyword"> const</span> <a name="l00651"></a>00651 <span class="keyword"></span>{ <a name="l00652"></a>00652 <span class="keywordflow">if</span>( (KMAcctCachedImap *)mAccount == 0 && kmkernel && kmkernel->acctMgr() ) { <a name="l00653"></a>00653 <span class="comment">// Find the account</span> <a name="l00654"></a>00654 mAccount = <span class="keyword">static_cast<</span>KMAcctCachedImap *<span class="keyword">></span>( kmkernel->acctMgr()->findByName( name() ) ); <a name="l00655"></a>00655 } <a name="l00656"></a>00656 <a name="l00657"></a>00657 <span class="keywordflow">return</span> mAccount; <a name="l00658"></a>00658 } <a name="l00659"></a>00659 <a name="l00660"></a>00660 <span class="keywordtype">void</span> KMFolderCachedImap::slotTroubleshoot() <a name="l00661"></a>00661 { <a name="l00662"></a>00662 <span class="keyword">const</span> <span class="keywordtype">int</span> rc = DImapTroubleShootDialog::run(); <a name="l00663"></a>00663 <a name="l00664"></a>00664 <span class="keywordflow">if</span>( rc == DImapTroubleShootDialog::RefreshCache ) { <a name="l00665"></a>00665 <span class="comment">// Refresh cache</span> <a name="l00666"></a>00666 <span class="keywordflow">if</span>( !account() ) { <a name="l00667"></a>00667 KMessageBox::sorry( 0, i18n(<span class="stringliteral">"No account setup for this folder.\n"</span> <a name="l00668"></a>00668 <span class="stringliteral">"Please try running a sync before this."</span>) ); <a name="l00669"></a>00669 <span class="keywordflow">return</span>; <a name="l00670"></a>00670 } <a name="l00671"></a>00671 QString str = i18n(<span class="stringliteral">"Are you sure you want to refresh the IMAP cache of "</span> <a name="l00672"></a>00672 <span class="stringliteral">"the folder %1 and all its subfolders?\nThis will "</span> <a name="l00673"></a>00673 <span class="stringliteral">"remove all changes you have done locally to your "</span> <a name="l00674"></a>00674 <span class="stringliteral">"folders."</span>).arg( label() ); <a name="l00675"></a>00675 QString s1 = i18n(<span class="stringliteral">"Refresh IMAP Cache"</span>); <a name="l00676"></a>00676 QString s2 = i18n(<span class="stringliteral">"&Refresh"</span>); <a name="l00677"></a>00677 <span class="keywordflow">if</span>( KMessageBox::warningContinueCancel( 0, str, s1, s2 ) == <a name="l00678"></a>00678 KMessageBox::Continue ) <a name="l00679"></a>00679 account()->invalidateIMAPFolders( <span class="keyword">this</span> ); <a name="l00680"></a>00680 } <span class="keywordflow">else</span> { <a name="l00681"></a>00681 <span class="comment">// Rebuild index file</span> <a name="l00682"></a>00682 <span class="keywordflow">switch</span> ( rc ) { <a name="l00683"></a>00683 <span class="keywordflow">case</span> DImapTroubleShootDialog::ReindexAll: <a name="l00684"></a>00684 { <a name="l00685"></a>00685 KMFolderCachedImap *rootStorage = <span class="keyword">dynamic_cast<</span>KMFolderCachedImap*<span class="keyword">></span>( account()->rootFolder() ); <a name="l00686"></a>00686 <span class="keywordflow">if</span> ( rootStorage ) <a name="l00687"></a>00687 rootStorage->createIndexFromContentsRecursive(); <a name="l00688"></a>00688 <span class="keywordflow">break</span>; <a name="l00689"></a>00689 } <a name="l00690"></a>00690 <span class="keywordflow">case</span> DImapTroubleShootDialog::ReindexCurrent: <a name="l00691"></a>00691 createIndexFromContents(); <a name="l00692"></a>00692 <span class="keywordflow">break</span>; <a name="l00693"></a>00693 <span class="keywordflow">case</span> DImapTroubleShootDialog::ReindexRecursive: <a name="l00694"></a>00694 createIndexFromContentsRecursive(); <a name="l00695"></a>00695 <span class="keywordflow">break</span>; <a name="l00696"></a>00696 <span class="keywordflow">default</span>: <a name="l00697"></a>00697 <span class="keywordflow">return</span>; <a name="l00698"></a>00698 } <a name="l00699"></a>00699 KMessageBox::information( 0, i18n( <span class="stringliteral">"The index of this folder has been "</span> <a name="l00700"></a>00700 <span class="stringliteral">"recreated."</span> ) ); <a name="l00701"></a>00701 writeIndex(); <a name="l00702"></a>00702 kmkernel->getKMMainWidget()->folderSelected(); <a name="l00703"></a>00703 } <a name="l00704"></a>00704 } <a name="l00705"></a>00705 <a name="l00706"></a>00706 <span class="keywordtype">void</span> KMFolderCachedImap::serverSync( <span class="keywordtype">bool</span> recurse ) <a name="l00707"></a>00707 { <a name="l00708"></a>00708 <span class="keywordflow">if</span>( mSyncState != SYNC_STATE_INITIAL ) { <a name="l00709"></a>00709 <span class="keywordflow">if</span>( KMessageBox::warningYesNo( 0, i18n(<span class="stringliteral">"Folder %1 is not in initial sync state (state was %2). Do you want to reset it to initial sync state and sync anyway?"</span> ).arg( imapPath() ).arg( mSyncState ), QString::null, i18n(<span class="stringliteral">"Reset && Sync"</span>), KStdGuiItem::cancel() ) == KMessageBox::Yes ) { <a name="l00710"></a>00710 mSyncState = SYNC_STATE_INITIAL; <a name="l00711"></a>00711 } <span class="keywordflow">else</span> <span class="keywordflow">return</span>; <a name="l00712"></a>00712 } <a name="l00713"></a>00713 <a name="l00714"></a>00714 mRecurse = recurse; <a name="l00715"></a>00715 assert( account() ); <a name="l00716"></a>00716 <a name="l00717"></a>00717 ProgressItem *progressItem = mAccount->mailCheckProgressItem(); <a name="l00718"></a>00718 <span class="keywordflow">if</span> ( progressItem ) { <a name="l00719"></a>00719 progressItem->reset(); <a name="l00720"></a>00720 progressItem->setTotalItems( 100 ); <a name="l00721"></a>00721 } <a name="l00722"></a>00722 mProgress = 0; <a name="l00723"></a>00723 <a name="l00724"></a>00724 <span class="preprocessor">#if 0</span> <a name="l00725"></a>00725 <span class="preprocessor"></span> <span class="keywordflow">if</span>( mHoldSyncs ) { <a name="l00726"></a>00726 <span class="comment">// All done for this folder.</span> <a name="l00727"></a>00727 account()->mailCheckProgressItem()->setProgress( 100 ); <a name="l00728"></a>00728 mProgress = 100; <span class="comment">// all done</span> <a name="l00729"></a>00729 newState( mProgress, i18n(<span class="stringliteral">"Synchronization skipped"</span>)); <a name="l00730"></a>00730 mSyncState = SYNC_STATE_INITIAL; <a name="l00731"></a>00731 emit folderComplete( <span class="keyword">this</span>, <span class="keyword">true</span> ); <a name="l00732"></a>00732 <span class="keywordflow">return</span>; <a name="l00733"></a>00733 } <a name="l00734"></a>00734 <span class="preprocessor">#endif</span> <a name="l00735"></a>00735 <span class="preprocessor"></span> mTentativeHighestUid = 0; <span class="comment">// reset, last sync could have been canceled</span> <a name="l00736"></a>00736 <a name="l00737"></a>00737 serverSyncInternal(); <a name="l00738"></a>00738 } <a name="l00739"></a>00739 <a name="l00740"></a>00740 QString KMFolderCachedImap::state2String( <span class="keywordtype">int</span> state )<span class="keyword"> const</span> <a name="l00741"></a>00741 <span class="keyword"></span>{ <a name="l00742"></a>00742 <span class="keywordflow">switch</span>( state ) { <a name="l00743"></a>00743 <span class="keywordflow">case</span> SYNC_STATE_INITIAL: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_INITIAL"</span>; <a name="l00744"></a>00744 <span class="keywordflow">case</span> SYNC_STATE_GET_USERRIGHTS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_GET_USERRIGHTS"</span>; <a name="l00745"></a>00745 <span class="keywordflow">case</span> SYNC_STATE_PUT_MESSAGES: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_PUT_MESSAGES"</span>; <a name="l00746"></a>00746 <span class="keywordflow">case</span> SYNC_STATE_UPLOAD_FLAGS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_UPLOAD_FLAGS"</span>; <a name="l00747"></a>00747 <span class="keywordflow">case</span> SYNC_STATE_CREATE_SUBFOLDERS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_CREATE_SUBFOLDERS"</span>; <a name="l00748"></a>00748 <span class="keywordflow">case</span> SYNC_STATE_LIST_SUBFOLDERS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_LIST_SUBFOLDERS"</span>; <a name="l00749"></a>00749 <span class="keywordflow">case</span> SYNC_STATE_LIST_NAMESPACES: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_LIST_NAMESPACES"</span>; <a name="l00750"></a>00750 <span class="keywordflow">case</span> SYNC_STATE_LIST_SUBFOLDERS2: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_LIST_SUBFOLDERS2"</span>; <a name="l00751"></a>00751 <span class="keywordflow">case</span> SYNC_STATE_DELETE_SUBFOLDERS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_DELETE_SUBFOLDERS"</span>; <a name="l00752"></a>00752 <span class="keywordflow">case</span> SYNC_STATE_LIST_MESSAGES: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_LIST_MESSAGES"</span>; <a name="l00753"></a>00753 <span class="keywordflow">case</span> SYNC_STATE_DELETE_MESSAGES: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_DELETE_MESSAGES"</span>; <a name="l00754"></a>00754 <span class="keywordflow">case</span> SYNC_STATE_GET_MESSAGES: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_GET_MESSAGES"</span>; <a name="l00755"></a>00755 <span class="keywordflow">case</span> SYNC_STATE_EXPUNGE_MESSAGES: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_EXPUNGE_MESSAGES"</span>; <a name="l00756"></a>00756 <span class="keywordflow">case</span> SYNC_STATE_HANDLE_INBOX: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_HANDLE_INBOX"</span>; <a name="l00757"></a>00757 <span class="keywordflow">case</span> SYNC_STATE_TEST_ANNOTATIONS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_TEST_ANNOTATIONS"</span>; <a name="l00758"></a>00758 <span class="keywordflow">case</span> SYNC_STATE_GET_ANNOTATIONS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_GET_ANNOTATIONS"</span>; <a name="l00759"></a>00759 <span class="keywordflow">case</span> SYNC_STATE_SET_ANNOTATIONS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_SET_ANNOTATIONS"</span>; <a name="l00760"></a>00760 <span class="keywordflow">case</span> SYNC_STATE_GET_ACLS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_GET_ACLS"</span>; <a name="l00761"></a>00761 <span class="keywordflow">case</span> SYNC_STATE_SET_ACLS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_SET_ACLS"</span>; <a name="l00762"></a>00762 <span class="keywordflow">case</span> SYNC_STATE_GET_QUOTA: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_GET_QUOTA"</span>; <a name="l00763"></a>00763 <span class="keywordflow">case</span> SYNC_STATE_FIND_SUBFOLDERS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_FIND_SUBFOLDERS"</span>; <a name="l00764"></a>00764 <span class="keywordflow">case</span> SYNC_STATE_SYNC_SUBFOLDERS: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_SYNC_SUBFOLDERS"</span>; <a name="l00765"></a>00765 <span class="keywordflow">case</span> SYNC_STATE_RENAME_FOLDER: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_RENAME_FOLDER"</span>; <a name="l00766"></a>00766 <span class="keywordflow">case</span> SYNC_STATE_CHECK_UIDVALIDITY: <span class="keywordflow">return</span> <span class="stringliteral">"SYNC_STATE_CHECK_UIDVALIDITY"</span>; <a name="l00767"></a>00767 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> <span class="stringliteral">"Unknown state"</span>; <a name="l00768"></a>00768 } <a name="l00769"></a>00769 } <a name="l00770"></a>00770 <a name="l00771"></a>00771 <span class="comment">/*</span> <a name="l00772"></a>00772 <span class="comment"> Progress calculation: each step is assigned a span. Initially the total is 100.</span> <a name="l00773"></a>00773 <span class="comment"> But if we skip a step, don't increase the progress.</span> <a name="l00774"></a>00774 <span class="comment"> This leaves more room for the step a with variable size (get_messages)</span> <a name="l00775"></a>00775 <span class="comment"> connecting 5</span> <a name="l00776"></a>00776 <span class="comment"> getuserrights 5</span> <a name="l00777"></a>00777 <span class="comment"> rename 5</span> <a name="l00778"></a>00778 <span class="comment"> check_uidvalidity 5</span> <a name="l00779"></a>00779 <span class="comment"> create_subfolders 5</span> <a name="l00780"></a>00780 <span class="comment"> put_messages 10 (but it can take a very long time, with many messages....)</span> <a name="l00781"></a>00781 <span class="comment"> upload_flags 5</span> <a name="l00782"></a>00782 <span class="comment"> list_subfolders 5</span> <a name="l00783"></a>00783 <span class="comment"> list_subfolders2 0 (all local)</span> <a name="l00784"></a>00784 <span class="comment"> delete_subfolders 5</span> <a name="l00785"></a>00785 <span class="comment"> list_messages 10</span> <a name="l00786"></a>00786 <span class="comment"> delete_messages 10</span> <a name="l00787"></a>00787 <span class="comment"> expunge_messages 5</span> <a name="l00788"></a>00788 <span class="comment"> get_messages variable (remaining-5) i.e. minimum 15.</span> <a name="l00789"></a>00789 <span class="comment"> check_annotations 0 (rare)</span> <a name="l00790"></a>00790 <span class="comment"> set_annotations 0 (rare)</span> <a name="l00791"></a>00791 <span class="comment"> get_annotations 2</span> <a name="l00792"></a>00792 <span class="comment"> set_acls 0 (rare)</span> <a name="l00793"></a>00793 <span class="comment"> get_acls 3</span> <a name="l00794"></a>00794 <span class="comment"></span> <a name="l00795"></a>00795 <span class="comment"> noContent folders have only a few of the above steps</span> <a name="l00796"></a>00796 <span class="comment"> (permissions, and all subfolder stuff), so its steps should be given more span</span> <a name="l00797"></a>00797 <span class="comment"></span> <a name="l00798"></a>00798 <span class="comment"> */</span> <a name="l00799"></a>00799 <a name="l00800"></a>00800 <span class="comment">// While the server synchronization is running, mSyncState will hold</span> <a name="l00801"></a>00801 <span class="comment">// the state that should be executed next</span> <a name="l00802"></a>00802 <span class="keywordtype">void</span> KMFolderCachedImap::serverSyncInternal() <a name="l00803"></a>00803 { <a name="l00804"></a>00804 <span class="comment">// This is used to stop processing when we're about to exit</span> <a name="l00805"></a>00805 <span class="comment">// and the current job wasn't cancellable.</span> <a name="l00806"></a>00806 <span class="comment">// For user-requested abort, we'll use signalAbortRequested instead.</span> <a name="l00807"></a>00807 <span class="keywordflow">if</span>( kmkernel->mailCheckAborted() ) { <a name="l00808"></a>00808 resetSyncState(); <a name="l00809"></a>00809 emit folderComplete( <span class="keyword">this</span>, <span class="keyword">false</span> ); <a name="l00810"></a>00810 <span class="keywordflow">return</span>; <a name="l00811"></a>00811 } <a name="l00812"></a>00812 <a name="l00813"></a>00813 <span class="comment">//kdDebug(5006) << label() << ": " << state2String( mSyncState ) << endl;</span> <a name="l00814"></a>00814 <span class="keywordflow">switch</span>( mSyncState ) { <a name="l00815"></a>00815 <span class="keywordflow">case</span> SYNC_STATE_INITIAL: <a name="l00816"></a>00816 { <a name="l00817"></a>00817 mProgress = 0; <a name="l00818"></a>00818 foldersForDeletionOnServer.clear(); <a name="l00819"></a>00819 newState( mProgress, i18n(<span class="stringliteral">"Synchronizing"</span>)); <a name="l00820"></a>00820 <a name="l00821"></a>00821 open(<span class="stringliteral">"cachedimap"</span>); <a name="l00822"></a>00822 <span class="keywordflow">if</span> ( !noContent() ) <a name="l00823"></a>00823 mAccount->addLastUnreadMsgCount( <span class="keyword">this</span>, countUnread() ); <a name="l00824"></a>00824 <a name="l00825"></a>00825 <span class="comment">// Connect to the server (i.e. prepare the slave)</span> <a name="l00826"></a>00826 ImapAccountBase::ConnectionState cs = mAccount->makeConnection(); <a name="l00827"></a>00827 <span class="keywordflow">if</span> ( cs == ImapAccountBase::Error ) { <a name="l00828"></a>00828 <span class="comment">// Cancelled by user, or slave can't start</span> <a name="l00829"></a>00829 <span class="comment">// kdDebug(5006) << "makeConnection said Error, aborting." << endl;</span> <a name="l00830"></a>00830 <span class="comment">// We stop here. We're already in SYNC_STATE_INITIAL for the next time.</span> <a name="l00831"></a>00831 newState( mProgress, i18n( <span class="stringliteral">"Error connecting to server %1"</span> ).arg( mAccount->host() ) ); <a name="l00832"></a>00832 close(<span class="stringliteral">"cachedimap"</span>); <a name="l00833"></a>00833 emit folderComplete(<span class="keyword">this</span>, <span class="keyword">false</span>); <a name="l00834"></a>00834 <span class="keywordflow">break</span>; <a name="l00835"></a>00835 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( cs == ImapAccountBase::Connecting ) { <a name="l00836"></a>00836 mAccount->setAnnotationCheckPassed( <span class="keyword">false</span> ); <a name="l00837"></a>00837 <span class="comment">// kdDebug(5006) << "makeConnection said Connecting, waiting for signal." << endl;</span> <a name="l00838"></a>00838 newState( mProgress, i18n(<span class="stringliteral">"Connecting to %1"</span>).arg( mAccount->host() ) ); <a name="l00839"></a>00839 <span class="comment">// We'll wait for the connectionResult signal from the account.</span> <a name="l00840"></a>00840 connect( mAccount, SIGNAL( connectionResult(<span class="keywordtype">int</span>, <span class="keyword">const</span> QString&) ), <a name="l00841"></a>00841 <span class="keyword">this</span>, SLOT( slotConnectionResult(<span class="keywordtype">int</span>, <span class="keyword">const</span> QString&) ) ); <a name="l00842"></a>00842 <span class="keywordflow">break</span>; <a name="l00843"></a>00843 } <span class="keywordflow">else</span> { <a name="l00844"></a>00844 <span class="comment">// Connected</span> <a name="l00845"></a>00845 <span class="comment">// kdDebug(5006) << "makeConnection said Connected, proceeding." << endl;</span> <a name="l00846"></a>00846 mSyncState = SYNC_STATE_GET_USERRIGHTS; <a name="l00847"></a>00847 <span class="comment">// Fall through to next state</span> <a name="l00848"></a>00848 } <a name="l00849"></a>00849 } <a name="l00850"></a>00850 <a name="l00851"></a>00851 <a name="l00852"></a>00852 <span class="keywordflow">case</span> SYNC_STATE_GET_USERRIGHTS: <a name="l00853"></a>00853 <span class="comment">//kdDebug(5006) << "===== Syncing " << ( mImapPath.isEmpty() ? label() : mImapPath ) << endl;</span> <a name="l00854"></a>00854 <a name="l00855"></a>00855 mSyncState = SYNC_STATE_RENAME_FOLDER; <a name="l00856"></a>00856 <a name="l00857"></a>00857 <span class="keywordflow">if</span>( !noContent() && mAccount->hasACLSupport() ) { <a name="l00858"></a>00858 <span class="comment">// Check the user's own rights. We do this every time in case they changed.</span> <a name="l00859"></a>00859 mOldUserRights = mUserRights; <a name="l00860"></a>00860 newState( mProgress, i18n(<span class="stringliteral">"Checking permissions"</span>)); <a name="l00861"></a>00861 connect( mAccount, SIGNAL( receivedUserRights( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* ) ), <a name="l00862"></a>00862 <span class="keyword">this</span>, SLOT( slotReceivedUserRights( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* ) ) ); <a name="l00863"></a>00863 mAccount->getUserRights( folder(), imapPath() ); <span class="comment">// after connecting, due to the INBOX case</span> <a name="l00864"></a>00864 <span class="keywordflow">break</span>; <a name="l00865"></a>00865 } <a name="l00866"></a>00866 <a name="l00867"></a>00867 <span class="keywordflow">case</span> SYNC_STATE_RENAME_FOLDER: <a name="l00868"></a>00868 { <a name="l00869"></a>00869 mSyncState = SYNC_STATE_CHECK_UIDVALIDITY; <a name="l00870"></a>00870 <span class="comment">// Returns the new name if the folder was renamed, empty otherwise.</span> <a name="l00871"></a>00871 <span class="keywordtype">bool</span> isResourceFolder = kmkernel->iCalIface().isStandardResourceFolder( folder() ); <a name="l00872"></a>00872 QString newName = mAccount->renamedFolder( imapPath() ); <a name="l00873"></a>00873 <span class="keywordflow">if</span> ( !newName.isEmpty() && !folder()-><a class="code" href="classKMFolder.html#775598752860ff7bf869b0f822b4fcb4" title="Returns true if the folder is a kmail system folder.">isSystemFolder</a>() && !isResourceFolder ) { <a name="l00874"></a>00874 newState( mProgress, i18n(<span class="stringliteral">"Renaming folder"</span>) ); <a name="l00875"></a>00875 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( newName, CachedImapJob::tRenameFolder, <span class="keyword">this</span> ); <a name="l00876"></a>00876 connect( job, SIGNAL( result(KMail::FolderJob *) ), <span class="keyword">this</span>, SLOT( slotIncreaseProgress() ) ); <a name="l00877"></a>00877 connect( job, SIGNAL( finished() ), <span class="keyword">this</span>, SLOT( serverSyncInternal() ) ); <a name="l00878"></a>00878 job->start(); <a name="l00879"></a>00879 <span class="keywordflow">break</span>; <a name="l00880"></a>00880 } <a name="l00881"></a>00881 } <a name="l00882"></a>00882 <a name="l00883"></a>00883 <span class="keywordflow">case</span> SYNC_STATE_CHECK_UIDVALIDITY: <a name="l00884"></a>00884 mSyncState = SYNC_STATE_CREATE_SUBFOLDERS; <a name="l00885"></a>00885 <span class="keywordflow">if</span>( !noContent() ) { <a name="l00886"></a>00886 checkUidValidity(); <a name="l00887"></a>00887 <span class="keywordflow">break</span>; <a name="l00888"></a>00888 } <a name="l00889"></a>00889 <span class="comment">// Else carry on</span> <a name="l00890"></a>00890 <a name="l00891"></a>00891 <span class="keywordflow">case</span> SYNC_STATE_CREATE_SUBFOLDERS: <a name="l00892"></a>00892 mSyncState = SYNC_STATE_PUT_MESSAGES; <a name="l00893"></a>00893 createNewFolders(); <a name="l00894"></a>00894 <span class="keywordflow">break</span>; <a name="l00895"></a>00895 <a name="l00896"></a>00896 <span class="keywordflow">case</span> SYNC_STATE_PUT_MESSAGES: <a name="l00897"></a>00897 mSyncState = SYNC_STATE_UPLOAD_FLAGS; <a name="l00898"></a>00898 <span class="keywordflow">if</span>( !noContent() ) { <a name="l00899"></a>00899 uploadNewMessages(); <a name="l00900"></a>00900 <span class="keywordflow">break</span>; <a name="l00901"></a>00901 } <a name="l00902"></a>00902 <span class="comment">// Else carry on</span> <a name="l00903"></a>00903 <span class="keywordflow">case</span> SYNC_STATE_UPLOAD_FLAGS: <a name="l00904"></a>00904 mSyncState = SYNC_STATE_LIST_NAMESPACES; <a name="l00905"></a>00905 <span class="keywordflow">if</span>( !noContent() ) { <a name="l00906"></a>00906 <span class="comment">// We haven't downloaded messages yet, so we need to build the map.</span> <a name="l00907"></a>00907 <span class="keywordflow">if</span>( uidMapDirty ) <a name="l00908"></a>00908 reloadUidMap(); <a name="l00909"></a>00909 <span class="comment">// Upload flags, unless we know from the ACL that we're not allowed</span> <a name="l00910"></a>00910 <span class="comment">// to do that or they did not change locally</span> <a name="l00911"></a>00911 <span class="keywordflow">if</span> ( mUserRights <= 0 || ( mUserRights & (KMail::ACLJobs::WriteFlags ) ) ) { <a name="l00912"></a>00912 <span class="keywordflow">if</span> ( mStatusChangedLocally ) { <a name="l00913"></a>00913 uploadFlags(); <a name="l00914"></a>00914 <span class="keywordflow">break</span>; <a name="l00915"></a>00915 } <span class="keywordflow">else</span> { <a name="l00916"></a>00916 <span class="comment">//kdDebug(5006) << "Skipping flags upload, folder unchanged: " << label() << endl;</span> <a name="l00917"></a>00917 } <a name="l00918"></a>00918 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( mUserRights & KMail::ACLJobs::WriteSeenFlag ) { <a name="l00919"></a>00919 <span class="keywordflow">if</span> ( mStatusChangedLocally ) { <a name="l00920"></a>00920 uploadSeenFlags(); <a name="l00921"></a>00921 <span class="keywordflow">break</span>; <a name="l00922"></a>00922 } <a name="l00923"></a>00923 } <a name="l00924"></a>00924 } <a name="l00925"></a>00925 <span class="comment">// Else carry on</span> <a name="l00926"></a>00926 <a name="l00927"></a>00927 <span class="keywordflow">case</span> SYNC_STATE_LIST_NAMESPACES: <a name="l00928"></a>00928 <span class="keywordflow">if</span> ( <span class="keyword">this</span> == mAccount->rootFolder() ) { <a name="l00929"></a>00929 listNamespaces(); <a name="l00930"></a>00930 <span class="keywordflow">break</span>; <a name="l00931"></a>00931 } <a name="l00932"></a>00932 mSyncState = SYNC_STATE_LIST_SUBFOLDERS; <a name="l00933"></a>00933 <span class="comment">// Else carry on</span> <a name="l00934"></a>00934 <a name="l00935"></a>00935 <span class="keywordflow">case</span> SYNC_STATE_LIST_SUBFOLDERS: <a name="l00936"></a>00936 newState( mProgress, i18n(<span class="stringliteral">"Retrieving folderlist"</span>)); <a name="l00937"></a>00937 mSyncState = SYNC_STATE_LIST_SUBFOLDERS2; <a name="l00938"></a>00938 <span class="keywordflow">if</span>( !listDirectory() ) { <a name="l00939"></a>00939 mSyncState = SYNC_STATE_INITIAL; <a name="l00940"></a>00940 KMessageBox::error(0, i18n(<span class="stringliteral">"Error while retrieving the folderlist"</span>)); <a name="l00941"></a>00941 } <a name="l00942"></a>00942 <span class="keywordflow">break</span>; <a name="l00943"></a>00943 <a name="l00944"></a>00944 <span class="keywordflow">case</span> SYNC_STATE_LIST_SUBFOLDERS2: <a name="l00945"></a>00945 mSyncState = SYNC_STATE_DELETE_SUBFOLDERS; <a name="l00946"></a>00946 mProgress += 10; <a name="l00947"></a>00947 newState( mProgress, i18n(<span class="stringliteral">"Retrieving subfolders"</span>)); <a name="l00948"></a>00948 listDirectory2(); <a name="l00949"></a>00949 <span class="keywordflow">break</span>; <a name="l00950"></a>00950 <a name="l00951"></a>00951 <span class="keywordflow">case</span> SYNC_STATE_DELETE_SUBFOLDERS: <a name="l00952"></a>00952 mSyncState = SYNC_STATE_LIST_MESSAGES; <a name="l00953"></a>00953 <span class="keywordflow">if</span>( !foldersForDeletionOnServer.isEmpty() ) { <a name="l00954"></a>00954 newState( mProgress, i18n(<span class="stringliteral">"Deleting folders from server"</span>)); <a name="l00955"></a>00955 CachedImapJob* job = <span class="keyword">new</span> CachedImapJob( foldersForDeletionOnServer, <a name="l00956"></a>00956 CachedImapJob::tDeleteFolders, <span class="keyword">this</span> ); <a name="l00957"></a>00957 connect( job, SIGNAL( result(KMail::FolderJob *) ), <span class="keyword">this</span>, SLOT( slotIncreaseProgress() ) ); <a name="l00958"></a>00958 connect( job, SIGNAL( finished() ), <span class="keyword">this</span>, SLOT( slotFolderDeletionOnServerFinished() ) ); <a name="l00959"></a>00959 job->start(); <a name="l00960"></a>00960 <span class="keywordflow">break</span>; <a name="l00961"></a>00961 } <a name="l00962"></a>00962 <span class="comment">// Not needed, the next step emits newState very quick</span> <a name="l00963"></a>00963 <span class="comment">//newState( mProgress, i18n("No folders to delete from server"));</span> <a name="l00964"></a>00964 <span class="comment">// Carry on</span> <a name="l00965"></a>00965 <a name="l00966"></a>00966 <span class="keywordflow">case</span> SYNC_STATE_LIST_MESSAGES: <a name="l00967"></a>00967 mSyncState = SYNC_STATE_DELETE_MESSAGES; <a name="l00968"></a>00968 <span class="keywordflow">if</span>( !noContent() ) { <a name="l00969"></a>00969 newState( mProgress, i18n(<span class="stringliteral">"Retrieving message list"</span>)); <a name="l00970"></a>00970 listMessages(); <a name="l00971"></a>00971 <span class="keywordflow">break</span>; <a name="l00972"></a>00972 } <a name="l00973"></a>00973 <span class="comment">// Else carry on</span> <a name="l00974"></a>00974 <a name="l00975"></a>00975 <span class="keywordflow">case</span> SYNC_STATE_DELETE_MESSAGES: <a name="l00976"></a>00976 mSyncState = SYNC_STATE_EXPUNGE_MESSAGES; <a name="l00977"></a>00977 <span class="keywordflow">if</span>( !noContent() ) { <a name="l00978"></a>00978 <span class="keywordflow">if</span>( deleteMessages() ) { <a name="l00979"></a>00979 <span class="comment">// Fine, we will continue with the next state</span> <a name="l00980"></a>00980 } <span class="keywordflow">else</span> { <a name="l00981"></a>00981 <span class="comment">// No messages to delete, skip to GET_MESSAGES</span> <a name="l00982"></a>00982 newState( mProgress, i18n(<span class="stringliteral">"No messages to delete..."</span>)); <a name="l00983"></a>00983 mSyncState = SYNC_STATE_GET_MESSAGES; <a name="l00984"></a>00984 serverSyncInternal(); <a name="l00985"></a>00985 } <a name="l00986"></a>00986 <span class="keywordflow">break</span>; <a name="l00987"></a>00987 } <a name="l00988"></a>00988 <span class="comment">// Else carry on</span> <a name="l00989"></a>00989 <a name="l00990"></a>00990 <span class="keywordflow">case</span> SYNC_STATE_EXPUNGE_MESSAGES: <a name="l00991"></a>00991 mSyncState = SYNC_STATE_GET_MESSAGES; <a name="l00992"></a>00992 <span class="keywordflow">if</span>( !noContent() ) { <a name="l00993"></a>00993 newState( mProgress, i18n(<span class="stringliteral">"Expunging deleted messages"</span>)); <a name="l00994"></a>00994 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( QString::null, <a name="l00995"></a>00995 CachedImapJob::tExpungeFolder, <span class="keyword">this</span> ); <a name="l00996"></a>00996 connect( job, SIGNAL( result(KMail::FolderJob *) ), <span class="keyword">this</span>, SLOT( slotIncreaseProgress() ) ); <a name="l00997"></a>00997 connect( job, SIGNAL( finished() ), <span class="keyword">this</span>, SLOT( serverSyncInternal() ) ); <a name="l00998"></a>00998 job->start(); <a name="l00999"></a>00999 <span class="keywordflow">break</span>; <a name="l01000"></a>01000 } <a name="l01001"></a>01001 <span class="comment">// Else carry on</span> <a name="l01002"></a>01002 <a name="l01003"></a>01003 <span class="keywordflow">case</span> SYNC_STATE_GET_MESSAGES: <a name="l01004"></a>01004 mSyncState = SYNC_STATE_HANDLE_INBOX; <a name="l01005"></a>01005 <span class="keywordflow">if</span>( !noContent() ) { <a name="l01006"></a>01006 <span class="keywordflow">if</span>( !mMsgsForDownload.isEmpty() ) { <a name="l01007"></a>01007 newState( mProgress, i18n(<span class="stringliteral">"Retrieving new messages"</span>)); <a name="l01008"></a>01008 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( mMsgsForDownload, <a name="l01009"></a>01009 CachedImapJob::tGetMessage, <a name="l01010"></a>01010 <span class="keyword">this</span> ); <a name="l01011"></a>01011 connect( job, SIGNAL( progress(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) ), <a name="l01012"></a>01012 <span class="keyword">this</span>, SLOT( slotProgress(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) ) ); <a name="l01013"></a>01013 connect( job, SIGNAL( finished() ), <span class="keyword">this</span>, SLOT( slotUpdateLastUid() ) ); <a name="l01014"></a>01014 connect( job, SIGNAL( finished() ), <span class="keyword">this</span>, SLOT( serverSyncInternal() ) ); <a name="l01015"></a>01015 job->start(); <a name="l01016"></a>01016 mMsgsForDownload.clear(); <a name="l01017"></a>01017 <span class="keywordflow">break</span>; <a name="l01018"></a>01018 } <span class="keywordflow">else</span> { <a name="l01019"></a>01019 newState( mProgress, i18n(<span class="stringliteral">"No new messages from server"</span>)); <a name="l01020"></a>01020 <span class="comment">/* There were no messages to download, but it could be that we uploaded some</span> <a name="l01021"></a>01021 <span class="comment"> which we didn't need to download again because we already knew the uid.</span> <a name="l01022"></a>01022 <span class="comment"> Now that we are sure there is nothing to download, and everything that had</span> <a name="l01023"></a>01023 <span class="comment"> to be deleted on the server has been deleted, adjust our local notion of the</span> <a name="l01024"></a>01024 <span class="comment"> highes uid seen thus far. */</span> <a name="l01025"></a>01025 slotUpdateLastUid(); <a name="l01026"></a>01026 <span class="keywordflow">if</span>( mLastUid == 0 && uidWriteTimer == -1 ) { <a name="l01027"></a>01027 <span class="comment">// This is probably a new and empty folder. Write the UID cache</span> <a name="l01028"></a>01028 <span class="keywordflow">if</span> ( writeUidCache() == -1 ) { <a name="l01029"></a>01029 resetSyncState(); <a name="l01030"></a>01030 emit folderComplete( <span class="keyword">this</span>, <span class="keyword">false</span> ); <a name="l01031"></a>01031 <span class="keywordflow">return</span>; <a name="l01032"></a>01032 } <a name="l01033"></a>01033 } <a name="l01034"></a>01034 } <a name="l01035"></a>01035 } <a name="l01036"></a>01036 <a name="l01037"></a>01037 <span class="comment">// Else carry on</span> <a name="l01038"></a>01038 <a name="l01039"></a>01039 <span class="keywordflow">case</span> SYNC_STATE_HANDLE_INBOX: <a name="l01040"></a>01040 <span class="comment">// Wrap up the 'download emails' stage. We always end up at 95 here.</span> <a name="l01041"></a>01041 mProgress = 95; <a name="l01042"></a>01042 mSyncState = SYNC_STATE_TEST_ANNOTATIONS; <a name="l01043"></a>01043 <a name="l01044"></a>01044 <span class="preprocessor"> #define KOLAB_FOLDERTEST "/vendor/kolab/folder-test"</span> <a name="l01045"></a>01045 <span class="preprocessor"></span> <span class="keywordflow">case</span> SYNC_STATE_TEST_ANNOTATIONS: <a name="l01046"></a>01046 mSyncState = SYNC_STATE_GET_ANNOTATIONS; <a name="l01047"></a>01047 <span class="comment">// The first folder with user rights to write annotations</span> <a name="l01048"></a>01048 <span class="keywordflow">if</span>( !mAccount->annotationCheckPassed() && <a name="l01049"></a>01049 ( mUserRights <= 0 || ( mUserRights & ACLJobs::Administer ) ) <a name="l01050"></a>01050 && !imapPath().isEmpty() && imapPath() != <span class="stringliteral">"/"</span> ) { <a name="l01051"></a>01051 kdDebug(5006) << <span class="stringliteral">"Setting test attribute on folder: "</span><< folder()-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() << endl; <a name="l01052"></a>01052 newState( mProgress, i18n(<span class="stringliteral">"Checking annotation support"</span>)); <a name="l01053"></a>01053 <a name="l01054"></a>01054 KURL url = mAccount->getUrl(); <a name="l01055"></a>01055 url.setPath( imapPath() ); <a name="l01056"></a>01056 KMail::AnnotationList annotations; <span class="comment">// to be set</span> <a name="l01057"></a>01057 <a name="l01058"></a>01058 <a class="code" href="structKMail_1_1AnnotationAttribute.html" title="One entry in the annotation list: attribute name and attribute value.">KMail::AnnotationAttribute</a> attr( KOLAB_FOLDERTEST, <span class="stringliteral">"value.shared"</span>, <span class="stringliteral">"true"</span> ); <a name="l01059"></a>01059 annotations.append( attr ); <a name="l01060"></a>01060 <a name="l01061"></a>01061 kdDebug(5006) << <span class="stringliteral">"Setting test attribute to "</span><< url << endl; <a name="l01062"></a>01062 KIO::Job* job = AnnotationJobs::multiSetAnnotation( mAccount->slave(), <a name="l01063"></a>01063 url, annotations ); <a name="l01064"></a>01064 <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a> jd( url.url(), folder() ); <a name="l01065"></a>01065 jd.cancellable = <span class="keyword">true</span>; <span class="comment">// we can always do so later</span> <a name="l01066"></a>01066 mAccount->insertJob(job, jd); <a name="l01067"></a>01067 connect(job, SIGNAL(result(KIO::Job *)), <a name="l01068"></a>01068 SLOT(slotTestAnnotationResult(KIO::Job *))); <a name="l01069"></a>01069 <span class="keywordflow">break</span>; <a name="l01070"></a>01070 } <a name="l01071"></a>01071 <a name="l01072"></a>01072 <span class="keywordflow">case</span> SYNC_STATE_GET_ANNOTATIONS: { <a name="l01073"></a>01073 <span class="preprocessor">#define KOLAB_FOLDERTYPE "/vendor/kolab/folder-type"</span> <a name="l01074"></a>01074 <span class="preprocessor"></span><span class="preprocessor">#define KOLAB_INCIDENCESFOR "/vendor/kolab/incidences-for"</span> <a name="l01075"></a>01075 <span class="preprocessor"></span><span class="comment">//#define KOLAB_FOLDERTYPE "/comment" //for testing, while cyrus-imap doesn't support /vendor/*</span> <a name="l01076"></a>01076 mSyncState = SYNC_STATE_SET_ANNOTATIONS; <a name="l01077"></a>01077 <a name="l01078"></a>01078 <span class="keywordtype">bool</span> needToGetInitialAnnotations = <span class="keyword">false</span>; <a name="l01079"></a>01079 <span class="keywordflow">if</span> ( !noContent() ) { <a name="l01080"></a>01080 <span class="comment">// for a folder we didn't create ourselves: get annotation from server</span> <a name="l01081"></a>01081 <span class="keywordflow">if</span> ( mAnnotationFolderType == <span class="stringliteral">"FROMSERVER"</span> ) { <a name="l01082"></a>01082 needToGetInitialAnnotations = <span class="keyword">true</span>; <a name="l01083"></a>01083 mAnnotationFolderType = QString::null; <a name="l01084"></a>01084 } <span class="keywordflow">else</span> { <a name="l01085"></a>01085 updateAnnotationFolderType(); <a name="l01086"></a>01086 } <a name="l01087"></a>01087 } <a name="l01088"></a>01088 <a name="l01089"></a>01089 <span class="comment">// First retrieve the annotation, so that we know we have to set it if it's not set.</span> <a name="l01090"></a>01090 <span class="comment">// On the other hand, if the user changed the contentstype, there's no need to get first.</span> <a name="l01091"></a>01091 <span class="keywordflow">if</span> ( !noContent() && mAccount->hasAnnotationSupport() && <a name="l01092"></a>01092 ( kmkernel->iCalIface().isEnabled() || needToGetInitialAnnotations ) ) { <a name="l01093"></a>01093 QStringList annotations; <span class="comment">// list of annotations to be fetched</span> <a name="l01094"></a>01094 <span class="keywordflow">if</span> ( !mAnnotationFolderTypeChanged || mAnnotationFolderType.isEmpty() ) <a name="l01095"></a>01095 annotations << KOLAB_FOLDERTYPE; <a name="l01096"></a>01096 <span class="keywordflow">if</span> ( !mIncidencesForChanged ) <a name="l01097"></a>01097 annotations << KOLAB_INCIDENCESFOR; <a name="l01098"></a>01098 <span class="keywordflow">if</span> ( !annotations.isEmpty() ) { <a name="l01099"></a>01099 newState( mProgress, i18n(<span class="stringliteral">"Retrieving annotations"</span>)); <a name="l01100"></a>01100 KURL url = mAccount->getUrl(); <a name="l01101"></a>01101 url.setPath( imapPath() ); <a name="l01102"></a>01102 <a class="code" href="classKMail_1_1AnnotationJobs_1_1MultiGetAnnotationJob.html" title="for multiGetAnnotation">AnnotationJobs::MultiGetAnnotationJob</a>* job = <a name="l01103"></a>01103 AnnotationJobs::multiGetAnnotation( mAccount->slave(), url, annotations ); <a name="l01104"></a>01104 <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a> jd( url.url(), folder() ); <a name="l01105"></a>01105 jd.cancellable = <span class="keyword">true</span>; <a name="l01106"></a>01106 mAccount->insertJob(job, jd); <a name="l01107"></a>01107 <a name="l01108"></a>01108 connect( job, SIGNAL(annotationResult(<span class="keyword">const</span> QString&, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>)), <a name="l01109"></a>01109 SLOT(slotAnnotationResult(<span class="keyword">const</span> QString&, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>)) ); <a name="l01110"></a>01110 connect( job, SIGNAL(result(KIO::Job *)), <a name="l01111"></a>01111 SLOT(slotGetAnnotationResult(KIO::Job *)) ); <a name="l01112"></a>01112 <span class="keywordflow">break</span>; <a name="l01113"></a>01113 } <a name="l01114"></a>01114 } <a name="l01115"></a>01115 } <span class="comment">// case</span> <a name="l01116"></a>01116 <span class="keywordflow">case</span> SYNC_STATE_SET_ANNOTATIONS: <a name="l01117"></a>01117 <a name="l01118"></a>01118 mSyncState = SYNC_STATE_SET_ACLS; <a name="l01119"></a>01119 <span class="keywordflow">if</span> ( !noContent() && mAccount->hasAnnotationSupport() && <a name="l01120"></a>01120 ( mUserRights <= 0 || ( mUserRights & ACLJobs::Administer ) ) ) { <a name="l01121"></a>01121 newState( mProgress, i18n(<span class="stringliteral">"Setting annotations"</span>)); <a name="l01122"></a>01122 KURL url = mAccount->getUrl(); <a name="l01123"></a>01123 url.setPath( imapPath() ); <a name="l01124"></a>01124 KMail::AnnotationList annotations; <span class="comment">// to be set</span> <a name="l01125"></a>01125 <span class="keywordflow">if</span> ( mAnnotationFolderTypeChanged && !mAnnotationFolderType.isEmpty() ) { <a name="l01126"></a>01126 <a class="code" href="structKMail_1_1AnnotationAttribute.html" title="One entry in the annotation list: attribute name and attribute value.">KMail::AnnotationAttribute</a> attr( KOLAB_FOLDERTYPE, <span class="stringliteral">"value.shared"</span>, mAnnotationFolderType ); <a name="l01127"></a>01127 annotations.append( attr ); <a name="l01128"></a>01128 kdDebug(5006) << <span class="stringliteral">"Setting folder-type annotation for "</span> << label() << <span class="stringliteral">" to "</span> << mAnnotationFolderType << endl; <a name="l01129"></a>01129 } <a name="l01130"></a>01130 <span class="keywordflow">if</span> ( mIncidencesForChanged ) { <a name="l01131"></a>01131 <span class="keyword">const</span> QString val = incidencesForToString( mIncidencesFor ); <a name="l01132"></a>01132 <a class="code" href="structKMail_1_1AnnotationAttribute.html" title="One entry in the annotation list: attribute name and attribute value.">KMail::AnnotationAttribute</a> attr( KOLAB_INCIDENCESFOR, <span class="stringliteral">"value.shared"</span>, val ); <a name="l01133"></a>01133 annotations.append( attr ); <a name="l01134"></a>01134 kdDebug(5006) << <span class="stringliteral">"Setting incidences-for annotation for "</span> << label() << <span class="stringliteral">" to "</span> << val << endl; <a name="l01135"></a>01135 } <a name="l01136"></a>01136 <span class="keywordflow">if</span> ( !annotations.isEmpty() ) { <a name="l01137"></a>01137 KIO::Job* job = <a name="l01138"></a>01138 AnnotationJobs::multiSetAnnotation( mAccount->slave(), url, annotations ); <a name="l01139"></a>01139 <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a> jd( url.url(), folder() ); <a name="l01140"></a>01140 jd.cancellable = <span class="keyword">true</span>; <span class="comment">// we can always do so later</span> <a name="l01141"></a>01141 mAccount->insertJob(job, jd); <a name="l01142"></a>01142 <a name="l01143"></a>01143 connect(job, SIGNAL(annotationChanged( <span class="keyword">const</span> QString&, <span class="keyword">const</span> QString&, <span class="keyword">const</span> QString& ) ), <a name="l01144"></a>01144 SLOT( slotAnnotationChanged( <span class="keyword">const</span> QString&, <span class="keyword">const</span> QString&, <span class="keyword">const</span> QString& ) )); <a name="l01145"></a>01145 connect(job, SIGNAL(result(KIO::Job *)), <a name="l01146"></a>01146 SLOT(slotSetAnnotationResult(KIO::Job *))); <a name="l01147"></a>01147 <span class="keywordflow">break</span>; <a name="l01148"></a>01148 } <a name="l01149"></a>01149 } <a name="l01150"></a>01150 <a name="l01151"></a>01151 <span class="keywordflow">case</span> SYNC_STATE_SET_ACLS: <a name="l01152"></a>01152 mSyncState = SYNC_STATE_GET_ACLS; <a name="l01153"></a>01153 <a name="l01154"></a>01154 <span class="keywordflow">if</span>( !noContent() && mAccount->hasACLSupport() && <a name="l01155"></a>01155 ( mUserRights <= 0 || ( mUserRights & ACLJobs::Administer ) ) ) { <a name="l01156"></a>01156 <span class="keywordtype">bool</span> hasChangedACLs = <span class="keyword">false</span>; <a name="l01157"></a>01157 ACLList::ConstIterator it = mACLList.begin(); <a name="l01158"></a>01158 <span class="keywordflow">for</span> ( ; it != mACLList.end() && !hasChangedACLs; ++it ) { <a name="l01159"></a>01159 hasChangedACLs = (*it).changed; <a name="l01160"></a>01160 } <a name="l01161"></a>01161 <span class="keywordflow">if</span> ( hasChangedACLs ) { <a name="l01162"></a>01162 newState( mProgress, i18n(<span class="stringliteral">"Setting permissions"</span>)); <a name="l01163"></a>01163 KURL url = mAccount->getUrl(); <a name="l01164"></a>01164 url.setPath( imapPath() ); <a name="l01165"></a>01165 KIO::Job* job = <a class="code" href="namespaceKMail_1_1ACLJobs.html#7b295f205e3aed1d93a24b40728b6697" title="Set and delete a list of permissions for different users on a given url.">KMail::ACLJobs::multiSetACL</a>( mAccount->slave(), url, mACLList ); <a name="l01166"></a>01166 <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a> jd( url.url(), folder() ); <a name="l01167"></a>01167 mAccount->insertJob(job, jd); <a name="l01168"></a>01168 <a name="l01169"></a>01169 connect(job, SIGNAL(result(KIO::Job *)), <a name="l01170"></a>01170 SLOT(slotMultiSetACLResult(KIO::Job *))); <a name="l01171"></a>01171 connect(job, SIGNAL(aclChanged( <span class="keyword">const</span> QString&, <span class="keywordtype">int</span> )), <a name="l01172"></a>01172 SLOT(slotACLChanged( <span class="keyword">const</span> QString&, <span class="keywordtype">int</span> )) ); <a name="l01173"></a>01173 <span class="keywordflow">break</span>; <a name="l01174"></a>01174 } <a name="l01175"></a>01175 } <a name="l01176"></a>01176 <a name="l01177"></a>01177 <span class="keywordflow">case</span> SYNC_STATE_GET_ACLS: <a name="l01178"></a>01178 mSyncState = SYNC_STATE_GET_QUOTA; <a name="l01179"></a>01179 <a name="l01180"></a>01180 <span class="keywordflow">if</span>( !noContent() && mAccount->hasACLSupport() ) { <a name="l01181"></a>01181 newState( mProgress, i18n( <span class="stringliteral">"Retrieving permissions"</span> ) ); <a name="l01182"></a>01182 mAccount->getACL( folder(), mImapPath ); <a name="l01183"></a>01183 connect( mAccount, SIGNAL(receivedACL( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, KIO::Job*, <span class="keyword">const</span> KMail::ACLList& )), <a name="l01184"></a>01184 <span class="keyword">this</span>, SLOT(slotReceivedACL( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, KIO::Job*, <span class="keyword">const</span> KMail::ACLList& )) ); <a name="l01185"></a>01185 <span class="keywordflow">break</span>; <a name="l01186"></a>01186 } <a name="l01187"></a>01187 <span class="keywordflow">case</span> SYNC_STATE_GET_QUOTA: <a name="l01188"></a>01188 <span class="comment">// Continue with the subfolders</span> <a name="l01189"></a>01189 mSyncState = SYNC_STATE_FIND_SUBFOLDERS; <a name="l01190"></a>01190 <span class="keywordflow">if</span>( !noContent() && mAccount->hasQuotaSupport() ) { <a name="l01191"></a>01191 newState( mProgress, i18n(<span class="stringliteral">"Getting quota information"</span>)); <a name="l01192"></a>01192 KURL url = mAccount->getUrl(); <a name="l01193"></a>01193 url.setPath( imapPath() ); <a name="l01194"></a>01194 KIO::Job* job = <a class="code" href="namespaceKMail_1_1QuotaJobs.html#ab3cde319252d41c525f3585463b29a8" title="Get the storage quota for a mailbox, if there is one.">KMail::QuotaJobs::getStorageQuota</a>( mAccount->slave(), url ); <a name="l01195"></a>01195 <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a> jd( url.url(), folder() ); <a name="l01196"></a>01196 mAccount->insertJob(job, jd); <a name="l01197"></a>01197 connect( job, SIGNAL( storageQuotaResult( <span class="keyword">const</span> QuotaInfo& ) ), <a name="l01198"></a>01198 SLOT( slotStorageQuotaResult( <span class="keyword">const</span> QuotaInfo& ) ) ); <a name="l01199"></a>01199 connect( job, SIGNAL(result(KIO::Job *)), <a name="l01200"></a>01200 SLOT(slotQuotaResult(KIO::Job *)) ); <a name="l01201"></a>01201 <span class="keywordflow">break</span>; <a name="l01202"></a>01202 } <a name="l01203"></a>01203 <span class="keywordflow">case</span> SYNC_STATE_FIND_SUBFOLDERS: <a name="l01204"></a>01204 { <a name="l01205"></a>01205 mProgress = 98; <a name="l01206"></a>01206 newState( mProgress, i18n(<span class="stringliteral">"Updating cache file"</span>)); <a name="l01207"></a>01207 <a name="l01208"></a>01208 mSyncState = SYNC_STATE_SYNC_SUBFOLDERS; <a name="l01209"></a>01209 mSubfoldersForSync.clear(); <a name="l01210"></a>01210 mCurrentSubfolder = 0; <a name="l01211"></a>01211 <span class="keywordflow">if</span>( folder() && folder()->child() ) { <a name="l01212"></a>01212 KMFolderNode *node = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->first(); <a name="l01213"></a>01213 <span class="keywordflow">while</span>( node ) { <a name="l01214"></a>01214 <span class="keywordflow">if</span>( !node->isDir() ) { <a name="l01215"></a>01215 KMFolderCachedImap* storage = <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(<span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node)->storage()); <a name="l01216"></a>01216 <span class="comment">// Only sync folders that have been accepted by the server</span> <a name="l01217"></a>01217 <span class="keywordflow">if</span> ( !storage->imapPath().isEmpty() <a name="l01218"></a>01218 <span class="comment">// and that were not just deleted from it</span> <a name="l01219"></a>01219 && !foldersForDeletionOnServer.contains( storage->imapPath() ) ) { <a name="l01220"></a>01220 mSubfoldersForSync << storage; <a name="l01221"></a>01221 } <span class="keywordflow">else</span> { <a name="l01222"></a>01222 kdDebug(5006) << <span class="stringliteral">"Do not add "</span> << storage-><a class="code" href="classKMFolderDir.html#d6570b9871299028d167659db50b01bd" title="Returns the label of the folder for visualization.">label</a>() <a name="l01223"></a>01223 << <span class="stringliteral">" to synclist"</span> << endl; <a name="l01224"></a>01224 } <a name="l01225"></a>01225 } <a name="l01226"></a>01226 node = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->next(); <a name="l01227"></a>01227 } <a name="l01228"></a>01228 } <a name="l01229"></a>01229 <a name="l01230"></a>01230 <span class="comment">// All done for this folder.</span> <a name="l01231"></a>01231 mProgress = 100; <span class="comment">// all done</span> <a name="l01232"></a>01232 newState( mProgress, i18n(<span class="stringliteral">"Synchronization done"</span>)); <a name="l01233"></a>01233 KURL url = mAccount->getUrl(); <a name="l01234"></a>01234 url.setPath( imapPath() ); <a name="l01235"></a>01235 kmkernel->iCalIface().folderSynced( folder(), url ); <a name="l01236"></a>01236 } <a name="l01237"></a>01237 <a name="l01238"></a>01238 <span class="keywordflow">if</span> ( !mRecurse ) <span class="comment">// "check mail for this folder" only</span> <a name="l01239"></a>01239 mSubfoldersForSync.clear(); <a name="l01240"></a>01240 <a name="l01241"></a>01241 <span class="comment">// Carry on</span> <a name="l01242"></a>01242 <span class="keywordflow">case</span> SYNC_STATE_SYNC_SUBFOLDERS: <a name="l01243"></a>01243 { <a name="l01244"></a>01244 <span class="keywordflow">if</span>( mCurrentSubfolder ) { <a name="l01245"></a>01245 disconnect( mCurrentSubfolder, SIGNAL( folderComplete(KMFolderCachedImap*, <span class="keywordtype">bool</span>) ), <a name="l01246"></a>01246 <span class="keyword">this</span>, SLOT( slotSubFolderComplete(KMFolderCachedImap*, <span class="keywordtype">bool</span>) ) ); <a name="l01247"></a>01247 mCurrentSubfolder = 0; <a name="l01248"></a>01248 } <a name="l01249"></a>01249 <a name="l01250"></a>01250 <span class="keywordflow">if</span>( mSubfoldersForSync.isEmpty() ) { <a name="l01251"></a>01251 mSyncState = SYNC_STATE_INITIAL; <a name="l01252"></a>01252 mAccount->addUnreadMsgCount( <span class="keyword">this</span>, countUnread() ); <span class="comment">// before closing</span> <a name="l01253"></a>01253 close(<span class="stringliteral">"cachedimap"</span>); <a name="l01254"></a>01254 emit folderComplete( <span class="keyword">this</span>, <span class="keyword">true</span> ); <a name="l01255"></a>01255 } <span class="keywordflow">else</span> { <a name="l01256"></a>01256 mCurrentSubfolder = mSubfoldersForSync.front(); <a name="l01257"></a>01257 mSubfoldersForSync.pop_front(); <a name="l01258"></a>01258 connect( mCurrentSubfolder, SIGNAL( folderComplete(KMFolderCachedImap*, <span class="keywordtype">bool</span>) ), <a name="l01259"></a>01259 <span class="keyword">this</span>, SLOT( slotSubFolderComplete(KMFolderCachedImap*, <span class="keywordtype">bool</span>) ) ); <a name="l01260"></a>01260 <a name="l01261"></a>01261 <span class="comment">//kdDebug(5006) << "Sync'ing subfolder " << mCurrentSubfolder->imapPath() << endl;</span> <a name="l01262"></a>01262 assert( !mCurrentSubfolder->imapPath().isEmpty() ); <a name="l01263"></a>01263 mCurrentSubfolder->setAccount( account() ); <a name="l01264"></a>01264 <span class="keywordtype">bool</span> recurse = mCurrentSubfolder->noChildren() ? <span class="keyword">false</span> : <span class="keyword">true</span>; <a name="l01265"></a>01265 mCurrentSubfolder->serverSync( recurse ); <a name="l01266"></a>01266 } <a name="l01267"></a>01267 } <a name="l01268"></a>01268 <span class="keywordflow">break</span>; <a name="l01269"></a>01269 <a name="l01270"></a>01270 <span class="keywordflow">default</span>: <a name="l01271"></a>01271 kdDebug(5006) << <span class="stringliteral">"KMFolderCachedImap::serverSyncInternal() WARNING: no such state "</span> <a name="l01272"></a>01272 << mSyncState << endl; <a name="l01273"></a>01273 } <a name="l01274"></a>01274 } <a name="l01275"></a>01275 <a name="l01276"></a>01276 <span class="comment">/* Connected to the imap account's connectionResult signal.</span> <a name="l01277"></a>01277 <span class="comment"> Emitted when the slave connected or failed to connect.</span> <a name="l01278"></a>01278 <span class="comment">*/</span> <a name="l01279"></a>01279 <span class="keywordtype">void</span> KMFolderCachedImap::slotConnectionResult( <span class="keywordtype">int</span> errorCode, <span class="keyword">const</span> QString& errorMsg ) <a name="l01280"></a>01280 { <a name="l01281"></a>01281 disconnect( mAccount, SIGNAL( connectionResult(<span class="keywordtype">int</span>, <span class="keyword">const</span> QString&) ), <a name="l01282"></a>01282 <span class="keyword">this</span>, SLOT( slotConnectionResult(<span class="keywordtype">int</span>, <span class="keyword">const</span> QString&) ) ); <a name="l01283"></a>01283 <span class="keywordflow">if</span> ( !errorCode ) { <a name="l01284"></a>01284 <span class="comment">// Success</span> <a name="l01285"></a>01285 mSyncState = SYNC_STATE_GET_USERRIGHTS; <a name="l01286"></a>01286 mProgress += 5; <a name="l01287"></a>01287 serverSyncInternal(); <a name="l01288"></a>01288 } <span class="keywordflow">else</span> { <a name="l01289"></a>01289 <span class="comment">// Error (error message already shown by the account)</span> <a name="l01290"></a>01290 newState( mProgress, KIO::buildErrorString( errorCode, errorMsg )); <a name="l01291"></a>01291 emit folderComplete(<span class="keyword">this</span>, <span class="keyword">false</span>); <a name="l01292"></a>01292 } <a name="l01293"></a>01293 } <a name="l01294"></a>01294 <a name="l01295"></a>01295 <span class="comment">/* find new messages (messages without a UID) */</span> <a name="l01296"></a>01296 QValueList<unsigned long> KMFolderCachedImap::findNewMessages() <a name="l01297"></a>01297 { <a name="l01298"></a>01298 QValueList<unsigned long> result; <a name="l01299"></a>01299 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < count(); ++i ) { <a name="l01300"></a>01300 KMMsgBase *msg = getMsgBase( i ); <a name="l01301"></a>01301 <span class="keywordflow">if</span>( !msg ) <span class="keywordflow">continue</span>; <span class="comment">/* what goes on if getMsg() returns 0? */</span> <a name="l01302"></a>01302 <span class="keywordflow">if</span> ( msg->UID() == 0 ) <a name="l01303"></a>01303 result.append( msg->getMsgSerNum() ); <a name="l01304"></a>01304 } <a name="l01305"></a>01305 <span class="keywordflow">return</span> result; <a name="l01306"></a>01306 } <a name="l01307"></a>01307 <a name="l01308"></a>01308 <span class="comment">/* Upload new messages to server */</span> <a name="l01309"></a>01309 <span class="keywordtype">void</span> KMFolderCachedImap::uploadNewMessages() <a name="l01310"></a>01310 { <a name="l01311"></a>01311 QValueList<unsigned long> newMsgs = findNewMessages(); <a name="l01312"></a>01312 <span class="keywordflow">if</span>( !newMsgs.isEmpty() ) { <a name="l01313"></a>01313 <span class="keywordflow">if</span> ( mUserRights <= 0 || ( mUserRights & ( KMail::ACLJobs::Insert ) ) ) { <a name="l01314"></a>01314 newState( mProgress, i18n(<span class="stringliteral">"Uploading messages to server"</span>)); <a name="l01315"></a>01315 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( newMsgs, CachedImapJob::tPutMessage, <span class="keyword">this</span> ); <a name="l01316"></a>01316 connect( job, SIGNAL( progress( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) ), <a name="l01317"></a>01317 <span class="keyword">this</span>, SLOT( slotPutProgress(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) ) ); <a name="l01318"></a>01318 connect( job, SIGNAL( finished() ), <span class="keyword">this</span>, SLOT( serverSyncInternal() ) ); <a name="l01319"></a>01319 job->start(); <a name="l01320"></a>01320 <span class="keywordflow">return</span>; <a name="l01321"></a>01321 } <span class="keywordflow">else</span> { <a name="l01322"></a>01322 KMCommand *command = rescueUnsyncedMessages(); <a name="l01323"></a>01323 connect( command, SIGNAL( completed( KMCommand * ) ), <a name="l01324"></a>01324 <span class="keyword">this</span>, SLOT( serverSyncInternal() ) ); <a name="l01325"></a>01325 } <a name="l01326"></a>01326 } <span class="keywordflow">else</span> { <span class="comment">// nothing to upload</span> <a name="l01327"></a>01327 <span class="keywordflow">if</span> ( mUserRights != mOldUserRights && (mOldUserRights & KMail::ACLJobs::Insert) <a name="l01328"></a>01328 && !(mUserRights & KMail::ACLJobs::Insert) ) { <a name="l01329"></a>01329 <span class="comment">// write access revoked</span> <a name="l01330"></a>01330 KMessageBox::information( 0, i18n(<span class="stringliteral">"<p>Your access rights to folder <b>%1</b> have been restricted, "</span> <a name="l01331"></a>01331 <span class="stringliteral">"it will no longer be possible to add messages to this folder.</p>"</span>).arg( folder()->prettyURL() ), <a name="l01332"></a>01332 i18n(<span class="stringliteral">"Acces rights revoked"</span>), <span class="stringliteral">"KMailACLRevocationNotification"</span> ); <a name="l01333"></a>01333 } <a name="l01334"></a>01334 } <a name="l01335"></a>01335 newState( mProgress, i18n(<span class="stringliteral">"No messages to upload to server"</span>)); <a name="l01336"></a>01336 serverSyncInternal(); <a name="l01337"></a>01337 } <a name="l01338"></a>01338 <a name="l01339"></a>01339 <span class="comment">/* Progress info during uploadNewMessages */</span> <a name="l01340"></a>01340 <span class="keywordtype">void</span> KMFolderCachedImap::slotPutProgress( <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> done, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> total ) <a name="l01341"></a>01341 { <a name="l01342"></a>01342 <span class="comment">// (going from mProgress to mProgress+10)</span> <a name="l01343"></a>01343 <span class="keywordtype">int</span> progressSpan = 10; <a name="l01344"></a>01344 newState( mProgress + (progressSpan * done) / total, QString::null ); <a name="l01345"></a>01345 <span class="keywordflow">if</span> ( done == total ) <span class="comment">// we're done</span> <a name="l01346"></a>01346 mProgress += progressSpan; <a name="l01347"></a>01347 } <a name="l01348"></a>01348 <a name="l01349"></a>01349 <span class="comment">/* Upload message flags to server */</span> <a name="l01350"></a>01350 <span class="keywordtype">void</span> KMFolderCachedImap::uploadFlags() <a name="l01351"></a>01351 { <a name="l01352"></a>01352 <span class="keywordflow">if</span> ( !uidMap.isEmpty() ) { <a name="l01353"></a>01353 mStatusFlagsJobs = 0; <a name="l01354"></a>01354 newState( mProgress, i18n(<span class="stringliteral">"Uploading status of messages to server"</span>)); <a name="l01355"></a>01355 <a name="l01356"></a>01356 <span class="comment">// FIXME DUPLICATED FROM KMFOLDERIMAP</span> <a name="l01357"></a>01357 QMap< QString, QStringList > groups; <a name="l01358"></a>01358 <span class="comment">//open(); //already done</span> <a name="l01359"></a>01359 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < count(); ++i ) { <a name="l01360"></a>01360 KMMsgBase* msg = getMsgBase( i ); <a name="l01361"></a>01361 <span class="keywordflow">if</span>( !msg || msg->UID() == 0 ) <a name="l01362"></a>01362 <span class="comment">// Either not a valid message or not one that is on the server yet</span> <a name="l01363"></a>01363 <span class="keywordflow">continue</span>; <a name="l01364"></a>01364 <a name="l01365"></a>01365 QString flags = KMFolderImap::statusToFlags(msg->status(), mPermanentFlags); <a name="l01366"></a>01366 <span class="comment">// Collect uids for each typem of flags.</span> <a name="l01367"></a>01367 QString uid; <a name="l01368"></a>01368 uid.setNum( msg->UID() ); <a name="l01369"></a>01369 groups[flags].append(uid); <a name="l01370"></a>01370 } <a name="l01371"></a>01371 QMapIterator< QString, QStringList > dit; <a name="l01372"></a>01372 <span class="keywordflow">for</span>( dit = groups.begin(); dit != groups.end(); ++dit ) { <a name="l01373"></a>01373 QCString flags = dit.key().latin1(); <a name="l01374"></a>01374 QStringList sets = KMFolderImap::makeSets( (*dit), <span class="keyword">true</span> ); <a name="l01375"></a>01375 mStatusFlagsJobs += sets.count(); <span class="comment">// ### that's not in kmfolderimap....</span> <a name="l01376"></a>01376 <span class="comment">// Send off a status setting job for each set.</span> <a name="l01377"></a>01377 <span class="keywordflow">for</span>( QStringList::Iterator slit = sets.begin(); slit != sets.end(); ++slit ) { <a name="l01378"></a>01378 QString imappath = imapPath() + <span class="stringliteral">";UID="</span> + ( *slit ); <a name="l01379"></a>01379 mAccount->setImapStatus(folder(), imappath, flags); <a name="l01380"></a>01380 } <a name="l01381"></a>01381 } <a name="l01382"></a>01382 <span class="comment">// FIXME END DUPLICATED FROM KMFOLDERIMAP</span> <a name="l01383"></a>01383 <a name="l01384"></a>01384 <span class="keywordflow">if</span> ( mStatusFlagsJobs ) { <a name="l01385"></a>01385 connect( mAccount, SIGNAL( imapStatusChanged(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>) ), <a name="l01386"></a>01386 <span class="keyword">this</span>, SLOT( slotImapStatusChanged(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>) ) ); <a name="l01387"></a>01387 <span class="keywordflow">return</span>; <a name="l01388"></a>01388 } <a name="l01389"></a>01389 } <a name="l01390"></a>01390 newState( mProgress, i18n(<span class="stringliteral">"No messages to upload to server"</span>)); <a name="l01391"></a>01391 serverSyncInternal(); <a name="l01392"></a>01392 } <a name="l01393"></a>01393 <a name="l01394"></a>01394 <span class="keywordtype">void</span> KMFolderCachedImap::uploadSeenFlags() <a name="l01395"></a>01395 { <a name="l01396"></a>01396 <span class="keywordflow">if</span> ( !uidMap.isEmpty() ) { <a name="l01397"></a>01397 mStatusFlagsJobs = 0; <a name="l01398"></a>01398 newState( mProgress, i18n(<span class="stringliteral">"Uploading status of messages to server"</span>)); <a name="l01399"></a>01399 <a name="l01400"></a>01400 QValueList<ulong> seenUids, unseenUids; <a name="l01401"></a>01401 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < count(); ++i ) { <a name="l01402"></a>01402 KMMsgBase* msg = getMsgBase( i ); <a name="l01403"></a>01403 <span class="keywordflow">if</span>( !msg || msg->UID() == 0 ) <a name="l01404"></a>01404 <span class="comment">// Either not a valid message or not one that is on the server yet</span> <a name="l01405"></a>01405 <span class="keywordflow">continue</span>; <a name="l01406"></a>01406 <a name="l01407"></a>01407 <span class="keywordflow">if</span> ( msg->status() & KMMsgStatusOld || msg->status() & KMMsgStatusRead ) <a name="l01408"></a>01408 seenUids.append( msg->UID() ); <a name="l01409"></a>01409 <span class="keywordflow">else</span> <a name="l01410"></a>01410 unseenUids.append( msg->UID() ); <a name="l01411"></a>01411 } <a name="l01412"></a>01412 <span class="keywordflow">if</span> ( !seenUids.isEmpty() ) { <a name="l01413"></a>01413 QStringList sets = KMFolderImap::makeSets( seenUids, <span class="keyword">true</span> ); <a name="l01414"></a>01414 mStatusFlagsJobs += sets.count(); <a name="l01415"></a>01415 <span class="keywordflow">for</span>( QStringList::Iterator it = sets.begin(); it != sets.end(); ++it ) { <a name="l01416"></a>01416 QString imappath = imapPath() + <span class="stringliteral">";UID="</span> + ( *it ); <a name="l01417"></a>01417 mAccount->setImapSeenStatus( folder(), imappath, <span class="keyword">true</span> ); <a name="l01418"></a>01418 } <a name="l01419"></a>01419 } <a name="l01420"></a>01420 <span class="keywordflow">if</span> ( !unseenUids.isEmpty() ) { <a name="l01421"></a>01421 QStringList sets = KMFolderImap::makeSets( unseenUids, <span class="keyword">true</span> ); <a name="l01422"></a>01422 mStatusFlagsJobs += sets.count(); <a name="l01423"></a>01423 <span class="keywordflow">for</span>( QStringList::Iterator it = sets.begin(); it != sets.end(); ++it ) { <a name="l01424"></a>01424 QString imappath = imapPath() + <span class="stringliteral">";UID="</span> + ( *it ); <a name="l01425"></a>01425 mAccount->setImapSeenStatus( folder(), imappath, <span class="keyword">false</span> ); <a name="l01426"></a>01426 } <a name="l01427"></a>01427 } <a name="l01428"></a>01428 <a name="l01429"></a>01429 <span class="keywordflow">if</span> ( mStatusFlagsJobs ) { <a name="l01430"></a>01430 connect( mAccount, SIGNAL( imapStatusChanged(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>) ), <a name="l01431"></a>01431 <span class="keyword">this</span>, SLOT( slotImapStatusChanged(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>) ) ); <a name="l01432"></a>01432 <span class="keywordflow">return</span>; <a name="l01433"></a>01433 } <a name="l01434"></a>01434 } <a name="l01435"></a>01435 newState( mProgress, i18n(<span class="stringliteral">"No messages to upload to server"</span>)); <a name="l01436"></a>01436 serverSyncInternal(); <a name="l01437"></a>01437 } <a name="l01438"></a>01438 <a name="l01439"></a>01439 <span class="keywordtype">void</span> KMFolderCachedImap::slotImapStatusChanged(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* folder, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span> cont) <a name="l01440"></a>01440 { <a name="l01441"></a>01441 <span class="keywordflow">if</span> ( mSyncState == SYNC_STATE_INITIAL ){ <a name="l01442"></a>01442 <span class="comment">//kdDebug(5006) << "IMAP status changed but reset " << endl;</span> <a name="l01443"></a>01443 <span class="keywordflow">return</span>; <span class="comment">// we were reset</span> <a name="l01444"></a>01444 } <a name="l01445"></a>01445 <span class="comment">//kdDebug(5006) << "IMAP status changed for folder: " << folder->prettyURL() << endl;</span> <a name="l01446"></a>01446 <span class="keywordflow">if</span> ( folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() == this ) { <a name="l01447"></a>01447 --mStatusFlagsJobs; <a name="l01448"></a>01448 <span class="keywordflow">if</span> ( mStatusFlagsJobs == 0 || !cont ) <span class="comment">// done or aborting</span> <a name="l01449"></a>01449 disconnect( mAccount, SIGNAL( imapStatusChanged(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>) ), <a name="l01450"></a>01450 <span class="keyword">this</span>, SLOT( slotImapStatusChanged(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, <span class="keyword">const</span> QString&, <span class="keywordtype">bool</span>) ) ); <a name="l01451"></a>01451 <span class="keywordflow">if</span> ( mStatusFlagsJobs == 0 && cont ) { <a name="l01452"></a>01452 mProgress += 5; <a name="l01453"></a>01453 serverSyncInternal(); <a name="l01454"></a>01454 <span class="comment">//kdDebug(5006) << "Proceeding with mailcheck." << endl;</span> <a name="l01455"></a>01455 } <a name="l01456"></a>01456 } <a name="l01457"></a>01457 } <a name="l01458"></a>01458 <a name="l01459"></a>01459 <span class="comment">// This is not perfect, what if the status didn't really change? Oh well ...</span> <a name="l01460"></a>01460 <span class="keywordtype">void</span> KMFolderCachedImap::setStatus( <span class="keywordtype">int</span> idx, KMMsgStatus status, <span class="keywordtype">bool</span> toggle) <a name="l01461"></a>01461 { <a name="l01462"></a>01462 <a class="code" href="classFolderStorage.html#747c716fefce2a19bda2802c4cacb972" title="Set the status of the message at index idx to status.">KMFolderMaildir::setStatus</a>( idx, status, toggle ); <a name="l01463"></a>01463 mStatusChangedLocally = <span class="keyword">true</span>; <a name="l01464"></a>01464 } <a name="l01465"></a>01465 <a name="l01466"></a>01466 <span class="keywordtype">void</span> KMFolderCachedImap::setStatus(QValueList<int>& ids, KMMsgStatus status, <span class="keywordtype">bool</span> toggle) <a name="l01467"></a>01467 { <a name="l01468"></a>01468 <a class="code" href="classFolderStorage.html#747c716fefce2a19bda2802c4cacb972" title="Set the status of the message at index idx to status.">KMFolderMaildir::setStatus</a>(ids, status, toggle); <a name="l01469"></a>01469 mStatusChangedLocally = <span class="keyword">true</span>; <a name="l01470"></a>01470 } <a name="l01471"></a>01471 <a name="l01472"></a>01472 <span class="comment">/* Upload new folders to server */</span> <a name="l01473"></a>01473 <span class="keywordtype">void</span> KMFolderCachedImap::createNewFolders() <a name="l01474"></a>01474 { <a name="l01475"></a>01475 QValueList<KMFolderCachedImap*> newFolders = findNewFolders(); <a name="l01476"></a>01476 <span class="comment">//kdDebug(5006) << label() << " createNewFolders:" << newFolders.count() << " new folders." << endl;</span> <a name="l01477"></a>01477 <span class="keywordflow">if</span>( !newFolders.isEmpty() ) { <a name="l01478"></a>01478 newState( mProgress, i18n(<span class="stringliteral">"Creating subfolders on server"</span>)); <a name="l01479"></a>01479 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( newFolders, CachedImapJob::tAddSubfolders, <span class="keyword">this</span> ); <a name="l01480"></a>01480 connect( job, SIGNAL( result(KMail::FolderJob *) ), <span class="keyword">this</span>, SLOT( slotIncreaseProgress() ) ); <a name="l01481"></a>01481 connect( job, SIGNAL( finished() ), <span class="keyword">this</span>, SLOT( serverSyncInternal() ) ); <a name="l01482"></a>01482 job->start(); <a name="l01483"></a>01483 } <span class="keywordflow">else</span> { <a name="l01484"></a>01484 serverSyncInternal(); <a name="l01485"></a>01485 } <a name="l01486"></a>01486 } <a name="l01487"></a>01487 <a name="l01488"></a>01488 QValueList<KMFolderCachedImap*> KMFolderCachedImap::findNewFolders() <a name="l01489"></a>01489 { <a name="l01490"></a>01490 QValueList<KMFolderCachedImap*> newFolders; <a name="l01491"></a>01491 <span class="keywordflow">if</span>( folder() && folder()->child() ) { <a name="l01492"></a>01492 KMFolderNode *node = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->first(); <a name="l01493"></a>01493 <span class="keywordflow">while</span>( node ) { <a name="l01494"></a>01494 <span class="keywordflow">if</span>( !node->isDir() ) { <a name="l01495"></a>01495 <span class="keywordflow">if</span>( static_cast<KMFolder*>(node)->folderType() != KMFolderTypeCachedImap ) { <a name="l01496"></a>01496 kdError(5006) << <span class="stringliteral">"KMFolderCachedImap::findNewFolders(): ARGH!!! "</span> <a name="l01497"></a>01497 << node->name() << <span class="stringliteral">" is not an IMAP folder\n"</span>; <a name="l01498"></a>01498 node = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->next(); <a name="l01499"></a>01499 assert(0); <a name="l01500"></a>01500 } <a name="l01501"></a>01501 KMFolderCachedImap* folder = <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(<span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node)->storage()); <a name="l01502"></a>01502 <span class="keywordflow">if</span>( folder->imapPath().isEmpty() ) { <a name="l01503"></a>01503 newFolders << folder; <a name="l01504"></a>01504 } <a name="l01505"></a>01505 } <a name="l01506"></a>01506 node = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->next(); <a name="l01507"></a>01507 } <a name="l01508"></a>01508 } <a name="l01509"></a>01509 <span class="keywordflow">return</span> newFolders; <a name="l01510"></a>01510 } <a name="l01511"></a>01511 <a name="l01512"></a>01512 <span class="keywordtype">bool</span> KMFolderCachedImap::deleteMessages() <a name="l01513"></a>01513 { <a name="l01514"></a>01514 <span class="comment">/* Delete messages from cache that are gone from the server */</span> <a name="l01515"></a>01515 QPtrList<KMMessage> msgsForDeletion; <a name="l01516"></a>01516 <a name="l01517"></a>01517 <span class="comment">// It is not possible to just go over all indices and remove</span> <a name="l01518"></a>01518 <span class="comment">// them one by one because the index list can get resized under</span> <a name="l01519"></a>01519 <span class="comment">// us. So use msg pointers instead</span> <a name="l01520"></a>01520 <a name="l01521"></a>01521 QStringList uids; <a name="l01522"></a>01522 QMap<ulong,int>::const_iterator it = uidMap.constBegin(); <a name="l01523"></a>01523 <span class="keywordflow">for</span>( ; it != uidMap.end(); it++ ) { <a name="l01524"></a>01524 ulong uid ( it.key() ); <a name="l01525"></a>01525 <span class="keywordflow">if</span>( uid!=0 && !uidsOnServer.find( uid ) ) { <a name="l01526"></a>01526 uids << QString::number( uid ); <a name="l01527"></a>01527 msgsForDeletion.append( getMsg( *it ) ); <a name="l01528"></a>01528 } <a name="l01529"></a>01529 } <a name="l01530"></a>01530 <a name="l01531"></a>01531 <span class="keywordflow">if</span>( !msgsForDeletion.isEmpty() ) { <a name="l01532"></a>01532 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l01533"></a>01533 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( KMessageBox::warningYesNo( <a name="l01534"></a>01534 0, i18n( <span class="stringliteral">"<qt><p>Mails on the server in folder <b>%1</b> were deleted. "</span> <a name="l01535"></a>01535 <span class="stringliteral">"Do you want to delete them locally?<br>UIDs: %2</p></qt>"</span> ) <a name="l01536"></a>01536 .arg( folder()->prettyURL() ).arg( uids.join(<span class="stringliteral">","</span>) ) ) == KMessageBox::Yes ) <a name="l01537"></a>01537 #endif <a name="l01538"></a>01538 removeMsg( msgsForDeletion ); <a name="l01539"></a>01539 } <a name="l01540"></a>01540 <a name="l01541"></a>01541 <span class="keywordflow">if</span> ( mUserRights > 0 && !( mUserRights & KMail::ACLJobs::Delete ) ) <a name="l01542"></a>01542 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01543"></a>01543 <a name="l01544"></a>01544 <span class="comment">/* Delete messages from the server that we dont have anymore */</span> <a name="l01545"></a>01545 <span class="keywordflow">if</span>( !uidsForDeletionOnServer.isEmpty() ) { <a name="l01546"></a>01546 newState( mProgress, i18n(<span class="stringliteral">"Deleting removed messages from server"</span>)); <a name="l01547"></a>01547 QStringList sets = KMFolderImap::makeSets( uidsForDeletionOnServer, <span class="keyword">true</span> ); <a name="l01548"></a>01548 uidsForDeletionOnServer.clear(); <a name="l01549"></a>01549 kdDebug(5006) << <span class="stringliteral">"Deleting "</span> << sets.count() << <span class="stringliteral">" sets of messages from server folder "</span> << imapPath() << endl; <a name="l01550"></a>01550 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( sets, CachedImapJob::tDeleteMessage, <span class="keyword">this</span> ); <a name="l01551"></a>01551 connect( job, SIGNAL( result(KMail::FolderJob *) ), <a name="l01552"></a>01552 <span class="keyword">this</span>, SLOT( slotDeleteMessagesResult(KMail::FolderJob *) ) ); <a name="l01553"></a>01553 job->start(); <a name="l01554"></a>01554 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01555"></a>01555 } <span class="keywordflow">else</span> { <a name="l01556"></a>01556 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01557"></a>01557 } <a name="l01558"></a>01558 } <a name="l01559"></a>01559 <a name="l01560"></a>01560 <span class="keywordtype">void</span> KMFolderCachedImap::slotDeleteMessagesResult( KMail::FolderJob* job ) <a name="l01561"></a>01561 { <a name="l01562"></a>01562 <span class="keywordflow">if</span> ( job->error() ) { <a name="l01563"></a>01563 <span class="comment">// Skip the EXPUNGE state if deleting didn't work, no need to show two error messages</span> <a name="l01564"></a>01564 mSyncState = SYNC_STATE_GET_MESSAGES; <a name="l01565"></a>01565 } <span class="keywordflow">else</span> { <a name="l01566"></a>01566 <span class="comment">// deleting on the server went fine, clear the pending deletions cache</span> <a name="l01567"></a>01567 mDeletedUIDsSinceLastSync.clear(); <a name="l01568"></a>01568 } <a name="l01569"></a>01569 mProgress += 10; <a name="l01570"></a>01570 serverSyncInternal(); <a name="l01571"></a>01571 } <a name="l01572"></a>01572 <a name="l01573"></a>01573 <span class="keywordtype">void</span> KMFolderCachedImap::checkUidValidity() { <a name="l01574"></a>01574 <span class="comment">// IMAP root folders don't seem to have a UID validity setting.</span> <a name="l01575"></a>01575 <span class="comment">// Also, don't try the uid validity on new folders</span> <a name="l01576"></a>01576 <span class="keywordflow">if</span>( imapPath().isEmpty() || imapPath() == <span class="stringliteral">"/"</span> ) <a name="l01577"></a>01577 <span class="comment">// Just proceed</span> <a name="l01578"></a>01578 serverSyncInternal(); <a name="l01579"></a>01579 <span class="keywordflow">else</span> { <a name="l01580"></a>01580 newState( mProgress, i18n(<span class="stringliteral">"Checking folder validity"</span>)); <a name="l01581"></a>01581 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( FolderJob::tCheckUidValidity, <span class="keyword">this</span> ); <a name="l01582"></a>01582 connect( job, SIGNAL(permanentFlags(<span class="keywordtype">int</span>)), SLOT(slotPermanentFlags(<span class="keywordtype">int</span>)) ); <a name="l01583"></a>01583 connect( job, SIGNAL( result( KMail::FolderJob* ) ), <a name="l01584"></a>01584 <span class="keyword">this</span>, SLOT( slotCheckUidValidityResult( KMail::FolderJob* ) ) ); <a name="l01585"></a>01585 job->start(); <a name="l01586"></a>01586 } <a name="l01587"></a>01587 } <a name="l01588"></a>01588 <a name="l01589"></a>01589 <span class="keywordtype">void</span> KMFolderCachedImap::slotCheckUidValidityResult( KMail::FolderJob* job ) <a name="l01590"></a>01590 { <a name="l01591"></a>01591 <span class="keywordflow">if</span> ( job->error() ) { <span class="comment">// there was an error and the user chose "continue"</span> <a name="l01592"></a>01592 <span class="comment">// We can't continue doing anything in the same folder though, it would delete all mails.</span> <a name="l01593"></a>01593 <span class="comment">// But we can continue to subfolders if any. Well we can also try annotation/acl stuff...</span> <a name="l01594"></a>01594 mSyncState = SYNC_STATE_HANDLE_INBOX; <a name="l01595"></a>01595 } <a name="l01596"></a>01596 mProgress += 5; <a name="l01597"></a>01597 serverSyncInternal(); <a name="l01598"></a>01598 } <a name="l01599"></a>01599 <a name="l01600"></a>01600 <span class="keywordtype">void</span> KMFolderCachedImap::slotPermanentFlags(<span class="keywordtype">int</span> flags) <a name="l01601"></a>01601 { <a name="l01602"></a>01602 mPermanentFlags = flags; <a name="l01603"></a>01603 } <a name="l01604"></a>01604 <a name="l01605"></a>01605 <span class="comment">/* This will only list the messages in a folder.</span> <a name="l01606"></a>01606 <span class="comment"> No directory listing done*/</span> <a name="l01607"></a>01607 <span class="keywordtype">void</span> KMFolderCachedImap::listMessages() { <a name="l01608"></a>01608 <span class="keywordtype">bool</span> groupwareOnly = GlobalSettings::self()->showOnlyGroupwareFoldersForGroupwareAccount() <a name="l01609"></a>01609 && GlobalSettings::self()->theIMAPResourceAccount() == (int)mAccount->id() <a name="l01610"></a>01610 && folder()->isSystemFolder() <a name="l01611"></a>01611 && mImapPath == <span class="stringliteral">"/INBOX/"</span>; <a name="l01612"></a>01612 <span class="comment">// Don't list messages on the root folder, and skip the inbox, if this is</span> <a name="l01613"></a>01613 <span class="comment">// the inbox of a groupware-only dimap account</span> <a name="l01614"></a>01614 <span class="keywordflow">if</span>( imapPath() == <span class="stringliteral">"/"</span> || groupwareOnly ) { <a name="l01615"></a>01615 serverSyncInternal(); <a name="l01616"></a>01616 <span class="keywordflow">return</span>; <a name="l01617"></a>01617 } <a name="l01618"></a>01618 <a name="l01619"></a>01619 <span class="keywordflow">if</span>( !mAccount->slave() ) { <span class="comment">// sync aborted</span> <a name="l01620"></a>01620 resetSyncState(); <a name="l01621"></a>01621 emit folderComplete( <span class="keyword">this</span>, <span class="keyword">false</span> ); <a name="l01622"></a>01622 <span class="keywordflow">return</span>; <a name="l01623"></a>01623 } <a name="l01624"></a>01624 uidsOnServer.clear(); <a name="l01625"></a>01625 uidsOnServer.resize( count() * 2 ); <a name="l01626"></a>01626 uidsForDeletionOnServer.clear(); <a name="l01627"></a>01627 mMsgsForDownload.clear(); <a name="l01628"></a>01628 mUidsForDownload.clear(); <a name="l01629"></a>01629 <span class="comment">// listing is only considered successful if saw a syntactically correct imapdigest</span> <a name="l01630"></a>01630 mFoundAnIMAPDigest = <span class="keyword">false</span>; <a name="l01631"></a>01631 <a name="l01632"></a>01632 CachedImapJob* job = <span class="keyword">new</span> CachedImapJob( FolderJob::tListMessages, <span class="keyword">this</span> ); <a name="l01633"></a>01633 connect( job, SIGNAL( result(KMail::FolderJob *) ), <a name="l01634"></a>01634 <span class="keyword">this</span>, SLOT( slotGetLastMessagesResult(KMail::FolderJob *) ) ); <a name="l01635"></a>01635 job->start(); <a name="l01636"></a>01636 } <a name="l01637"></a>01637 <a name="l01638"></a>01638 <span class="keywordtype">void</span> KMFolderCachedImap::slotGetLastMessagesResult(KMail::FolderJob *job) <a name="l01639"></a>01639 { <a name="l01640"></a>01640 getMessagesResult(job, <span class="keyword">true</span>); <a name="l01641"></a>01641 } <a name="l01642"></a>01642 <a name="l01643"></a>01643 <span class="comment">// Connected to the listMessages job in CachedImapJob</span> <a name="l01644"></a>01644 <span class="keywordtype">void</span> KMFolderCachedImap::slotGetMessagesData(KIO::Job * job, <span class="keyword">const</span> QByteArray & data) <a name="l01645"></a>01645 { <a name="l01646"></a>01646 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l01647"></a>01647 <span class="keywordflow">if</span> ( it == mAccount->jobsEnd() ) { <span class="comment">// Shouldn't happen</span> <a name="l01648"></a>01648 kdDebug(5006) << <span class="stringliteral">"could not find job!?!?!"</span> << endl; <a name="l01649"></a>01649 <span class="comment">// be sure to reset the sync state, if the listing was partial we would</span> <a name="l01650"></a>01650 <span class="comment">// otherwise delete not-listed mail locally, and on the next sync on the server</span> <a name="l01651"></a>01651 <span class="comment">// as well</span> <a name="l01652"></a>01652 mSyncState = SYNC_STATE_HANDLE_INBOX; <a name="l01653"></a>01653 serverSyncInternal(); <span class="comment">/* HACK^W Fix: we should at least try to keep going */</span> <a name="l01654"></a>01654 <span class="keywordflow">return</span>; <a name="l01655"></a>01655 } <a name="l01656"></a>01656 (*it).cdata += QCString(data, data.size() + 1); <a name="l01657"></a>01657 <span class="keywordtype">int</span> pos = (*it).cdata.find(<span class="stringliteral">"\r\n--IMAPDIGEST"</span>); <a name="l01658"></a>01658 <span class="keywordflow">if</span> (pos > 0) { <a name="l01659"></a>01659 <span class="keywordtype">int</span> a = (*it).cdata.find(<span class="stringliteral">"\r\nX-uidValidity:"</span>); <a name="l01660"></a>01660 <span class="keywordflow">if</span> (a != -1) { <a name="l01661"></a>01661 <span class="keywordtype">int</span> b = (*it).cdata.find(<span class="stringliteral">"\r\n"</span>, a + 17); <a name="l01662"></a>01662 setUidValidity((*it).cdata.mid(a + 17, b - a - 17)); <a name="l01663"></a>01663 } <a name="l01664"></a>01664 a = (*it).cdata.find(<span class="stringliteral">"\r\nX-Access:"</span>); <a name="l01665"></a>01665 <span class="comment">// Only trust X-Access (i.e. the imap select info) if we don't know mUserRights.</span> <a name="l01666"></a>01666 <span class="comment">// The latter is more accurate (checked on every sync) whereas X-Access is only</span> <a name="l01667"></a>01667 <span class="comment">// updated when selecting the folder again, which might not happen if using</span> <a name="l01668"></a>01668 <span class="comment">// RMB / Check Mail in this folder. We don't need two (potentially conflicting)</span> <a name="l01669"></a>01669 <span class="comment">// sources for the readonly setting, in any case.</span> <a name="l01670"></a>01670 <span class="keywordflow">if</span> (a != -1 && mUserRights == -1 ) { <a name="l01671"></a>01671 <span class="keywordtype">int</span> b = (*it).cdata.find(<span class="stringliteral">"\r\n"</span>, a + 12); <a name="l01672"></a>01672 <span class="keyword">const</span> QString access = (*it).cdata.mid(a + 12, b - a - 12); <a name="l01673"></a>01673 setReadOnly( access == <span class="stringliteral">"Read only"</span> ); <a name="l01674"></a>01674 } <a name="l01675"></a>01675 (*it).cdata.remove(0, pos); <a name="l01676"></a>01676 mFoundAnIMAPDigest = <span class="keyword">true</span>; <a name="l01677"></a>01677 } <a name="l01678"></a>01678 pos = (*it).cdata.find(<span class="stringliteral">"\r\n--IMAPDIGEST"</span>, 1); <a name="l01679"></a>01679 <span class="comment">// Start with something largish when rebuilding the cache</span> <a name="l01680"></a>01680 <span class="keywordflow">if</span> ( uidsOnServer.size() == 0 ) <a name="l01681"></a>01681 uidsOnServer.resize( KMail::nextPrime( 2000 ) ); <a name="l01682"></a>01682 <span class="keyword">const</span> <span class="keywordtype">int</span> v = 42; <a name="l01683"></a>01683 <span class="keywordflow">while</span> (pos >= 0) { <a name="l01684"></a>01684 <span class="comment">/*</span> <a name="l01685"></a>01685 <span class="comment"> KMMessage msg;</span> <a name="l01686"></a>01686 <span class="comment"> msg.fromString((*it).cdata.mid(16, pos - 16));</span> <a name="l01687"></a>01687 <span class="comment"> const int flags = msg.headerField("X-Flags").toInt();</span> <a name="l01688"></a>01688 <span class="comment"> const ulong size = msg.headerField("X-Length").toULong();</span> <a name="l01689"></a>01689 <span class="comment"> const ulong uid = msg.UID();</span> <a name="l01690"></a>01690 <span class="comment"> */</span> <a name="l01691"></a>01691 <span class="comment">// The below is optimized for speed, not prettiness. The commented out chunk</span> <a name="l01692"></a>01692 <span class="comment">// above was the solution copied from kmfolderimap, and it's 15-20% slower.</span> <a name="l01693"></a>01693 <span class="keyword">const</span> QCString& entry( (*it).cdata ); <a name="l01694"></a>01694 <span class="keyword">const</span> <span class="keywordtype">int</span> indexOfUID = entry.find(<span class="stringliteral">"X-UID"</span>, 16); <a name="l01695"></a>01695 <span class="keyword">const</span> <span class="keywordtype">int</span> startOfUIDValue = indexOfUID + 7; <a name="l01696"></a>01696 <span class="keyword">const</span> <span class="keywordtype">int</span> indexOfLength = entry.find(<span class="stringliteral">"X-Length"</span>, startOfUIDValue ); <span class="comment">// we know length comes after UID</span> <a name="l01697"></a>01697 <span class="keyword">const</span> <span class="keywordtype">int</span> startOfLengthValue = indexOfLength + 10; <a name="l01698"></a>01698 <span class="keyword">const</span> <span class="keywordtype">int</span> indexOfFlags = entry.find(<span class="stringliteral">"X-Flags"</span>, startOfLengthValue ); <span class="comment">// we know flags comes last</span> <a name="l01699"></a>01699 <span class="keyword">const</span> <span class="keywordtype">int</span> startOfFlagsValue = indexOfFlags + 9; <a name="l01700"></a>01700 <a name="l01701"></a>01701 <span class="keyword">const</span> <span class="keywordtype">int</span> flags = entry.mid( startOfFlagsValue, entry.find( <span class="charliteral">'\r'</span>, startOfFlagsValue ) - startOfFlagsValue ).toInt(); <a name="l01702"></a>01702 <span class="keyword">const</span> ulong size = entry.mid( startOfLengthValue, entry.find( <span class="charliteral">'\r'</span>, startOfLengthValue ) - startOfLengthValue ).toULong(); <a name="l01703"></a>01703 <span class="keyword">const</span> ulong uid = entry.mid( startOfUIDValue, entry.find( <span class="charliteral">'\r'</span>, startOfUIDValue ) - startOfUIDValue ).toULong(); <a name="l01704"></a>01704 <a name="l01705"></a>01705 <span class="keyword">const</span> <span class="keywordtype">bool</span> deleted = ( flags & 8 ); <a name="l01706"></a>01706 <span class="keywordflow">if</span> ( !deleted ) { <a name="l01707"></a>01707 <span class="keywordflow">if</span>( uid != 0 ) { <a name="l01708"></a>01708 <span class="keywordflow">if</span> ( uidsOnServer.count() == uidsOnServer.size() ) { <a name="l01709"></a>01709 uidsOnServer.resize( KMail::nextPrime( uidsOnServer.size() * 2 ) ); <a name="l01710"></a>01710 <span class="comment">//kdDebug( 5006 ) << "Resizing to: " << uidsOnServer.size() << endl;</span> <a name="l01711"></a>01711 } <a name="l01712"></a>01712 uidsOnServer.insert( uid, &v ); <a name="l01713"></a>01713 } <a name="l01714"></a>01714 <span class="keywordtype">bool</span> redownload = <span class="keyword">false</span>; <a name="l01715"></a>01715 <span class="keywordflow">if</span> ( uid <= lastUid() ) { <a name="l01716"></a>01716 <span class="comment">/*</span> <a name="l01717"></a>01717 <span class="comment"> * If this message UID is not present locally, then it must</span> <a name="l01718"></a>01718 <span class="comment"> * have been deleted by the user, so we delete it on the</span> <a name="l01719"></a>01719 <span class="comment"> * server also. If we don't have delete permissions on the server,</span> <a name="l01720"></a>01720 <span class="comment"> * re-download the message, it must have vanished by some error, or</span> <a name="l01721"></a>01721 <span class="comment"> * while we still thought we were allowed to delete (ACL change).</span> <a name="l01722"></a>01722 <span class="comment"> *</span> <a name="l01723"></a>01723 <span class="comment"> * This relies heavily on lastUid() being correct at all times.</span> <a name="l01724"></a>01724 <span class="comment"> */</span> <a name="l01725"></a>01725 <span class="comment">// kdDebug(5006) << "KMFolderCachedImap::slotGetMessagesData() : folder "<<label()<<" already has msg="<<msg->headerField("Subject") << ", UID="<<uid << ", lastUid = " << mLastUid << endl;</span> <a name="l01726"></a>01726 KMMsgBase *existingMessage = findByUID(uid); <a name="l01727"></a>01727 <span class="keywordflow">if</span>( !existingMessage ) { <a name="l01728"></a>01728 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l01729"></a>01729 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Looking at uid "</span> << uid << <span class="stringliteral">" high water is: "</span> << lastUid() << <span class="stringliteral">" we should delete it"</span> << endl; <a name="l01730"></a>01730 <span class="preprocessor">#endif</span> <a name="l01731"></a>01731 <span class="preprocessor"></span> <span class="comment">// double check we deleted it since the last sync</span> <a name="l01732"></a>01732 <span class="keywordflow">if</span> ( mDeletedUIDsSinceLastSync.contains(uid) ) { <a name="l01733"></a>01733 <span class="keywordflow">if</span> ( mUserRights <= 0 || ( mUserRights & KMail::ACLJobs::Delete ) ) { <a name="l01734"></a>01734 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l01735"></a>01735 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"message with uid "</span> << uid << <span class="stringliteral">" is gone from local cache. Must be deleted on server!!!"</span> << endl; <a name="l01736"></a>01736 <span class="preprocessor">#endif</span> <a name="l01737"></a>01737 <span class="preprocessor"></span> uidsForDeletionOnServer << uid; <a name="l01738"></a>01738 } <span class="keywordflow">else</span> { <a name="l01739"></a>01739 redownload = <span class="keyword">true</span>; <a name="l01740"></a>01740 } <a name="l01741"></a>01741 } <span class="keywordflow">else</span> { <a name="l01742"></a>01742 kdDebug(5006) << <span class="stringliteral">"WARNING: ####### "</span> << endl; <a name="l01743"></a>01743 kdDebug(5006) << <span class="stringliteral">"Message locally missing but not deleted in folder: "</span> << folder()->prettyURL() << endl; <a name="l01744"></a>01744 kdDebug(5006) << <span class="stringliteral">"The missing UID: "</span> << uid << <span class="stringliteral">". It will be redownloaded "</span> << endl; <a name="l01745"></a>01745 redownload = <span class="keyword">true</span>; <a name="l01746"></a>01746 } <a name="l01747"></a>01747 <a name="l01748"></a>01748 } <span class="keywordflow">else</span> { <a name="l01749"></a>01749 <span class="comment">// if this is a read only folder, ignore status updates from the server</span> <a name="l01750"></a>01750 <span class="comment">// since we can't write our status back our local version is what has to</span> <a name="l01751"></a>01751 <span class="comment">// be considered correct.</span> <a name="l01752"></a>01752 <span class="keywordflow">if</span> ( !mReadOnly || !GlobalSettings::allowLocalFlags() ) { <a name="l01753"></a>01753 <span class="comment">/* The message is OK, update flags */</span> <a name="l01754"></a>01754 KMFolderImap::flagsToStatus( existingMessage, flags, <span class="keyword">false</span>, mReadOnly ? INT_MAX : mPermanentFlags ); <a name="l01755"></a>01755 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( mUserRights & KMail::ACLJobs::WriteSeenFlag ) { <a name="l01756"></a>01756 KMFolderImap::seenFlagToStatus( existingMessage, flags ); <a name="l01757"></a>01757 } <a name="l01758"></a>01758 } <a name="l01759"></a>01759 <span class="comment">// kdDebug(5006) << "message with uid " << uid << " found in the local cache. " << endl;</span> <a name="l01760"></a>01760 } <a name="l01761"></a>01761 <span class="keywordflow">if</span> ( uid > lastUid() || redownload ) { <a name="l01762"></a>01762 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l01763"></a>01763 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Looking at uid "</span> << uid << <span class="stringliteral">" high water is: "</span> << lastUid() << <span class="stringliteral">" we should download it"</span> << endl; <a name="l01764"></a>01764 <span class="preprocessor">#endif</span> <a name="l01765"></a>01765 <span class="preprocessor"></span> <span class="comment">// The message is new since the last sync, but we might have just uploaded it, in which case</span> <a name="l01766"></a>01766 <span class="comment">// the uid map already contains it.</span> <a name="l01767"></a>01767 <span class="keywordflow">if</span> ( !uidMap.contains( uid ) ) { <a name="l01768"></a>01768 mMsgsForDownload << <a class="code" href="structKMail_1_1CachedImapJob_1_1MsgForDownload.html" title="Information about a message to be downloaded (from the &#39;IMAP envelope&#39;).">KMail::CachedImapJob::MsgForDownload</a>(uid, flags, size); <a name="l01769"></a>01769 <span class="keywordflow">if</span>( imapPath() == <span class="stringliteral">"/INBOX/"</span> ) <a name="l01770"></a>01770 mUidsForDownload << uid; <a name="l01771"></a>01771 } <a name="l01772"></a>01772 <span class="comment">// Remember the highest uid and once the download is completed, update mLastUid</span> <a name="l01773"></a>01773 <span class="keywordflow">if</span> ( uid > mTentativeHighestUid ) { <a name="l01774"></a>01774 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l01775"></a>01775 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Setting the tentative highest UID to: "</span> << uid << endl; <a name="l01776"></a>01776 <span class="preprocessor">#endif</span> <a name="l01777"></a>01777 <span class="preprocessor"></span> mTentativeHighestUid = uid; <a name="l01778"></a>01778 } <a name="l01779"></a>01779 } <a name="l01780"></a>01780 } <a name="l01781"></a>01781 (*it).cdata.remove(0, pos); <a name="l01782"></a>01782 (*it).done++; <a name="l01783"></a>01783 pos = (*it).cdata.find(<span class="stringliteral">"\r\n--IMAPDIGEST"</span>, 1); <a name="l01784"></a>01784 } <a name="l01785"></a>01785 } <a name="l01786"></a>01786 <a name="l01787"></a>01787 <span class="keywordtype">void</span> KMFolderCachedImap::getMessagesResult( KMail::FolderJob *job, <span class="keywordtype">bool</span> lastSet ) <a name="l01788"></a>01788 { <a name="l01789"></a>01789 mProgress += 10; <a name="l01790"></a>01790 <span class="keywordflow">if</span> ( !job->error() && !mFoundAnIMAPDigest ) { <a name="l01791"></a>01791 kdWarning(5006) << <span class="stringliteral">"######## Folderlisting did not complete, but there was no error! "</span> <a name="l01792"></a>01792 <span class="stringliteral">"Aborting sync of folder: "</span> << folder()->prettyURL() << endl; <a name="l01793"></a>01793 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l01794"></a>01794 <span class="preprocessor"></span> kmkernel->emergencyExit( i18n(<span class="stringliteral">"Folder listing failed in interesting ways."</span> ) ); <a name="l01795"></a>01795 <span class="preprocessor">#endif</span> <a name="l01796"></a>01796 <span class="preprocessor"></span> } <a name="l01797"></a>01797 <span class="keywordflow">if</span>( job->error() ) { <span class="comment">// error listing messages but the user chose to continue</span> <a name="l01798"></a>01798 mContentState = imapNoInformation; <a name="l01799"></a>01799 mSyncState = SYNC_STATE_HANDLE_INBOX; <span class="comment">// be sure not to continue in this folder</span> <a name="l01800"></a>01800 } <span class="keywordflow">else</span> { <a name="l01801"></a>01801 <span class="keywordflow">if</span>( lastSet ) { <span class="comment">// always true here (this comes from online-imap...)</span> <a name="l01802"></a>01802 mContentState = imapFinished; <a name="l01803"></a>01803 mStatusChangedLocally = <span class="keyword">false</span>; <span class="comment">// we are up to date again</span> <a name="l01804"></a>01804 } <a name="l01805"></a>01805 } <a name="l01806"></a>01806 serverSyncInternal(); <a name="l01807"></a>01807 } <a name="l01808"></a>01808 <a name="l01809"></a>01809 <span class="keywordtype">void</span> KMFolderCachedImap::slotProgress(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> done, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> total) <a name="l01810"></a>01810 { <a name="l01811"></a>01811 <span class="keywordtype">int</span> progressSpan = 100 - 5 - mProgress; <a name="l01812"></a>01812 <span class="comment">//kdDebug(5006) << "KMFolderCachedImap::slotProgress done=" << done << " total=" << total << "=> mProgress=" << mProgress + ( progressSpan * done ) / total << endl;</span> <a name="l01813"></a>01813 <span class="comment">// Progress info while retrieving new emails</span> <a name="l01814"></a>01814 <span class="comment">// (going from mProgress to mProgress+progressSpan)</span> <a name="l01815"></a>01815 newState( mProgress + (progressSpan * done) / total, QString::null ); <a name="l01816"></a>01816 } <a name="l01817"></a>01817 <a name="l01818"></a>01818 <span class="keywordtype">void</span> KMFolderCachedImap::setAccount(KMAcctCachedImap *aAccount) <a name="l01819"></a>01819 { <a name="l01820"></a>01820 assert( aAccount->isA(<span class="stringliteral">"KMAcctCachedImap"</span>) ); <a name="l01821"></a>01821 mAccount = aAccount; <a name="l01822"></a>01822 <span class="keywordflow">if</span>( imapPath()==<span class="stringliteral">"/"</span> ) aAccount->setFolder( folder() ); <a name="l01823"></a>01823 <a name="l01824"></a>01824 <span class="comment">// Folder was renamed in a previous session, and the user didn't sync yet</span> <a name="l01825"></a>01825 QString newName = mAccount->renamedFolder( imapPath() ); <a name="l01826"></a>01826 <span class="keywordflow">if</span> ( !newName.isEmpty() ) <a name="l01827"></a>01827 folder()->setLabel( newName ); <a name="l01828"></a>01828 <a name="l01829"></a>01829 <span class="keywordflow">if</span>( !folder() || !folder()->child() || !folder()->child()->count() ) <span class="keywordflow">return</span>; <a name="l01830"></a>01830 <span class="keywordflow">for</span>( KMFolderNode* node = folder()->child()->first(); node; <a name="l01831"></a>01831 node = folder()->child()->next() ) <a name="l01832"></a>01832 <span class="keywordflow">if</span> (!node->isDir()) <a name="l01833"></a>01833 static_cast<KMFolderCachedImap*>(static_cast<KMFolder*>(node)->storage())->setAccount(aAccount); <a name="l01834"></a>01834 } <a name="l01835"></a>01835 <a name="l01836"></a>01836 <span class="keywordtype">void</span> KMFolderCachedImap::listNamespaces() <a name="l01837"></a>01837 { <a name="l01838"></a>01838 ImapAccountBase::ListType type = ImapAccountBase::List; <a name="l01839"></a>01839 <span class="keywordflow">if</span> ( mAccount->onlySubscribedFolders() ) <a name="l01840"></a>01840 type = ImapAccountBase::ListSubscribed; <a name="l01841"></a>01841 <a name="l01842"></a>01842 kdDebug(5006) << <span class="stringliteral">"listNamespaces "</span> << mNamespacesToList << endl; <a name="l01843"></a>01843 <span class="keywordflow">if</span> ( mNamespacesToList.isEmpty() ) { <a name="l01844"></a>01844 mSyncState = SYNC_STATE_DELETE_SUBFOLDERS; <a name="l01845"></a>01845 mPersonalNamespacesCheckDone = <span class="keyword">true</span>; <a name="l01846"></a>01846 <a name="l01847"></a>01847 QStringList ns = mAccount->namespaces()[ImapAccountBase::OtherUsersNS]; <a name="l01848"></a>01848 ns += mAccount->namespaces()[ImapAccountBase::SharedNS]; <a name="l01849"></a>01849 mNamespacesToCheck = ns.count(); <a name="l01850"></a>01850 <span class="keywordflow">for</span> ( QStringList::Iterator it = ns.begin(); it != ns.end(); ++it ) <a name="l01851"></a>01851 { <a name="l01852"></a>01852 <span class="keywordflow">if</span> ( (*it).isEmpty() ) { <a name="l01853"></a>01853 <span class="comment">// ignore empty listings as they have been listed before</span> <a name="l01854"></a>01854 --mNamespacesToCheck; <a name="l01855"></a>01855 <span class="keywordflow">continue</span>; <a name="l01856"></a>01856 } <a name="l01857"></a>01857 <a class="code" href="classKMail_1_1ListJob.html" title="Generic folder list job for (d)imap accounts.">KMail::ListJob</a>* job = <span class="keyword">new</span> <a class="code" href="classKMail_1_1ListJob.html" title="Generic folder list job for (d)imap accounts.">KMail::ListJob</a>( mAccount, type, <span class="keyword">this</span>, mAccount->addPathToNamespace( *it ) ); <a name="l01858"></a>01858 job-><a class="code" href="classKMail_1_1ListJob.html#a50c8eee4a45ab6717fdb0f1a136ef84" title="Set whether the listing should include only folders that the account is subscribed...">setHonorLocalSubscription</a>( <span class="keyword">true</span> ); <a name="l01859"></a>01859 connect( job, SIGNAL(receivedFolders(<span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <a name="l01860"></a>01860 <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>&)), <a name="l01861"></a>01861 <span class="keyword">this</span>, SLOT(slotCheckNamespace(<span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <a name="l01862"></a>01862 <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>&))); <a name="l01863"></a>01863 job->start(); <a name="l01864"></a>01864 } <a name="l01865"></a>01865 <span class="keywordflow">if</span> ( mNamespacesToCheck == 0 ) { <a name="l01866"></a>01866 serverSyncInternal(); <a name="l01867"></a>01867 } <a name="l01868"></a>01868 <span class="keywordflow">return</span>; <a name="l01869"></a>01869 } <a name="l01870"></a>01870 mPersonalNamespacesCheckDone = <span class="keyword">false</span>; <a name="l01871"></a>01871 <a name="l01872"></a>01872 QString ns = mNamespacesToList.front(); <a name="l01873"></a>01873 mNamespacesToList.pop_front(); <a name="l01874"></a>01874 <a name="l01875"></a>01875 mSyncState = SYNC_STATE_LIST_SUBFOLDERS2; <a name="l01876"></a>01876 newState( mProgress, i18n(<span class="stringliteral">"Retrieving folders for namespace %1"</span>).arg(ns)); <a name="l01877"></a>01877 <a class="code" href="classKMail_1_1ListJob.html" title="Generic folder list job for (d)imap accounts.">KMail::ListJob</a>* job = <span class="keyword">new</span> <a class="code" href="classKMail_1_1ListJob.html" title="Generic folder list job for (d)imap accounts.">KMail::ListJob</a>( mAccount, type, <span class="keyword">this</span>, <a name="l01878"></a>01878 mAccount->addPathToNamespace( ns ) ); <a name="l01879"></a>01879 job-><a class="code" href="classKMail_1_1ListJob.html#757266b26b3149ce44f13c6e31a79193" title="Set the namespace for this listing.">setNamespace</a>( ns ); <a name="l01880"></a>01880 job-><a class="code" href="classKMail_1_1ListJob.html#a50c8eee4a45ab6717fdb0f1a136ef84" title="Set whether the listing should include only folders that the account is subscribed...">setHonorLocalSubscription</a>( <span class="keyword">true</span> ); <a name="l01881"></a>01881 connect( job, SIGNAL(receivedFolders(<span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <a name="l01882"></a>01882 <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>&)), <a name="l01883"></a>01883 <span class="keyword">this</span>, SLOT(slotListResult(<span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <a name="l01884"></a>01884 <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>&))); <a name="l01885"></a>01885 job->start(); <a name="l01886"></a>01886 } <a name="l01887"></a>01887 <a name="l01888"></a>01888 <span class="keywordtype">void</span> KMFolderCachedImap::slotCheckNamespace( <span class="keyword">const</span> QStringList& subfolderNames, <a name="l01889"></a>01889 <span class="keyword">const</span> QStringList& subfolderPaths, <a name="l01890"></a>01890 <span class="keyword">const</span> QStringList& subfolderMimeTypes, <a name="l01891"></a>01891 <span class="keyword">const</span> QStringList& subfolderAttributes, <a name="l01892"></a>01892 <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>& jobData ) <a name="l01893"></a>01893 { <a name="l01894"></a>01894 Q_UNUSED( subfolderPaths ); <a name="l01895"></a>01895 Q_UNUSED( subfolderMimeTypes ); <a name="l01896"></a>01896 Q_UNUSED( subfolderAttributes ); <a name="l01897"></a>01897 --mNamespacesToCheck; <a name="l01898"></a>01898 kdDebug(5006) << <span class="stringliteral">"slotCheckNamespace "</span> << subfolderNames << <span class="stringliteral">",remain="</span> << <a name="l01899"></a>01899 mNamespacesToCheck << endl; <a name="l01900"></a>01900 <a name="l01901"></a>01901 <span class="comment">// get a correct foldername:</span> <a name="l01902"></a>01902 <span class="comment">// strip / and make sure it does not contain the delimiter</span> <a name="l01903"></a>01903 QString name = jobData.<a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html#2753db90e61e96bf81909da8ef999acf">path</a>.mid( 1, jobData.<a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html#2753db90e61e96bf81909da8ef999acf">path</a>.length()-2 ); <a name="l01904"></a>01904 name.remove( mAccount->delimiterForNamespace( name ) ); <a name="l01905"></a>01905 <span class="keywordflow">if</span> ( name.isEmpty() ) { <a name="l01906"></a>01906 <span class="comment">// should not happen</span> <a name="l01907"></a>01907 kdWarning(5006) << <span class="stringliteral">"slotCheckNamespace: ignoring empty folder!"</span> << endl; <a name="l01908"></a>01908 <span class="keywordflow">return</span>; <a name="l01909"></a>01909 } <a name="l01910"></a>01910 <a name="l01911"></a>01911 folder()->createChildFolder(); <a name="l01912"></a>01912 KMFolderNode *node = 0; <a name="l01913"></a>01913 <span class="keywordflow">for</span> ( node = folder()->child()->first(); node; <a name="l01914"></a>01914 node = folder()->child()->next()) <a name="l01915"></a>01915 { <a name="l01916"></a>01916 <span class="keywordflow">if</span> ( !node->isDir() && node->name() == name ) <a name="l01917"></a>01917 <span class="keywordflow">break</span>; <a name="l01918"></a>01918 } <a name="l01919"></a>01919 <span class="keywordflow">if</span> ( !subfolderNames.isEmpty() ) { <a name="l01920"></a>01920 <span class="keywordflow">if</span> ( node ) { <a name="l01921"></a>01921 <span class="comment">// folder exists so we have nothing to do - it will be listed later</span> <a name="l01922"></a>01922 kdDebug(5006) << <span class="stringliteral">"found namespace folder "</span> << name << endl; <a name="l01923"></a>01923 } <span class="keywordflow">else</span> <a name="l01924"></a>01924 { <a name="l01925"></a>01925 <span class="comment">// create folder</span> <a name="l01926"></a>01926 kdDebug(5006) << <span class="stringliteral">"create namespace folder "</span> << name << endl; <a name="l01927"></a>01927 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* newFolder = folder()->child()->createFolder( name, <span class="keyword">false</span>, <a name="l01928"></a>01928 KMFolderTypeCachedImap ); <a name="l01929"></a>01929 <span class="keywordflow">if</span> ( newFolder ) { <a name="l01930"></a>01930 KMFolderCachedImap *f = <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>( newFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ); <a name="l01931"></a>01931 f->setImapPath( mAccount->addPathToNamespace( name ) ); <a name="l01932"></a>01932 f->setNoContent( <span class="keyword">true</span> ); <a name="l01933"></a>01933 f->setAccount( mAccount ); <a name="l01934"></a>01934 f->close(<span class="stringliteral">"cachedimap"</span>); <a name="l01935"></a>01935 kmkernel->dimapFolderMgr()->contentsChanged(); <a name="l01936"></a>01936 } <a name="l01937"></a>01937 } <a name="l01938"></a>01938 } <span class="keywordflow">else</span> { <a name="l01939"></a>01939 <span class="keywordflow">if</span> ( node ) { <a name="l01940"></a>01940 kdDebug(5006) << <span class="stringliteral">"delete namespace folder "</span> << name << endl; <a name="l01941"></a>01941 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* fld = <span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node); <a name="l01942"></a>01942 kmkernel->dimapFolderMgr()->remove( fld ); <a name="l01943"></a>01943 } <a name="l01944"></a>01944 } <a name="l01945"></a>01945 <a name="l01946"></a>01946 <span class="keywordflow">if</span> ( mNamespacesToCheck == 0 ) { <a name="l01947"></a>01947 <span class="comment">// all namespaces are done so continue with the next step</span> <a name="l01948"></a>01948 serverSyncInternal(); <a name="l01949"></a>01949 } <a name="l01950"></a>01950 } <a name="l01951"></a>01951 <a name="l01952"></a>01952 <span class="comment">// This lists the subfolders on the server</span> <a name="l01953"></a>01953 <span class="comment">// and (in slotListResult) takes care of folders that have been removed on the server</span> <a name="l01954"></a>01954 <span class="keywordtype">bool</span> KMFolderCachedImap::listDirectory() <a name="l01955"></a>01955 { <a name="l01956"></a>01956 <span class="keywordflow">if</span>( !mAccount->slave() ) { <span class="comment">// sync aborted</span> <a name="l01957"></a>01957 resetSyncState(); <a name="l01958"></a>01958 emit folderComplete( <span class="keyword">this</span>, <span class="keyword">false</span> ); <a name="l01959"></a>01959 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l01960"></a>01960 } <a name="l01961"></a>01961 mSubfolderState = imapInProgress; <a name="l01962"></a>01962 <a name="l01963"></a>01963 <span class="comment">// get the folders</span> <a name="l01964"></a>01964 ImapAccountBase::ListType type = ImapAccountBase::List; <a name="l01965"></a>01965 <span class="keywordflow">if</span> ( mAccount->onlySubscribedFolders() ) <a name="l01966"></a>01966 type = ImapAccountBase::ListSubscribed; <a name="l01967"></a>01967 <a class="code" href="classKMail_1_1ListJob.html" title="Generic folder list job for (d)imap accounts.">KMail::ListJob</a>* job = <span class="keyword">new</span> <a class="code" href="classKMail_1_1ListJob.html" title="Generic folder list job for (d)imap accounts.">KMail::ListJob</a>( mAccount, type, <span class="keyword">this</span> ); <a name="l01968"></a>01968 job-><a class="code" href="classKMail_1_1ListJob.html#a50c8eee4a45ab6717fdb0f1a136ef84" title="Set whether the listing should include only folders that the account is subscribed...">setHonorLocalSubscription</a>( <span class="keyword">true</span> ); <a name="l01969"></a>01969 connect( job, SIGNAL(receivedFolders(<span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <a name="l01970"></a>01970 <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>&)), <a name="l01971"></a>01971 <span class="keyword">this</span>, SLOT(slotListResult(<span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <a name="l01972"></a>01972 <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> QStringList&, <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>&))); <a name="l01973"></a>01973 job->start(); <a name="l01974"></a>01974 <a name="l01975"></a>01975 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l01976"></a>01976 } <a name="l01977"></a>01977 <a name="l01978"></a>01978 <span class="keywordtype">void</span> KMFolderCachedImap::slotListResult( <span class="keyword">const</span> QStringList& folderNames, <a name="l01979"></a>01979 <span class="keyword">const</span> QStringList& folderPaths, <a name="l01980"></a>01980 <span class="keyword">const</span> QStringList& folderMimeTypes, <a name="l01981"></a>01981 <span class="keyword">const</span> QStringList& folderAttributes, <a name="l01982"></a>01982 <span class="keyword">const</span> <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a>& jobData ) <a name="l01983"></a>01983 { <a name="l01984"></a>01984 Q_UNUSED( jobData ); <a name="l01985"></a>01985 <span class="comment">//kdDebug(5006) << label() << ": folderNames=" << folderNames << " folderPaths="</span> <a name="l01986"></a>01986 <span class="comment">//<< folderPaths << " mimeTypes=" << folderMimeTypes << endl;</span> <a name="l01987"></a>01987 mSubfolderNames = folderNames; <a name="l01988"></a>01988 mSubfolderPaths = folderPaths; <a name="l01989"></a>01989 mSubfolderMimeTypes = folderMimeTypes; <a name="l01990"></a>01990 mSubfolderState = imapFinished; <a name="l01991"></a>01991 mSubfolderAttributes = folderAttributes; <a name="l01992"></a>01992 kdDebug(5006) << <span class="stringliteral">"##### setting subfolder attributes: "</span> << mSubfolderAttributes << endl; <a name="l01993"></a>01993 <a name="l01994"></a>01994 folder()->createChildFolder(); <a name="l01995"></a>01995 KMFolderNode *node = folder()->child()->first(); <a name="l01996"></a>01996 <span class="keywordtype">bool</span> root = ( <span class="keyword">this</span> == mAccount->rootFolder() ); <a name="l01997"></a>01997 <a name="l01998"></a>01998 QPtrList<KMFolder> toRemove; <a name="l01999"></a>01999 <span class="keywordtype">bool</span> emptyList = ( root && mSubfolderNames.empty() ); <a name="l02000"></a>02000 <span class="keywordflow">if</span> ( !emptyList ) { <a name="l02001"></a>02001 <span class="keywordflow">while</span> (node) { <a name="l02002"></a>02002 <span class="keywordflow">if</span> (!node->isDir() ) { <a name="l02003"></a>02003 KMFolderCachedImap *f = <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(<span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node)->storage()); <a name="l02004"></a>02004 <a name="l02005"></a>02005 <span class="keywordflow">if</span> ( mSubfolderNames.findIndex(node->name()) == -1 ) { <a name="l02006"></a>02006 QString name = node->name(); <a name="l02007"></a>02007 <span class="comment">// as more than one namespace can be listed in the root folder we need to make sure</span> <a name="l02008"></a>02008 <span class="comment">// that the folder is within the current namespace</span> <a name="l02009"></a>02009 <span class="keywordtype">bool</span> isInNamespace = ( jobData.<a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html#e1dd953de2826d2d8a523d26fbdc080a">curNamespace</a>.isEmpty() || <a name="l02010"></a>02010 jobData.<a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html#e1dd953de2826d2d8a523d26fbdc080a">curNamespace</a> == mAccount->namespaceForFolder( f ) ); <a name="l02011"></a>02011 <span class="comment">// ignore some cases</span> <a name="l02012"></a>02012 <span class="keywordtype">bool</span> ignore = root && ( f->imapPath() == <span class="stringliteral">"/INBOX/"</span> || <a name="l02013"></a>02013 mAccount->isNamespaceFolder( name ) || !isInNamespace ); <a name="l02014"></a>02014 <a name="l02015"></a>02015 <span class="comment">// This subfolder isn't present on the server</span> <a name="l02016"></a>02016 <span class="keywordflow">if</span>( !f->imapPath().isEmpty() && !ignore ) { <a name="l02017"></a>02017 <span class="comment">// The folder has an imap path set, so it has been</span> <a name="l02018"></a>02018 <span class="comment">// on the server before. Delete it locally.</span> <a name="l02019"></a>02019 toRemove.append( f->folder() ); <a name="l02020"></a>02020 kdDebug(5006) << node->name() << <span class="stringliteral">" isn't on the server. It has an imapPath -> delete it locally"</span> << endl; <a name="l02021"></a>02021 } <a name="l02022"></a>02022 } <span class="keywordflow">else</span> { <span class="comment">// folder both local and on server</span> <a name="l02023"></a>02023 <span class="comment">//kdDebug(5006) << node->name() << " is on the server." << endl;</span> <a name="l02024"></a>02024 <a name="l02028"></a>02028 <span class="keywordtype">int</span> index = mSubfolderNames.findIndex( node->name() ); <a name="l02029"></a>02029 f->mFolderAttributes = folderAttributes[ index ]; <a name="l02030"></a>02030 } <a name="l02031"></a>02031 } <span class="keywordflow">else</span> { <a name="l02032"></a>02032 <span class="comment">//kdDebug(5006) << "skipping dir node:" << node->name() << endl;</span> <a name="l02033"></a>02033 } <a name="l02034"></a>02034 node = folder()->child()->next(); <a name="l02035"></a>02035 } <a name="l02036"></a>02036 } <a name="l02037"></a>02037 <a name="l02038"></a>02038 <span class="keywordflow">for</span> ( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* doomed=toRemove.first(); doomed; doomed = toRemove.next() ) { <a name="l02039"></a>02039 rescueUnsyncedMessagesAndDeleteFolder( doomed ); <a name="l02040"></a>02040 } <a name="l02041"></a>02041 <a name="l02042"></a>02042 mProgress += 5; <a name="l02043"></a>02043 <a name="l02044"></a>02044 <span class="comment">// just in case there is nothing to rescue</span> <a name="l02045"></a>02045 slotRescueDone( 0 ); <a name="l02046"></a>02046 } <a name="l02047"></a>02047 <a name="l02048"></a>02048 <span class="comment">// This synchronizes the local folders as needed (creation/deletion). No network communication here.</span> <a name="l02049"></a>02049 <span class="keywordtype">void</span> KMFolderCachedImap::listDirectory2() <a name="l02050"></a>02050 { <a name="l02051"></a>02051 QString path = folder()->path(); <a name="l02052"></a>02052 kmkernel->dimapFolderMgr()->quiet(<span class="keyword">true</span>); <a name="l02053"></a>02053 <a name="l02054"></a>02054 <span class="keywordtype">bool</span> root = ( <span class="keyword">this</span> == mAccount->rootFolder() ); <a name="l02055"></a>02055 <span class="keywordflow">if</span> ( root && !mAccount->hasInbox() ) <a name="l02056"></a>02056 { <a name="l02057"></a>02057 KMFolderCachedImap *f = 0; <a name="l02058"></a>02058 KMFolderNode *node; <a name="l02059"></a>02059 <span class="comment">// create the INBOX</span> <a name="l02060"></a>02060 <span class="keywordflow">for</span> (node = folder()->child()->first(); node; node = folder()->child()->next()) <a name="l02061"></a>02061 <span class="keywordflow">if</span> (!node->isDir() && node->name() == <span class="stringliteral">"INBOX"</span>) <span class="keywordflow">break</span>; <a name="l02062"></a>02062 <span class="keywordflow">if</span> (node) { <a name="l02063"></a>02063 f = <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(<span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node)->storage()); <a name="l02064"></a>02064 } <span class="keywordflow">else</span> { <a name="l02065"></a>02065 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* newFolder = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()-><a class="code" href="classKMFolderDir.html#1f6317f3f12591c7ae6f2e3dab087d3f" title="Create a mail folder in this directory with given name.">createFolder</a>(<span class="stringliteral">"INBOX"</span>, <span class="keyword">true</span>, KMFolderTypeCachedImap); <a name="l02066"></a>02066 <span class="keywordflow">if</span> ( newFolder ) { <a name="l02067"></a>02067 f = <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(newFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>()); <a name="l02068"></a>02068 } <a name="l02069"></a>02069 } <a name="l02070"></a>02070 <span class="keywordflow">if</span> ( f ) { <a name="l02071"></a>02071 f->setAccount( mAccount ); <a name="l02072"></a>02072 f->setImapPath( <span class="stringliteral">"/INBOX/"</span> ); <a name="l02073"></a>02073 f->folder()-><a class="code" href="classKMFolder.html#3d031323b05f717cb26e441299a5c20f">setLabel</a>( i18n(<span class="stringliteral">"inbox"</span>) ); <a name="l02074"></a>02074 } <a name="l02075"></a>02075 <span class="keywordflow">if</span> (!node) { <a name="l02076"></a>02076 <span class="keywordflow">if</span> ( f ) <a name="l02077"></a>02077 f->close(<span class="stringliteral">"cachedimap"</span>); <a name="l02078"></a>02078 kmkernel->dimapFolderMgr()->contentsChanged(); <a name="l02079"></a>02079 } <a name="l02080"></a>02080 <span class="comment">// so we have an INBOX</span> <a name="l02081"></a>02081 mAccount->setHasInbox( <span class="keyword">true</span> ); <a name="l02082"></a>02082 } <a name="l02083"></a>02083 <a name="l02084"></a>02084 <span class="keywordflow">if</span> ( root && !mSubfolderNames.isEmpty() ) { <a name="l02085"></a>02085 KMFolderCachedImap* parent = <a name="l02086"></a>02086 findParent( mSubfolderPaths.first(), mSubfolderNames.first() ); <a name="l02087"></a>02087 <span class="keywordflow">if</span> ( parent ) { <a name="l02088"></a>02088 kdDebug(5006) << <span class="stringliteral">"KMFolderCachedImap::listDirectory2 - pass listing to "</span> <a name="l02089"></a>02089 << parent->label() << endl; <a name="l02090"></a>02090 mSubfolderNames.clear(); <a name="l02091"></a>02091 } <a name="l02092"></a>02092 } <a name="l02093"></a>02093 <a name="l02094"></a>02094 <span class="comment">// Find all subfolders present on server but not on disk</span> <a name="l02095"></a>02095 QValueVector<int> foldersNewOnServer; <a name="l02096"></a>02096 <span class="keywordflow">for</span> (uint i = 0; i < mSubfolderNames.count(); i++) { <a name="l02097"></a>02097 <a name="l02098"></a>02098 <span class="comment">// Find the subdir, if already present</span> <a name="l02099"></a>02099 KMFolderCachedImap *f = 0; <a name="l02100"></a>02100 KMFolderNode *node = 0; <a name="l02101"></a>02101 <span class="keywordflow">for</span> (node = folder()->child()->first(); node; <a name="l02102"></a>02102 node = folder()->child()->next()) <a name="l02103"></a>02103 <span class="keywordflow">if</span> (!node->isDir() && node->name() == mSubfolderNames[i]) <span class="keywordflow">break</span>; <a name="l02104"></a>02104 <a name="l02105"></a>02105 <span class="keywordflow">if</span> (!node) { <a name="l02106"></a>02106 <span class="comment">// This folder is not present here</span> <a name="l02107"></a>02107 <span class="comment">// Either it's new on the server, or we just deleted it.</span> <a name="l02108"></a>02108 QString subfolderPath = mSubfolderPaths[i]; <a name="l02109"></a>02109 <span class="comment">// The code used to look at the uidcache to know if it was "just deleted".</span> <a name="l02110"></a>02110 <span class="comment">// But this breaks with noContent folders and with shared folders.</span> <a name="l02111"></a>02111 <span class="comment">// So instead we keep a list in the account.</span> <a name="l02112"></a>02112 <span class="keywordtype">bool</span> locallyDeleted = mAccount->isDeletedFolder( subfolderPath ); <a name="l02113"></a>02113 <span class="comment">// That list is saved/restored across sessions, but to avoid any mistake,</span> <a name="l02114"></a>02114 <span class="comment">// ask for confirmation if the folder was deleted in a previous session</span> <a name="l02115"></a>02115 <span class="comment">// (could be that the folder was deleted & recreated meanwhile from another client...)</span> <a name="l02116"></a>02116 <span class="keywordflow">if</span> ( !locallyDeleted && mAccount->isPreviouslyDeletedFolder( subfolderPath ) ) { <a name="l02117"></a>02117 locallyDeleted = KMessageBox::warningYesNo( <a name="l02118"></a>02118 0, i18n( <span class="stringliteral">"<qt><p>It seems that the folder <b>%1</b> was deleted. Do you want to delete it from the server?</p></qt>"</span> ).arg( mSubfolderNames[i] ), QString::null, KStdGuiItem::del(), KStdGuiItem::cancel() ) == KMessageBox::Yes; <a name="l02119"></a>02119 } <a name="l02120"></a>02120 <a name="l02121"></a>02121 <span class="keywordflow">if</span> ( locallyDeleted ) { <a name="l02122"></a>02122 kdDebug(5006) << subfolderPath << <span class="stringliteral">" was deleted locally => delete on server."</span> << endl; <a name="l02123"></a>02123 foldersForDeletionOnServer += mAccount->deletedFolderPaths( subfolderPath ); <span class="comment">// grab all subsubfolders too</span> <a name="l02124"></a>02124 } <span class="keywordflow">else</span> { <a name="l02125"></a>02125 kdDebug(5006) << subfolderPath << <span class="stringliteral">" is a new folder on the server => create local cache"</span> << endl; <a name="l02126"></a>02126 foldersNewOnServer.append( i ); <a name="l02127"></a>02127 } <a name="l02128"></a>02128 } <span class="keywordflow">else</span> { <span class="comment">// Folder found locally</span> <a name="l02129"></a>02129 <span class="keywordflow">if</span>( static_cast<KMFolder*>(node)->folderType() == KMFolderTypeCachedImap ) <a name="l02130"></a>02130 f = <span class="keyword">dynamic_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(<span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node)->storage()); <a name="l02131"></a>02131 <span class="keywordflow">if</span>( f ) { <a name="l02132"></a>02132 <span class="comment">// kdDebug(5006) << "folder("<<f->name()<<")->imapPath()=" << f->imapPath()</span> <a name="l02133"></a>02133 <span class="comment">// << "\nSetting imapPath " << mSubfolderPaths[i] << endl;</span> <a name="l02134"></a>02134 <span class="comment">// Write folder settings</span> <a name="l02135"></a>02135 f->setAccount(mAccount); <a name="l02136"></a>02136 f->setNoContent(mSubfolderMimeTypes[i] == <span class="stringliteral">"inode/directory"</span>); <a name="l02137"></a>02137 f->setNoChildren(mSubfolderMimeTypes[i] == <span class="stringliteral">"message/digest"</span>); <a name="l02138"></a>02138 f->setImapPath(mSubfolderPaths[i]); <a name="l02139"></a>02139 } <a name="l02140"></a>02140 } <a name="l02141"></a>02141 } <a name="l02142"></a>02142 <a name="l02143"></a>02143 <span class="comment">/* In case we are ignoring non-groupware folders, and this is the groupware</span> <a name="l02144"></a>02144 <span class="comment"> * main account, find out the contents types of folders that have newly</span> <a name="l02145"></a>02145 <span class="comment"> * appeared on the server. Otherwise just create them and finish listing.</span> <a name="l02146"></a>02146 <span class="comment"> * If a folder is already known to be locally unsubscribed, it won't be</span> <a name="l02147"></a>02147 <span class="comment"> * listed at all, on this level, so these are only folders that we are</span> <a name="l02148"></a>02148 <span class="comment"> * seeing for the first time. */</span> <a name="l02149"></a>02149 <a name="l02150"></a>02150 <span class="comment">/* Note: We ask the globalsettings, and not the current state of the</span> <a name="l02151"></a>02151 <span class="comment"> * kmkernel->iCalIface().isEnabled(), since that is false during the</span> <a name="l02152"></a>02152 <span class="comment"> * very first sync, where we already want to filter. */</span> <a name="l02153"></a>02153 <span class="keywordflow">if</span> ( GlobalSettings::self()->showOnlyGroupwareFoldersForGroupwareAccount() <a name="l02154"></a>02154 && GlobalSettings::self()->theIMAPResourceAccount() == (<span class="keywordtype">int</span>)mAccount->id() <a name="l02155"></a>02155 && mAccount->hasAnnotationSupport() <a name="l02156"></a>02156 && GlobalSettings::self()->theIMAPResourceEnabled() <a name="l02157"></a>02157 && !foldersNewOnServer.isEmpty() ) { <a name="l02158"></a>02158 <a name="l02159"></a>02159 QStringList paths; <a name="l02160"></a>02160 <span class="keywordflow">for</span> ( uint i = 0; i < foldersNewOnServer.count(); ++i ) <a name="l02161"></a>02161 paths << mSubfolderPaths[ foldersNewOnServer[i] ]; <a name="l02162"></a>02162 <a name="l02163"></a>02163 <a class="code" href="classKMail_1_1AnnotationJobs_1_1MultiUrlGetAnnotationJob.html" title="for multiUrlGetAnnotation">AnnotationJobs::MultiUrlGetAnnotationJob</a>* job = <a name="l02164"></a>02164 AnnotationJobs::multiUrlGetAnnotation( mAccount->slave(), mAccount->getUrl(), paths, KOLAB_FOLDERTYPE ); <a name="l02165"></a>02165 <a class="code" href="structKMail_1_1ImapAccountBase_1_1jobData.html" title="Info Data for the Job.">ImapAccountBase::jobData</a> jd( QString::null, folder() ); <a name="l02166"></a>02166 jd.cancellable = <span class="keyword">true</span>; <a name="l02167"></a>02167 mAccount->insertJob(job, jd); <a name="l02168"></a>02168 connect( job, SIGNAL(result(KIO::Job *)), <a name="l02169"></a>02169 SLOT(slotMultiUrlGetAnnotationResult(KIO::Job *)) ); <a name="l02170"></a>02170 <a name="l02171"></a>02171 } <span class="keywordflow">else</span> { <a name="l02172"></a>02172 createFoldersNewOnServerAndFinishListing( foldersNewOnServer ); <a name="l02173"></a>02173 } <a name="l02174"></a>02174 } <a name="l02175"></a>02175 <a name="l02176"></a>02176 <span class="keywordtype">void</span> KMFolderCachedImap::createFoldersNewOnServerAndFinishListing( <span class="keyword">const</span> QValueVector<int> foldersNewOnServer ) <a name="l02177"></a>02177 { <a name="l02178"></a>02178 <span class="keywordflow">for</span> ( uint i = 0; i < foldersNewOnServer.count(); ++i ) { <a name="l02179"></a>02179 <span class="keywordtype">int</span> idx = foldersNewOnServer[i]; <a name="l02180"></a>02180 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* newFolder = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()-><a class="code" href="classKMFolderDir.html#1f6317f3f12591c7ae6f2e3dab087d3f" title="Create a mail folder in this directory with given name.">createFolder</a>( mSubfolderNames[idx], <span class="keyword">false</span>, KMFolderTypeCachedImap); <a name="l02181"></a>02181 <span class="keywordflow">if</span> (newFolder) { <a name="l02182"></a>02182 KMFolderCachedImap *f = <span class="keyword">dynamic_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(newFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>()); <a name="l02183"></a>02183 kdDebug(5006) << <span class="stringliteral">" ####### Locally creating folder "</span> << mSubfolderNames[idx] <<endl; <a name="l02184"></a>02184 f-><a class="code" href="classKMFolder.html#8d167662bca3ad6315fa5ad67bb9e4dd" title="Close folder.">close</a>(<span class="stringliteral">"cachedimap"</span>); <a name="l02185"></a>02185 f->setAccount(mAccount); <a name="l02186"></a>02186 f->mAnnotationFolderType = <span class="stringliteral">"FROMSERVER"</span>; <a name="l02187"></a>02187 f->setNoContent(mSubfolderMimeTypes[idx] == <span class="stringliteral">"inode/directory"</span>); <a name="l02188"></a>02188 f->setNoChildren(mSubfolderMimeTypes[idx] == <span class="stringliteral">"message/digest"</span>); <a name="l02189"></a>02189 f->setImapPath(mSubfolderPaths[idx]); <a name="l02190"></a>02190 f->mFolderAttributes = mSubfolderAttributes[idx]; <a name="l02191"></a>02191 kdDebug(5006) << <span class="stringliteral">" ####### Attributes: "</span> << f->mFolderAttributes <<endl; <a name="l02192"></a>02192 <span class="comment">//kdDebug(5006) << subfolderPath << ": mAnnotationFolderType set to FROMSERVER" << endl;</span> <a name="l02193"></a>02193 kmkernel->dimapFolderMgr()->contentsChanged(); <a name="l02194"></a>02194 } <span class="keywordflow">else</span> { <a name="l02195"></a>02195 kdDebug(5006) << <span class="stringliteral">"can't create folder "</span> << mSubfolderNames[idx] <<endl; <a name="l02196"></a>02196 } <a name="l02197"></a>02197 } <a name="l02198"></a>02198 <a name="l02199"></a>02199 kmkernel->dimapFolderMgr()->quiet(<span class="keyword">false</span>); <a name="l02200"></a>02200 emit listComplete(<span class="keyword">this</span>); <a name="l02201"></a>02201 <span class="keywordflow">if</span> ( !mPersonalNamespacesCheckDone ) { <a name="l02202"></a>02202 <span class="comment">// we're not done with the namespaces</span> <a name="l02203"></a>02203 mSyncState = SYNC_STATE_LIST_NAMESPACES; <a name="l02204"></a>02204 } <a name="l02205"></a>02205 serverSyncInternal(); <a name="l02206"></a>02206 } <a name="l02207"></a>02207 <a name="l02208"></a>02208 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02209"></a>02209 KMFolderCachedImap* KMFolderCachedImap::findParent( <span class="keyword">const</span> QString& path, <a name="l02210"></a>02210 <span class="keyword">const</span> QString& name ) <a name="l02211"></a>02211 { <a name="l02212"></a>02212 QString parent = path.left( path.length() - name.length() - 2 ); <a name="l02213"></a>02213 <span class="keywordflow">if</span> ( parent.length() > 1 ) <a name="l02214"></a>02214 { <a name="l02215"></a>02215 <span class="comment">// extract name of the parent</span> <a name="l02216"></a>02216 parent = parent.right( parent.length() - 1 ); <a name="l02217"></a>02217 <span class="keywordflow">if</span> ( parent != label() ) <a name="l02218"></a>02218 { <a name="l02219"></a>02219 KMFolderNode *node = folder()->child()->first(); <a name="l02220"></a>02220 <span class="comment">// look for a better parent</span> <a name="l02221"></a>02221 <span class="keywordflow">while</span> ( node ) <a name="l02222"></a>02222 { <a name="l02223"></a>02223 <span class="keywordflow">if</span> ( node->name() == parent ) <a name="l02224"></a>02224 { <a name="l02225"></a>02225 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* fld = <span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node); <a name="l02226"></a>02226 KMFolderCachedImap* imapFld = <a name="l02227"></a>02227 <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>( fld-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ); <a name="l02228"></a>02228 <span class="keywordflow">return</span> imapFld; <a name="l02229"></a>02229 } <a name="l02230"></a>02230 node = folder()-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->next(); <a name="l02231"></a>02231 } <a name="l02232"></a>02232 } <a name="l02233"></a>02233 } <a name="l02234"></a>02234 <span class="keywordflow">return</span> 0; <a name="l02235"></a>02235 } <a name="l02236"></a>02236 <a name="l02237"></a>02237 <span class="keywordtype">void</span> KMFolderCachedImap::slotSubFolderComplete(KMFolderCachedImap* sub, <span class="keywordtype">bool</span> success) <a name="l02238"></a>02238 { <a name="l02239"></a>02239 Q_UNUSED(sub); <a name="l02240"></a>02240 <span class="comment">//kdDebug(5006) << label() << " slotSubFolderComplete: " << sub->label() << endl;</span> <a name="l02241"></a>02241 <span class="keywordflow">if</span> ( success ) { <a name="l02242"></a>02242 serverSyncInternal(); <a name="l02243"></a>02243 } <a name="l02244"></a>02244 <span class="keywordflow">else</span> <a name="l02245"></a>02245 { <a name="l02246"></a>02246 <span class="comment">// success == false means the sync was aborted.</span> <a name="l02247"></a>02247 <span class="keywordflow">if</span> ( mCurrentSubfolder ) { <a name="l02248"></a>02248 Q_ASSERT( sub == mCurrentSubfolder ); <a name="l02249"></a>02249 disconnect( mCurrentSubfolder, SIGNAL( folderComplete(KMFolderCachedImap*, <span class="keywordtype">bool</span>) ), <a name="l02250"></a>02250 <span class="keyword">this</span>, SLOT( slotSubFolderComplete(KMFolderCachedImap*, <span class="keywordtype">bool</span>) ) ); <a name="l02251"></a>02251 mCurrentSubfolder = 0; <a name="l02252"></a>02252 } <a name="l02253"></a>02253 <a name="l02254"></a>02254 mSubfoldersForSync.clear(); <a name="l02255"></a>02255 mSyncState = SYNC_STATE_INITIAL; <a name="l02256"></a>02256 close(<span class="stringliteral">"cachedimap"</span>); <a name="l02257"></a>02257 emit folderComplete( <span class="keyword">this</span>, <span class="keyword">false</span> ); <a name="l02258"></a>02258 } <a name="l02259"></a>02259 } <a name="l02260"></a>02260 <a name="l02261"></a>02261 <span class="keywordtype">void</span> KMFolderCachedImap::slotSimpleData(KIO::Job * job, <span class="keyword">const</span> QByteArray & data) <a name="l02262"></a>02262 { <a name="l02263"></a>02263 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l02264"></a>02264 <span class="keywordflow">if</span> (it == mAccount->jobsEnd()) <span class="keywordflow">return</span>; <a name="l02265"></a>02265 QBuffer buff((*it).data); <a name="l02266"></a>02266 buff.open(IO_WriteOnly | IO_Append); <a name="l02267"></a>02267 buff.writeBlock(data.data(), data.size()); <a name="l02268"></a>02268 buff.close(); <a name="l02269"></a>02269 } <a name="l02270"></a>02270 <a name="l02271"></a>02271 FolderJob* <a name="l02272"></a>02272 KMFolderCachedImap::doCreateJob( <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a> *msg, FolderJob::JobType jt, <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *folder, <a name="l02273"></a>02273 QString, <span class="keyword">const</span> AttachmentStrategy* )<span class="keyword"> const</span> <a name="l02274"></a>02274 <span class="keyword"></span>{ <a name="l02275"></a>02275 QPtrList<KMMessage> msgList; <a name="l02276"></a>02276 msgList.append( msg ); <a name="l02277"></a>02277 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( msgList, jt, folder? static_cast<KMFolderCachedImap*>( folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ):0 ); <a name="l02278"></a>02278 job->setParentFolder( <span class="keyword">this</span> ); <a name="l02279"></a>02279 <span class="keywordflow">return</span> job; <a name="l02280"></a>02280 } <a name="l02281"></a>02281 <a name="l02282"></a>02282 FolderJob* <a name="l02283"></a>02283 KMFolderCachedImap::doCreateJob( QPtrList<KMMessage>& msgList, <span class="keyword">const</span> QString& sets, <a name="l02284"></a>02284 FolderJob::JobType jt, <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *folder )<span class="keyword"> const</span> <a name="l02285"></a>02285 <span class="keyword"></span>{ <a name="l02286"></a>02286 <span class="comment">//FIXME: how to handle sets here?</span> <a name="l02287"></a>02287 Q_UNUSED( sets ); <a name="l02288"></a>02288 CachedImapJob *job = <span class="keyword">new</span> CachedImapJob( msgList, jt, folder? static_cast<KMFolderCachedImap*>( folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ):0 ); <a name="l02289"></a>02289 job->setParentFolder( <span class="keyword">this</span> ); <a name="l02290"></a>02290 <span class="keywordflow">return</span> job; <a name="l02291"></a>02291 } <a name="l02292"></a>02292 <a name="l02293"></a>02293 <span class="keywordtype">void</span> <a name="l02294"></a>02294 KMFolderCachedImap::setUserRights( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> userRights ) <a name="l02295"></a>02295 { <a name="l02296"></a>02296 mUserRights = userRights; <a name="l02297"></a>02297 writeConfigKeysWhichShouldNotGetOverwrittenByReadConfig(); <a name="l02298"></a>02298 } <a name="l02299"></a>02299 <a name="l02300"></a>02300 <span class="keywordtype">void</span> <a name="l02301"></a>02301 KMFolderCachedImap::slotReceivedUserRights( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* folder ) <a name="l02302"></a>02302 { <a name="l02303"></a>02303 <span class="keywordflow">if</span> ( folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() == this ) { <a name="l02304"></a>02304 disconnect( mAccount, SIGNAL( receivedUserRights( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* ) ), <a name="l02305"></a>02305 <span class="keyword">this</span>, SLOT( slotReceivedUserRights( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* ) ) ); <a name="l02306"></a>02306 <span class="keywordflow">if</span> ( mUserRights == 0 ) <span class="comment">// didn't work</span> <a name="l02307"></a>02307 mUserRights = -1; <span class="comment">// error code (used in folderdia)</span> <a name="l02308"></a>02308 <span class="keywordflow">else</span> <a name="l02309"></a>02309 setReadOnly( ( mUserRights & KMail::ACLJobs::Insert ) == 0 ); <a name="l02310"></a>02310 mProgress += 5; <a name="l02311"></a>02311 serverSyncInternal(); <a name="l02312"></a>02312 } <a name="l02313"></a>02313 } <a name="l02314"></a>02314 <a name="l02315"></a>02315 <span class="keywordtype">void</span> <a name="l02316"></a>02316 KMFolderCachedImap::setReadOnly( <span class="keywordtype">bool</span> readOnly ) <a name="l02317"></a>02317 { <a name="l02318"></a>02318 <span class="keywordflow">if</span> ( readOnly != mReadOnly ) { <a name="l02319"></a>02319 mReadOnly = readOnly; <a name="l02320"></a>02320 emit readOnlyChanged( folder() ); <a name="l02321"></a>02321 } <a name="l02322"></a>02322 } <a name="l02323"></a>02323 <a name="l02324"></a>02324 <span class="keywordtype">void</span> <a name="l02325"></a>02325 KMFolderCachedImap::slotReceivedACL( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* folder, KIO::Job*, <span class="keyword">const</span> KMail::ACLList& aclList ) <a name="l02326"></a>02326 { <a name="l02327"></a>02327 <span class="keywordflow">if</span> ( folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() == this ) { <a name="l02328"></a>02328 disconnect( mAccount, SIGNAL(receivedACL( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, KIO::Job*, <span class="keyword">const</span> KMail::ACLList& )), <a name="l02329"></a>02329 <span class="keyword">this</span>, SLOT(slotReceivedACL( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*, KIO::Job*, <span class="keyword">const</span> KMail::ACLList& )) ); <a name="l02330"></a>02330 mACLList = aclList; <a name="l02331"></a>02331 serverSyncInternal(); <a name="l02332"></a>02332 } <a name="l02333"></a>02333 } <a name="l02334"></a>02334 <a name="l02335"></a>02335 <span class="keywordtype">void</span> <a name="l02336"></a>02336 KMFolderCachedImap::slotStorageQuotaResult( <span class="keyword">const</span> QuotaInfo& info ) <a name="l02337"></a>02337 { <a name="l02338"></a>02338 setQuotaInfo( info ); <a name="l02339"></a>02339 } <a name="l02340"></a>02340 <a name="l02341"></a>02341 <span class="keywordtype">void</span> KMFolderCachedImap::setQuotaInfo( <span class="keyword">const</span> QuotaInfo & info ) <a name="l02342"></a>02342 { <a name="l02343"></a>02343 <span class="keywordflow">if</span> ( info != mQuotaInfo ) { <a name="l02344"></a>02344 mQuotaInfo = info; <a name="l02345"></a>02345 writeConfigKeysWhichShouldNotGetOverwrittenByReadConfig(); <a name="l02346"></a>02346 emit folderSizeChanged(); <a name="l02347"></a>02347 } <a name="l02348"></a>02348 } <a name="l02349"></a>02349 <a name="l02350"></a>02350 <span class="keywordtype">void</span> <a name="l02351"></a>02351 KMFolderCachedImap::setACLList( <span class="keyword">const</span> ACLList& arr ) <a name="l02352"></a>02352 { <a name="l02353"></a>02353 mACLList = arr; <a name="l02354"></a>02354 } <a name="l02355"></a>02355 <a name="l02356"></a>02356 <span class="keywordtype">void</span> <a name="l02357"></a>02357 KMFolderCachedImap::slotMultiSetACLResult(KIO::Job *job) <a name="l02358"></a>02358 { <a name="l02359"></a>02359 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l02360"></a>02360 <span class="keywordflow">if</span> ( it == mAccount->jobsEnd() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02361"></a>02361 <span class="keywordflow">if</span> ( (*it).parent != folder() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02362"></a>02362 <a name="l02363"></a>02363 <span class="keywordflow">if</span> ( job->error() ) <a name="l02364"></a>02364 <span class="comment">// Display error but don't abort the sync just for this</span> <a name="l02365"></a>02365 <span class="comment">// PENDING(dfaure) reconsider using handleJobError now that it offers continue/cancel</span> <a name="l02366"></a>02366 job->showErrorDialog(); <a name="l02367"></a>02367 <span class="keywordflow">else</span> <a name="l02368"></a>02368 kmkernel->iCalIface().addFolderChange( folder(), KMailICalIfaceImpl::ACL ); <a name="l02369"></a>02369 <a name="l02370"></a>02370 <span class="keywordflow">if</span> (mAccount->slave()) mAccount->removeJob(job); <a name="l02371"></a>02371 serverSyncInternal(); <a name="l02372"></a>02372 } <a name="l02373"></a>02373 <a name="l02374"></a>02374 <span class="keywordtype">void</span> <a name="l02375"></a>02375 KMFolderCachedImap::slotACLChanged( <span class="keyword">const</span> QString& userId, <span class="keywordtype">int</span> permissions ) <a name="l02376"></a>02376 { <a name="l02377"></a>02377 <span class="comment">// The job indicates success in changing the permissions for this user</span> <a name="l02378"></a>02378 <span class="comment">// -> we note that it's been done.</span> <a name="l02379"></a>02379 <span class="keywordflow">for</span>( ACLList::Iterator it = mACLList.begin(); it != mACLList.end(); ++it ) { <a name="l02380"></a>02380 <span class="keywordflow">if</span> ( (*it).userId == userId && (*it).permissions == permissions ) { <a name="l02381"></a>02381 <span class="keywordflow">if</span> ( permissions == -1 ) <span class="comment">// deleted</span> <a name="l02382"></a>02382 mACLList.erase( it ); <a name="l02383"></a>02383 <span class="keywordflow">else</span> <span class="comment">// added/modified</span> <a name="l02384"></a>02384 (*it).changed = <span class="keyword">false</span>; <a name="l02385"></a>02385 <span class="keywordflow">return</span>; <a name="l02386"></a>02386 } <a name="l02387"></a>02387 } <a name="l02388"></a>02388 } <a name="l02389"></a>02389 <a name="l02390"></a>02390 <span class="comment">// called by KMAcctCachedImap::killAllJobs</span> <a name="l02391"></a>02391 <span class="keywordtype">void</span> KMFolderCachedImap::resetSyncState() <a name="l02392"></a>02392 { <a name="l02393"></a>02393 <span class="keywordflow">if</span> ( mSyncState == SYNC_STATE_INITIAL ) <span class="keywordflow">return</span>; <a name="l02394"></a>02394 mSubfoldersForSync.clear(); <a name="l02395"></a>02395 mSyncState = SYNC_STATE_INITIAL; <a name="l02396"></a>02396 close(<span class="stringliteral">"cachedimap"</span>); <a name="l02397"></a>02397 <span class="comment">// Don't use newState here, it would revert to mProgress (which is < current value when listing messages)</span> <a name="l02398"></a>02398 KPIM::ProgressItem *progressItem = mAccount->mailCheckProgressItem(); <a name="l02399"></a>02399 QString str = i18n(<span class="stringliteral">"Aborted"</span>); <a name="l02400"></a>02400 <span class="keywordflow">if</span> (progressItem) <a name="l02401"></a>02401 progressItem->setStatus( str ); <a name="l02402"></a>02402 emit statusMsg( str ); <a name="l02403"></a>02403 } <a name="l02404"></a>02404 <a name="l02405"></a>02405 <span class="keywordtype">void</span> KMFolderCachedImap::slotIncreaseProgress() <a name="l02406"></a>02406 { <a name="l02407"></a>02407 mProgress += 5; <a name="l02408"></a>02408 } <a name="l02409"></a>02409 <a name="l02410"></a>02410 <span class="keywordtype">void</span> KMFolderCachedImap::newState( <span class="keywordtype">int</span> progress, <span class="keyword">const</span> QString& syncStatus ) <a name="l02411"></a>02411 { <a name="l02412"></a>02412 <span class="comment">//kdDebug() << k_funcinfo << folder() << " " << mProgress << " " << syncStatus << endl;</span> <a name="l02413"></a>02413 KPIM::ProgressItem *progressItem = mAccount->mailCheckProgressItem(); <a name="l02414"></a>02414 <span class="keywordflow">if</span>( progressItem ) <a name="l02415"></a>02415 progressItem->setCompletedItems( progress ); <a name="l02416"></a>02416 <span class="keywordflow">if</span> ( !syncStatus.isEmpty() ) { <a name="l02417"></a>02417 QString str; <a name="l02418"></a>02418 <span class="comment">// For a subfolder, show the label. But for the main folder, it's already shown.</span> <a name="l02419"></a>02419 <span class="keywordflow">if</span> ( mAccount->imapFolder() == this ) <a name="l02420"></a>02420 str = syncStatus; <a name="l02421"></a>02421 <span class="keywordflow">else</span> <a name="l02422"></a>02422 str = QString( <span class="stringliteral">"%1: %2"</span> ).arg( label() ).arg( syncStatus ); <a name="l02423"></a>02423 <span class="keywordflow">if</span>( progressItem ) <a name="l02424"></a>02424 progressItem->setStatus( str ); <a name="l02425"></a>02425 emit statusMsg( str ); <a name="l02426"></a>02426 } <a name="l02427"></a>02427 <span class="keywordflow">if</span>( progressItem ) <a name="l02428"></a>02428 progressItem->updateProgress(); <a name="l02429"></a>02429 } <a name="l02430"></a>02430 <a name="l02431"></a>02431 <span class="keywordtype">void</span> KMFolderCachedImap::setSubfolderState( imapState state ) <a name="l02432"></a>02432 { <a name="l02433"></a>02433 mSubfolderState = state; <a name="l02434"></a>02434 <span class="keywordflow">if</span> ( state == imapNoInformation && folder()->child() ) <a name="l02435"></a>02435 { <a name="l02436"></a>02436 <span class="comment">// pass through to childs</span> <a name="l02437"></a>02437 KMFolderNode* node; <a name="l02438"></a>02438 QPtrListIterator<KMFolderNode> it( *folder()->child() ); <a name="l02439"></a>02439 <span class="keywordflow">for</span> ( ; (node = it.current()); ) <a name="l02440"></a>02440 { <a name="l02441"></a>02441 ++it; <a name="l02442"></a>02442 <span class="keywordflow">if</span> (node->isDir()) <span class="keywordflow">continue</span>; <a name="l02443"></a>02443 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *folder = <span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node); <a name="l02444"></a>02444 <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>())->setSubfolderState( state ); <a name="l02445"></a>02445 } <a name="l02446"></a>02446 } <a name="l02447"></a>02447 } <a name="l02448"></a>02448 <a name="l02449"></a>02449 <span class="keywordtype">void</span> KMFolderCachedImap::setImapPath(<span class="keyword">const</span> QString &path) <a name="l02450"></a>02450 { <a name="l02451"></a>02451 mImapPath = path; <a name="l02452"></a>02452 } <a name="l02453"></a>02453 <a name="l02454"></a>02454 <span class="comment">// mAnnotationFolderType is the annotation as known to the server (and stored in kmailrc)</span> <a name="l02455"></a>02455 <span class="comment">// It is updated from the folder contents type and whether it's a standard resource folder.</span> <a name="l02456"></a>02456 <span class="comment">// This happens during the syncing phase and during initFolder for a new folder.</span> <a name="l02457"></a>02457 <span class="comment">// Don't do it earlier, e.g. from setContentsType:</span> <a name="l02458"></a>02458 <span class="comment">// on startup, it's too early there to know if this is a standard resource folder.</span> <a name="l02459"></a>02459 <span class="keywordtype">void</span> KMFolderCachedImap::updateAnnotationFolderType() <a name="l02460"></a>02460 { <a name="l02461"></a>02461 QString oldType = mAnnotationFolderType; <a name="l02462"></a>02462 QString oldSubType; <a name="l02463"></a>02463 <span class="keywordtype">int</span> dot = oldType.<a class="code" href="classKMFolder.html#27adedd629ece306415faf3cf5fbc617" title="Returns the index of the given message or -1 if not found.">find</a>( <span class="charliteral">'.'</span> ); <a name="l02464"></a>02464 <span class="keywordflow">if</span> ( dot != -1 ) { <a name="l02465"></a>02465 oldType.truncate( dot ); <a name="l02466"></a>02466 oldSubType = mAnnotationFolderType.mid( dot + 1 ); <a name="l02467"></a>02467 } <a name="l02468"></a>02468 <a name="l02469"></a>02469 QString newType, newSubType; <a name="l02470"></a>02470 <span class="comment">// We want to store an annotation on the folder only if using the kolab storage.</span> <a name="l02471"></a>02471 <span class="keywordflow">if</span> ( kmkernel->iCalIface().storageFormat( folder() ) == KMailICalIfaceImpl::StorageXML ) { <a name="l02472"></a>02472 newType = KMailICalIfaceImpl::annotationForContentsType( mContentsType ); <a name="l02473"></a>02473 <span class="keywordflow">if</span> ( kmkernel->iCalIface().isStandardResourceFolder( folder() ) ) <a name="l02474"></a>02474 newSubType = <span class="stringliteral">"default"</span>; <a name="l02475"></a>02475 <span class="keywordflow">else</span> <a name="l02476"></a>02476 newSubType = oldSubType; <span class="comment">// preserve unknown subtypes, like drafts etc. And preserve ".default" too.</span> <a name="l02477"></a>02477 } <a name="l02478"></a>02478 <a name="l02479"></a>02479 <span class="comment">//kdDebug(5006) << mImapPath << ": updateAnnotationFolderType: " << newType << " " << newSubType << endl;</span> <a name="l02480"></a>02480 <span class="keywordflow">if</span> ( newType != oldType || newSubType != oldSubType ) { <a name="l02481"></a>02481 mAnnotationFolderType = newType + ( newSubType.isEmpty() ? QString::null : <span class="stringliteral">"."</span>+newSubType ); <a name="l02482"></a>02482 mAnnotationFolderTypeChanged = <span class="keyword">true</span>; <span class="comment">// force a "set annotation" on next sync</span> <a name="l02483"></a>02483 kdDebug(5006) << mImapPath << <span class="stringliteral">": updateAnnotationFolderType: '"</span> << mAnnotationFolderType << <span class="stringliteral">"', was ("</span> << oldType << <span class="stringliteral">" "</span> << oldSubType << <span class="stringliteral">") => mAnnotationFolderTypeChanged set to TRUE"</span> << endl; <a name="l02484"></a>02484 } <a name="l02485"></a>02485 <span class="comment">// Ensure that further readConfig()s don't lose mAnnotationFolderType</span> <a name="l02486"></a>02486 writeConfigKeysWhichShouldNotGetOverwrittenByReadConfig(); <a name="l02487"></a>02487 } <a name="l02488"></a>02488 <a name="l02489"></a>02489 <span class="keywordtype">void</span> KMFolderCachedImap::setIncidencesFor( IncidencesFor incfor ) <a name="l02490"></a>02490 { <a name="l02491"></a>02491 <span class="keywordflow">if</span> ( mIncidencesFor != incfor ) { <a name="l02492"></a>02492 mIncidencesFor = incfor; <a name="l02493"></a>02493 mIncidencesForChanged = <span class="keyword">true</span>; <a name="l02494"></a>02494 } <a name="l02495"></a>02495 } <a name="l02496"></a>02496 <a name="l02497"></a>02497 <span class="keywordtype">void</span> KMFolderCachedImap::slotAnnotationResult(<span class="keyword">const</span> QString& entry, <span class="keyword">const</span> QString& value, <span class="keywordtype">bool</span> found) <a name="l02498"></a>02498 { <a name="l02499"></a>02499 <span class="keywordflow">if</span> ( entry == KOLAB_FOLDERTYPE ) { <a name="l02500"></a>02500 <span class="comment">// There are four cases.</span> <a name="l02501"></a>02501 <span class="comment">// 1) no content-type on server -> set it</span> <a name="l02502"></a>02502 <span class="comment">// 2) different content-type on server, locally changed -> set it (we don't even come here)</span> <a name="l02503"></a>02503 <span class="comment">// 3) different (known) content-type on server, no local change -> get it</span> <a name="l02504"></a>02504 <span class="comment">// 4) different unknown content-type on server, probably some older version -> set it</span> <a name="l02505"></a>02505 <span class="keywordflow">if</span> ( found ) { <a name="l02506"></a>02506 QString type = value; <a name="l02507"></a>02507 QString subtype; <a name="l02508"></a>02508 <span class="keywordtype">int</span> dot = value.find( <span class="charliteral">'.'</span> ); <a name="l02509"></a>02509 <span class="keywordflow">if</span> ( dot != -1 ) { <a name="l02510"></a>02510 type.truncate( dot ); <a name="l02511"></a>02511 subtype = value.mid( dot + 1 ); <a name="l02512"></a>02512 } <a name="l02513"></a>02513 <span class="keywordtype">bool</span> foundKnownType = <span class="keyword">false</span>; <a name="l02514"></a>02514 <span class="keywordflow">for</span> ( uint i = 0 ; i <= ContentsTypeLast; ++i ) { <a name="l02515"></a>02515 FolderContentsType contentsType = <span class="keyword">static_cast<</span>KMail::FolderContentsType<span class="keyword">></span>( i ); <a name="l02516"></a>02516 <span class="keywordflow">if</span> ( type == KMailICalIfaceImpl::annotationForContentsType( contentsType ) ) { <a name="l02517"></a>02517 <span class="comment">// Case 3: known content-type on server, get it</span> <a name="l02518"></a>02518 <span class="comment">//kdDebug(5006) << mImapPath << ": slotGetAnnotationResult: found known type of annotation" << endl;</span> <a name="l02519"></a>02519 <span class="keywordflow">if</span> ( contentsType != ContentsTypeMail ) <a name="l02520"></a>02520 kmkernel->iCalIface().setStorageFormat( folder(), KMailICalIfaceImpl::StorageXML ); <a name="l02521"></a>02521 mAnnotationFolderType = value; <a name="l02522"></a>02522 <span class="keywordflow">if</span> ( folder()->parent()->owner()->idString() != GlobalSettings::self()->theIMAPResourceFolderParent() <a name="l02523"></a>02523 && GlobalSettings::self()->theIMAPResourceEnabled() <a name="l02524"></a>02524 && subtype == <span class="stringliteral">"default"</span> ) { <a name="l02525"></a>02525 <span class="comment">// Truncate subtype if this folder can't be a default resource folder for us,</span> <a name="l02526"></a>02526 <span class="comment">// although it apparently is for someone else.</span> <a name="l02527"></a>02527 mAnnotationFolderType = type; <a name="l02528"></a>02528 kdDebug(5006) << mImapPath << <span class="stringliteral">": slotGetAnnotationResult: parent folder is "</span> << folder()->parent()->owner()-><a class="code" href="classKMFolder.html#bab3b6b7c2758c19aa04c2bf72716b27" title="Returns a string that can be used to identify this folder.">idString</a>() << <span class="stringliteral">" => truncating annotation to "</span> << value << endl; <a name="l02529"></a>02529 } <a name="l02530"></a>02530 setContentsType( contentsType ); <a name="l02531"></a>02531 mAnnotationFolderTypeChanged = <span class="keyword">false</span>; <span class="comment">// we changed it, not the user</span> <a name="l02532"></a>02532 foundKnownType = <span class="keyword">true</span>; <a name="l02533"></a>02533 <a name="l02534"></a>02534 <span class="comment">// Users don't read events/contacts/etc. in kmail, so mark them all as read.</span> <a name="l02535"></a>02535 <span class="comment">// This is done in cachedimapjob when getting new messages, but do it here too,</span> <a name="l02536"></a>02536 <span class="comment">// for the initial set of messages when we didn't know this was a resource folder yet,</span> <a name="l02537"></a>02537 <span class="comment">// for old folders, etc.</span> <a name="l02538"></a>02538 <span class="keywordflow">if</span> ( contentsType != ContentsTypeMail ) <a name="l02539"></a>02539 markUnreadAsRead(); <a name="l02540"></a>02540 <a name="l02541"></a>02541 <span class="comment">// Ensure that further readConfig()s don't lose mAnnotationFolderType</span> <a name="l02542"></a>02542 writeConfigKeysWhichShouldNotGetOverwrittenByReadConfig(); <a name="l02543"></a>02543 <span class="keywordflow">break</span>; <a name="l02544"></a>02544 } <a name="l02545"></a>02545 } <a name="l02546"></a>02546 <span class="keywordflow">if</span> ( !foundKnownType && !mReadOnly ) { <a name="l02547"></a>02547 <span class="comment">//kdDebug(5006) << "slotGetAnnotationResult: no known type of annotation found, will need to set it" << endl;</span> <a name="l02548"></a>02548 <span class="comment">// Case 4: server has strange content-type, set it to what we need</span> <a name="l02549"></a>02549 mAnnotationFolderTypeChanged = <span class="keyword">true</span>; <a name="l02550"></a>02550 } <a name="l02551"></a>02551 <span class="comment">// TODO handle subtype (inbox, drafts, sentitems, junkemail)</span> <a name="l02552"></a>02552 } <a name="l02553"></a>02553 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !mReadOnly ) { <a name="l02554"></a>02554 <span class="comment">// Case 1: server doesn't have content-type, set it</span> <a name="l02555"></a>02555 <span class="comment">//kdDebug(5006) << "slotGetAnnotationResult: no annotation found, will need to set it" << endl;</span> <a name="l02556"></a>02556 mAnnotationFolderTypeChanged = <span class="keyword">true</span>; <a name="l02557"></a>02557 } <a name="l02558"></a>02558 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( entry == KOLAB_INCIDENCESFOR ) { <a name="l02559"></a>02559 <span class="keywordflow">if</span> ( found ) { <a name="l02560"></a>02560 mIncidencesFor = incidencesForFromString( value ); <a name="l02561"></a>02561 Q_ASSERT( mIncidencesForChanged == <span class="keyword">false</span> ); <a name="l02562"></a>02562 } <a name="l02563"></a>02563 } <a name="l02564"></a>02564 } <a name="l02565"></a>02565 <a name="l02566"></a>02566 <span class="keywordtype">void</span> KMFolderCachedImap::slotGetAnnotationResult( KIO::Job* job ) <a name="l02567"></a>02567 { <a name="l02568"></a>02568 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l02569"></a>02569 Q_ASSERT( it != mAccount->jobsEnd() ); <a name="l02570"></a>02570 <span class="keywordflow">if</span> ( it == mAccount->jobsEnd() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02571"></a>02571 Q_ASSERT( (*it).parent == folder() ); <a name="l02572"></a>02572 <span class="keywordflow">if</span> ( (*it).parent != folder() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02573"></a>02573 <a name="l02574"></a>02574 <a class="code" href="classKMail_1_1AnnotationJobs_1_1GetAnnotationJob.html" title="for getAnnotation()">AnnotationJobs::GetAnnotationJob</a>* annjob = <span class="keyword">static_cast<</span><a class="code" href="classKMail_1_1AnnotationJobs_1_1GetAnnotationJob.html" title="for getAnnotation()">AnnotationJobs::GetAnnotationJob</a> *<span class="keyword">></span>( job ); <a name="l02575"></a>02575 <span class="keywordflow">if</span> ( annjob->error() ) { <a name="l02576"></a>02576 <span class="keywordflow">if</span> ( job->error() == KIO::ERR_UNSUPPORTED_ACTION ) { <a name="l02577"></a>02577 <span class="comment">// that's when the imap server doesn't support annotations</span> <a name="l02578"></a>02578 <span class="keywordflow">if</span> ( GlobalSettings::self()->theIMAPResourceStorageFormat() == GlobalSettings::EnumTheIMAPResourceStorageFormat::XML <a name="l02579"></a>02579 && (uint)GlobalSettings::self()->theIMAPResourceAccount() == mAccount->id() ) <a name="l02580"></a>02580 KMessageBox::error( 0, i18n( <span class="stringliteral">"The IMAP server %1 does not have support for IMAP annotations. The XML storage cannot be used on this server; please re-configure KMail differently."</span> ).arg( mAccount->host() ) ); <a name="l02581"></a>02581 mAccount->setHasNoAnnotationSupport(); <a name="l02582"></a>02582 } <a name="l02583"></a>02583 <span class="keywordflow">else</span> <a name="l02584"></a>02584 kdWarning(5006) << <span class="stringliteral">"slotGetAnnotationResult: "</span> << job->errorString() << endl; <a name="l02585"></a>02585 } <a name="l02586"></a>02586 <a name="l02587"></a>02587 <span class="keywordflow">if</span> (mAccount->slave()) mAccount->removeJob(job); <a name="l02588"></a>02588 mProgress += 2; <a name="l02589"></a>02589 serverSyncInternal(); <a name="l02590"></a>02590 } <a name="l02591"></a>02591 <a name="l02592"></a>02592 <span class="keywordtype">void</span> KMFolderCachedImap::slotMultiUrlGetAnnotationResult( KIO::Job* job ) <a name="l02593"></a>02593 { <a name="l02594"></a>02594 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l02595"></a>02595 Q_ASSERT( it != mAccount->jobsEnd() ); <a name="l02596"></a>02596 <span class="keywordflow">if</span> ( it == mAccount->jobsEnd() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02597"></a>02597 Q_ASSERT( (*it).parent == folder() ); <a name="l02598"></a>02598 <span class="keywordflow">if</span> ( (*it).parent != folder() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02599"></a>02599 <a name="l02600"></a>02600 QValueVector<int> folders; <a name="l02601"></a>02601 <a class="code" href="classKMail_1_1AnnotationJobs_1_1MultiUrlGetAnnotationJob.html" title="for multiUrlGetAnnotation">AnnotationJobs::MultiUrlGetAnnotationJob</a>* annjob <a name="l02602"></a>02602 = <span class="keyword">static_cast<</span><a class="code" href="classKMail_1_1AnnotationJobs_1_1MultiUrlGetAnnotationJob.html" title="for multiUrlGetAnnotation">AnnotationJobs::MultiUrlGetAnnotationJob</a> *<span class="keyword">></span>( job ); <a name="l02603"></a>02603 <span class="keywordflow">if</span> ( annjob->error() ) { <a name="l02604"></a>02604 <span class="keywordflow">if</span> ( job->error() == KIO::ERR_UNSUPPORTED_ACTION ) { <a name="l02605"></a>02605 <span class="comment">// that's when the imap server doesn't support annotations</span> <a name="l02606"></a>02606 <span class="keywordflow">if</span> ( GlobalSettings::self()->theIMAPResourceStorageFormat() == GlobalSettings::EnumTheIMAPResourceStorageFormat::XML <a name="l02607"></a>02607 && (uint)GlobalSettings::self()->theIMAPResourceAccount() == mAccount->id() ) <a name="l02608"></a>02608 KMessageBox::error( 0, i18n( <span class="stringliteral">"The IMAP server %1 doesn't have support for imap annotations. The XML storage cannot be used on this server, please re-configure KMail differently"</span> ).arg( mAccount->host() ) ); <a name="l02609"></a>02609 mAccount->setHasNoAnnotationSupport(); <a name="l02610"></a>02610 } <a name="l02611"></a>02611 <span class="keywordflow">else</span> <a name="l02612"></a>02612 kdWarning(5006) << <span class="stringliteral">"slotGetMultiUrlAnnotationResult: "</span> << job->errorString() << endl; <a name="l02613"></a>02613 } <span class="keywordflow">else</span> { <a name="l02614"></a>02614 <span class="comment">// we got the annotation allright, let's filter out the ones with the wrong type</span> <a name="l02615"></a>02615 QMap<QString, QString> annotations = annjob-><a class="code" href="classKMail_1_1AnnotationJobs_1_1MultiUrlGetAnnotationJob.html#fb064cca790167397be708c9e5483534">annotations</a>(); <a name="l02616"></a>02616 QMap<QString, QString>::Iterator it = annotations.begin(); <a name="l02617"></a>02617 <span class="keywordflow">for</span> ( ; it != annotations.end(); ++it ) { <a name="l02618"></a>02618 <span class="keyword">const</span> QString folderPath = it.key(); <a name="l02619"></a>02619 <span class="keyword">const</span> QString annotation = it.data(); <a name="l02620"></a>02620 kdDebug(5006) << k_funcinfo << <span class="stringliteral">"Folder: "</span> << folderPath << <span class="stringliteral">" has type: "</span> << annotation << endl; <a name="l02621"></a>02621 <span class="comment">// we're only interested in the main type</span> <a name="l02622"></a>02622 QString type(annotation); <a name="l02623"></a>02623 <span class="keywordtype">int</span> dot = annotation.find( <span class="charliteral">'.'</span> ); <a name="l02624"></a>02624 <span class="keywordflow">if</span> ( dot != -1 ) type.truncate( dot ); <a name="l02625"></a>02625 type = type.simplifyWhiteSpace(); <a name="l02626"></a>02626 <a name="l02627"></a>02627 <span class="keyword">const</span> <span class="keywordtype">int</span> idx = mSubfolderPaths.findIndex( folderPath ); <a name="l02628"></a>02628 <span class="keyword">const</span> <span class="keywordtype">bool</span> isNoContent = mSubfolderMimeTypes[idx] == <span class="stringliteral">"inode/directory"</span>; <a name="l02629"></a>02629 <span class="keywordflow">if</span> ( ( isNoContent && type.isEmpty() ) <a name="l02630"></a>02630 || ( !type.isEmpty() && type != KMailICalIfaceImpl::annotationForContentsType( ContentsTypeMail ) ) ) { <a name="l02631"></a>02631 folders.append( idx ); <a name="l02632"></a>02632 kdDebug(5006) << k_funcinfo << <span class="stringliteral">" subscribing to: "</span> << folderPath << endl; <a name="l02633"></a>02633 } <span class="keywordflow">else</span> { <a name="l02634"></a>02634 kdDebug(5006) << k_funcinfo << <span class="stringliteral">" automatically unsubscribing from: "</span> << folderPath << endl; <a name="l02635"></a>02635 mAccount->changeLocalSubscription( folderPath, <span class="keyword">false</span> ); <a name="l02636"></a>02636 } <a name="l02637"></a>02637 } <a name="l02638"></a>02638 } <a name="l02639"></a>02639 <a name="l02640"></a>02640 <span class="keywordflow">if</span> (mAccount->slave()) mAccount->removeJob(job); <a name="l02641"></a>02641 createFoldersNewOnServerAndFinishListing( folders ); <a name="l02642"></a>02642 } <a name="l02643"></a>02643 <a name="l02644"></a>02644 <span class="keywordtype">void</span> KMFolderCachedImap::slotQuotaResult( KIO::Job* job ) <a name="l02645"></a>02645 { <a name="l02646"></a>02646 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l02647"></a>02647 Q_ASSERT( it != mAccount->jobsEnd() ); <a name="l02648"></a>02648 <span class="keywordflow">if</span> ( it == mAccount->jobsEnd() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02649"></a>02649 Q_ASSERT( (*it).parent == folder() ); <a name="l02650"></a>02650 <span class="keywordflow">if</span> ( (*it).parent != folder() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02651"></a>02651 <a name="l02652"></a>02652 <a class="code" href="classKMail_1_1QuotaJobs_1_1GetStorageQuotaJob.html" title="for getStorageQuota()">QuotaJobs::GetStorageQuotaJob</a>* quotajob = <span class="keyword">static_cast<</span><a class="code" href="classKMail_1_1QuotaJobs_1_1GetStorageQuotaJob.html" title="for getStorageQuota()">QuotaJobs::GetStorageQuotaJob</a> *<span class="keyword">></span>( job ); <a name="l02653"></a>02653 QuotaInfo empty; <a name="l02654"></a>02654 <span class="keywordflow">if</span> ( quotajob->error() ) { <a name="l02655"></a>02655 <span class="keywordflow">if</span> ( job->error() == KIO::ERR_UNSUPPORTED_ACTION ) { <a name="l02656"></a>02656 <span class="comment">// that's when the imap server doesn't support quota</span> <a name="l02657"></a>02657 mAccount->setHasNoQuotaSupport(); <a name="l02658"></a>02658 setQuotaInfo( empty ); <a name="l02659"></a>02659 } <a name="l02660"></a>02660 <span class="keywordflow">else</span> <a name="l02661"></a>02661 kdWarning(5006) << <span class="stringliteral">"slotGetQuotaResult: "</span> << job->errorString() << endl; <a name="l02662"></a>02662 } <a name="l02663"></a>02663 <a name="l02664"></a>02664 <span class="keywordflow">if</span> (mAccount->slave()) mAccount->removeJob(job); <a name="l02665"></a>02665 mProgress += 2; <a name="l02666"></a>02666 serverSyncInternal(); <a name="l02667"></a>02667 } <a name="l02668"></a>02668 <a name="l02669"></a>02669 <span class="keywordtype">void</span> <a name="l02670"></a>02670 KMFolderCachedImap::slotAnnotationChanged( <span class="keyword">const</span> QString& entry, <span class="keyword">const</span> QString& attribute, <span class="keyword">const</span> QString& value ) <a name="l02671"></a>02671 { <a name="l02672"></a>02672 Q_UNUSED( attribute ); <a name="l02673"></a>02673 Q_UNUSED( value ); <a name="l02674"></a>02674 <span class="comment">//kdDebug(5006) << k_funcinfo << entry << " " << attribute << " " << value << endl;</span> <a name="l02675"></a>02675 <span class="keywordflow">if</span> ( entry == KOLAB_FOLDERTYPE ) <a name="l02676"></a>02676 mAnnotationFolderTypeChanged = <span class="keyword">false</span>; <a name="l02677"></a>02677 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( entry == KOLAB_INCIDENCESFOR ) { <a name="l02678"></a>02678 mIncidencesForChanged = <span class="keyword">false</span>; <a name="l02679"></a>02679 <span class="comment">// The incidences-for changed, we must trigger the freebusy creation.</span> <a name="l02680"></a>02680 <span class="comment">// HACK: in theory we would need a new enum value for this.</span> <a name="l02681"></a>02681 kmkernel->iCalIface().addFolderChange( folder(), KMailICalIfaceImpl::ACL ); <a name="l02682"></a>02682 } <a name="l02683"></a>02683 } <a name="l02684"></a>02684 <a name="l02685"></a>02685 <span class="keywordtype">void</span> KMFolderCachedImap::slotTestAnnotationResult(KIO::Job *job) <a name="l02686"></a>02686 { <a name="l02687"></a>02687 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l02688"></a>02688 Q_ASSERT( it != mAccount->jobsEnd() ); <a name="l02689"></a>02689 <span class="keywordflow">if</span> ( it == mAccount->jobsEnd() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02690"></a>02690 Q_ASSERT( (*it).parent == folder() ); <a name="l02691"></a>02691 <span class="keywordflow">if</span> ( (*it).parent != folder() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02692"></a>02692 <a name="l02693"></a>02693 mAccount->setAnnotationCheckPassed( <span class="keyword">true</span> ); <a name="l02694"></a>02694 <span class="keywordflow">if</span> ( job->error() ) { <a name="l02695"></a>02695 kdDebug(5006) << <span class="stringliteral">"Test Annotation was not passed, disabling annotation support"</span> << endl; <a name="l02696"></a>02696 mAccount->setHasNoAnnotationSupport( ); <a name="l02697"></a>02697 } <span class="keywordflow">else</span> { <a name="l02698"></a>02698 kdDebug(5006) << <span class="stringliteral">"Test Annotation was passed OK"</span> << endl; <a name="l02699"></a>02699 } <a name="l02700"></a>02700 <span class="keywordflow">if</span> (mAccount->slave()) mAccount->removeJob(job); <a name="l02701"></a>02701 serverSyncInternal(); <a name="l02702"></a>02702 } <a name="l02703"></a>02703 <a name="l02704"></a>02704 <span class="keywordtype">void</span> <a name="l02705"></a>02705 KMFolderCachedImap::slotSetAnnotationResult(KIO::Job *job) <a name="l02706"></a>02706 { <a name="l02707"></a>02707 KMAcctCachedImap::JobIterator it = mAccount->findJob(job); <a name="l02708"></a>02708 <span class="keywordflow">if</span> ( it == mAccount->jobsEnd() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02709"></a>02709 <span class="keywordflow">if</span> ( (*it).parent != folder() ) <span class="keywordflow">return</span>; <span class="comment">// Shouldn't happen</span> <a name="l02710"></a>02710 <a name="l02711"></a>02711 <span class="keywordtype">bool</span> cont = <span class="keyword">true</span>; <a name="l02712"></a>02712 <span class="keywordflow">if</span> ( job->error() ) { <a name="l02713"></a>02713 <span class="comment">// Don't show error if the server doesn't support ANNOTATEMORE and this folder only contains mail</span> <a name="l02714"></a>02714 <span class="keywordflow">if</span> ( job->error() == KIO::ERR_UNSUPPORTED_ACTION && contentsType() == ContentsTypeMail ) <a name="l02715"></a>02715 <span class="keywordflow">if</span> (mAccount->slave()) mAccount->removeJob(job); <a name="l02716"></a>02716 <span class="keywordflow">else</span> <a name="l02717"></a>02717 cont = mAccount->handleJobError( job, i18n( <span class="stringliteral">"Error while setting annotation: "</span> ) + <span class="charliteral">'\n'</span> ); <a name="l02718"></a>02718 } <span class="keywordflow">else</span> { <a name="l02719"></a>02719 <span class="keywordflow">if</span> (mAccount->slave()) mAccount->removeJob(job); <a name="l02720"></a>02720 } <a name="l02721"></a>02721 <span class="keywordflow">if</span> ( cont ) <a name="l02722"></a>02722 serverSyncInternal(); <a name="l02723"></a>02723 } <a name="l02724"></a>02724 <a name="l02725"></a>02725 <span class="keywordtype">void</span> KMFolderCachedImap::slotUpdateLastUid() <a name="l02726"></a>02726 { <a name="l02727"></a>02727 <span class="keywordflow">if</span>( mTentativeHighestUid != 0 ) { <a name="l02728"></a>02728 <a name="l02729"></a>02729 <span class="comment">// Sanity checking:</span> <a name="l02730"></a>02730 <span class="comment">// By now all new mails should be downloaded, which means</span> <a name="l02731"></a>02731 <span class="comment">// that iteration over the folder should yield only UIDs</span> <a name="l02732"></a>02732 <span class="comment">// lower or equal to what we think the highes ist, and the</span> <a name="l02733"></a>02733 <span class="comment">// highest one as well. If not, our notion of the highest</span> <a name="l02734"></a>02734 <span class="comment">// uid we've seen thus far is wrong, which is dangerous, so</span> <a name="l02735"></a>02735 <span class="comment">// don't update the mLastUid, then.</span> <a name="l02736"></a>02736 <span class="keywordtype">bool</span> sane = <span class="keyword">false</span>; <a name="l02737"></a>02737 <a name="l02738"></a>02738 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0;i<count(); i++ ) { <a name="l02739"></a>02739 ulong uid = getMsgBase(i)->UID(); <a name="l02740"></a>02740 <span class="keywordflow">if</span> ( uid > mTentativeHighestUid && uid > lastUid() ) { <a name="l02741"></a>02741 kdWarning(5006) << <span class="stringliteral">"DANGER: Either the server listed a wrong highest uid, "</span> <a name="l02742"></a>02742 <span class="stringliteral">"or we parsed it wrong. Send email to adam@kde.org, please, and include this log."</span> << endl; <a name="l02743"></a>02743 kdWarning(5006) << <span class="stringliteral">"uid: "</span> << uid << <span class="stringliteral">" mTentativeHighestUid: "</span> << mTentativeHighestUid << endl; <a name="l02744"></a>02744 assert( <span class="keyword">false</span> ); <a name="l02745"></a>02745 <span class="keywordflow">break</span>; <a name="l02746"></a>02746 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( uid == mTentativeHighestUid || lastUid() ) { <a name="l02747"></a>02747 <span class="comment">// we've found our highest uid, all is well</span> <a name="l02748"></a>02748 sane = <span class="keyword">true</span>; <a name="l02749"></a>02749 } <span class="keywordflow">else</span> { <a name="l02750"></a>02750 <span class="comment">// must be smaller, that's ok, let's wait for bigger fish</span> <a name="l02751"></a>02751 } <a name="l02752"></a>02752 } <a name="l02753"></a>02753 <span class="keywordflow">if</span> (sane) { <a name="l02754"></a>02754 <span class="preprocessor">#if MAIL_LOSS_DEBUGGING</span> <a name="l02755"></a>02755 <span class="preprocessor"></span> kdDebug(5006) << <span class="stringliteral">"Tentative highest UID test was sane, writing out: "</span> << mTentativeHighestUid << endl; <a name="l02756"></a>02756 <span class="preprocessor">#endif</span> <a name="l02757"></a>02757 <span class="preprocessor"></span> setLastUid( mTentativeHighestUid ); <a name="l02758"></a>02758 } <a name="l02759"></a>02759 } <a name="l02760"></a>02760 mTentativeHighestUid = 0; <a name="l02761"></a>02761 } <a name="l02762"></a>02762 <a name="l02763"></a>02763 <span class="keywordtype">bool</span> KMFolderCachedImap::isMoveable()<span class="keyword"> const</span> <a name="l02764"></a>02764 <span class="keyword"></span>{ <a name="l02765"></a>02765 <span class="keywordflow">return</span> ( hasChildren() == HasNoChildren && <a name="l02766"></a>02766 !folder()->isSystemFolder() ) ? <span class="keyword">true</span> : <span class="keyword">false</span>; <a name="l02767"></a>02767 } <a name="l02768"></a>02768 <a name="l02769"></a>02769 <span class="keywordtype">void</span> KMFolderCachedImap::slotFolderDeletionOnServerFinished() <a name="l02770"></a>02770 { <a name="l02771"></a>02771 <span class="keywordflow">for</span> ( QStringList::const_iterator it = foldersForDeletionOnServer.constBegin(); <a name="l02772"></a>02772 it != foldersForDeletionOnServer.constEnd(); ++it ) { <a name="l02773"></a>02773 KURL url( mAccount->getUrl() ); <a name="l02774"></a>02774 url.setPath( *it ); <a name="l02775"></a>02775 kmkernel->iCalIface().folderDeletedOnServer( url ); <a name="l02776"></a>02776 } <a name="l02777"></a>02777 serverSyncInternal(); <a name="l02778"></a>02778 } <a name="l02779"></a>02779 <a name="l02780"></a>02780 <span class="keywordtype">int</span> KMFolderCachedImap::createIndexFromContentsRecursive() <a name="l02781"></a>02781 { <a name="l02782"></a>02782 <span class="keywordflow">if</span> ( !folder() || !folder()->child() ) <a name="l02783"></a>02783 <span class="keywordflow">return</span> 0; <a name="l02784"></a>02784 <a name="l02785"></a>02785 KMFolderNode *node = 0; <a name="l02786"></a>02786 <span class="keywordflow">for</span>( QPtrListIterator<KMFolderNode> it( *folder()->child() ); (node = it.current()); ++it ) { <a name="l02787"></a>02787 <span class="keywordflow">if</span>( !node->isDir() ) { <a name="l02788"></a>02788 KMFolderCachedImap* storage = <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>(<span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>(node)->storage()); <a name="l02789"></a>02789 kdDebug() << k_funcinfo << <span class="stringliteral">"Re-indexing: "</span> << storage->folder()->label() << endl; <a name="l02790"></a>02790 <span class="keywordtype">int</span> rv = storage->createIndexFromContentsRecursive(); <a name="l02791"></a>02791 <span class="keywordflow">if</span> ( rv > 0 ) <a name="l02792"></a>02792 <span class="keywordflow">return</span> rv; <a name="l02793"></a>02793 } <a name="l02794"></a>02794 } <a name="l02795"></a>02795 <a name="l02796"></a>02796 <span class="keywordflow">return</span> createIndexFromContents(); <a name="l02797"></a>02797 } <a name="l02798"></a>02798 <a name="l02799"></a>02799 <span class="keywordtype">void</span> KMFolderCachedImap::setAlarmsBlocked( <span class="keywordtype">bool</span> blocked ) <a name="l02800"></a>02800 { <a name="l02801"></a>02801 mAlarmsBlocked = blocked; <a name="l02802"></a>02802 } <a name="l02803"></a>02803 <a name="l02804"></a>02804 <span class="keywordtype">bool</span> KMFolderCachedImap::alarmsBlocked()<span class="keyword"> const</span> <a name="l02805"></a>02805 <span class="keyword"></span>{ <a name="l02806"></a>02806 <span class="keywordflow">return</span> mAlarmsBlocked; <a name="l02807"></a>02807 } <a name="l02808"></a>02808 <a name="l02809"></a>02809 <span class="keywordtype">bool</span> KMFolderCachedImap::isCloseToQuota()<span class="keyword"> const</span> <a name="l02810"></a>02810 <span class="keyword"></span>{ <a name="l02811"></a>02811 <span class="keywordtype">bool</span> closeToQuota = <span class="keyword">false</span>; <a name="l02812"></a>02812 <span class="keywordflow">if</span> ( mQuotaInfo.isValid() && mQuotaInfo.max().toInt() > 0 ) { <a name="l02813"></a>02813 <span class="keyword">const</span> <span class="keywordtype">int</span> ratio = mQuotaInfo.current().toInt() * 100 / mQuotaInfo.max().toInt(); <a name="l02814"></a>02814 <span class="comment">//kdDebug(5006) << "Quota ratio: " << ratio << "% " << mQuotaInfo.toString() << endl;</span> <a name="l02815"></a>02815 closeToQuota = ( ratio > 0 && ratio >= GlobalSettings::closeToQuotaThreshold() ); <a name="l02816"></a>02816 } <a name="l02817"></a>02817 <span class="comment">//kdDebug(5006) << "Folder: " << folder()->prettyURL() << " is over quota: " << closeToQuota << endl;</span> <a name="l02818"></a>02818 <span class="keywordflow">return</span> closeToQuota; <a name="l02819"></a>02819 } <a name="l02820"></a>02820 <a name="l02821"></a>02821 KMCommand* KMFolderCachedImap::rescueUnsyncedMessages() <a name="l02822"></a>02822 { <a name="l02823"></a>02823 QValueList<unsigned long> newMsgs = findNewMessages(); <a name="l02824"></a>02824 kdDebug() << k_funcinfo << newMsgs << <span class="stringliteral">" of "</span> << count() << endl; <a name="l02825"></a>02825 <span class="keywordflow">if</span> ( newMsgs.isEmpty() ) <a name="l02826"></a>02826 <span class="keywordflow">return</span> 0; <a name="l02827"></a>02827 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *dest = 0; <a name="l02828"></a>02828 <span class="keywordtype">bool</span> manualMove = <span class="keyword">true</span>; <a name="l02829"></a>02829 <span class="keywordflow">while</span> ( GlobalSettings::autoLostFoundMove() ) { <a name="l02830"></a>02830 <span class="comment">// find the inbox of this account</span> <a name="l02831"></a>02831 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *inboxFolder = kmkernel->findFolderById( QString(<span class="stringliteral">".%1.directory/INBOX"</span>).arg( account()-><span class="keywordtype">id</span>() ) ); <a name="l02832"></a>02832 <span class="keywordflow">if</span> ( !inboxFolder ) { <a name="l02833"></a>02833 kdWarning(5006) << k_funcinfo << <span class="stringliteral">"inbox not found!"</span> << endl; <a name="l02834"></a>02834 <span class="keywordflow">break</span>; <a name="l02835"></a>02835 } <a name="l02836"></a>02836 <a class="code" href="classKMFolderDir.html" title="KMail list that manages the contents of one directory that may contain folders and/or...">KMFolderDir</a> *inboxDir = inboxFolder-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>(); <a name="l02837"></a>02837 <span class="keywordflow">if</span> ( !inboxDir && !inboxFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ) <a name="l02838"></a>02838 <span class="keywordflow">break</span>; <a name="l02839"></a>02839 assert( inboxFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>()-><a class="code" href="classFolderStorage.html#41196efc6926d01bc45fc2d61e97b39a" title="Returns the type of this folder.">folderType</a>() == KMFolderTypeCachedImap ); <a name="l02840"></a>02840 <a name="l02841"></a>02841 <span class="comment">// create lost+found folder if needed</span> <a name="l02842"></a>02842 KMFolderNode *node; <a name="l02843"></a>02843 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *lfFolder = 0; <a name="l02844"></a>02844 <span class="keywordflow">if</span> ( !(node = inboxDir-><a class="code" href="classKMFolderDir.html#50e1a67d4410b3d83f9a0b5ee6fce110" title="Returns folder with given name or zero if it does not exist.">hasNamedFolder</a>( i18n(<span class="stringliteral">"lost+found"</span>) )) ) { <a name="l02845"></a>02845 kdDebug(5006) << k_funcinfo << <span class="stringliteral">"creating lost+found folder"</span> << endl; <a name="l02846"></a>02846 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* folder = kmkernel->dimapFolderMgr()->createFolder( <a name="l02847"></a>02847 i18n(<span class="stringliteral">"lost+found"</span>), <span class="keyword">false</span>, KMFolderTypeCachedImap, inboxDir ); <a name="l02848"></a>02848 <span class="keywordflow">if</span> ( !folder || !folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ) <a name="l02849"></a>02849 <span class="keywordflow">break</span>; <a name="l02850"></a>02850 <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>( folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() )->initializeFrom( <a name="l02851"></a>02851 static_cast<KMFolderCachedImap*>( inboxFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ) ); <a name="l02852"></a>02852 folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>()-><a class="code" href="classFolderStorage.html#289e0f5decbaaa8134472284db60d9f3" title="Set the type of contents held in this folder (mail, calendar, etc.).">setContentsType</a>( KMail::ContentsTypeMail ); <a name="l02853"></a>02853 folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>()-><a class="code" href="classFolderStorage.html#b9819495eefb7713348092932abce37a" title="Write the config file.">writeConfig</a>(); <a name="l02854"></a>02854 lfFolder = folder; <a name="l02855"></a>02855 } <span class="keywordflow">else</span> { <a name="l02856"></a>02856 kdDebug(5006) << k_funcinfo << <span class="stringliteral">"found lost+found folder"</span> << endl; <a name="l02857"></a>02857 lfFolder = <span class="keyword">dynamic_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>( node ); <a name="l02858"></a>02858 } <a name="l02859"></a>02859 <span class="keywordflow">if</span> ( !lfFolder || !lfFolder-><a class="code" href="classKMFolder.html#9342ce04787044b210296c0fbe5e5bd8" title="Create a child folder directory and associates it with this folder.">createChildFolder</a>() || !lfFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ) <a name="l02860"></a>02860 <span class="keywordflow">break</span>; <a name="l02861"></a>02861 <a name="l02862"></a>02862 <span class="comment">// create subfolder for this incident</span> <a name="l02863"></a>02863 QDate today = QDate::currentDate(); <a name="l02864"></a>02864 QString baseName = folder()-><a class="code" href="classKMFolder.html#34f0beec33715f5a7fa6e1dfa11f6aa0" title="Returns the label of the folder for visualization.">label</a>() + <span class="stringliteral">"-"</span> + QString::number( today.year() ) <a name="l02865"></a>02865 + (today.month() < 10 ? <span class="stringliteral">"0"</span> : <span class="stringliteral">""</span> ) + QString::number( today.month() ) <a name="l02866"></a>02866 + (today.day() < 10 ? <span class="stringliteral">"0"</span> : <span class="stringliteral">""</span> ) + QString::number( today.day() ); <a name="l02867"></a>02867 QString name = baseName; <a name="l02868"></a>02868 <span class="keywordtype">int</span> suffix = 0; <a name="l02869"></a>02869 <span class="keywordflow">while</span> ( (node = lfFolder-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()-><a class="code" href="classKMFolderDir.html#50e1a67d4410b3d83f9a0b5ee6fce110" title="Returns folder with given name or zero if it does not exist.">hasNamedFolder</a>( name )) ) { <a name="l02870"></a>02870 ++suffix; <a name="l02871"></a>02871 name = baseName + <span class="charliteral">'-'</span> + QString::number( suffix ); <a name="l02872"></a>02872 } <a name="l02873"></a>02873 kdDebug(5006) << k_funcinfo << <span class="stringliteral">"creating lost+found folder "</span> << name << endl; <a name="l02874"></a>02874 dest = kmkernel->dimapFolderMgr()->createFolder( name, <span class="keyword">false</span>, KMFolderTypeCachedImap, lfFolder-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>() ); <a name="l02875"></a>02875 <span class="keywordflow">if</span> ( !dest || !dest-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ) <a name="l02876"></a>02876 <span class="keywordflow">break</span>; <a name="l02877"></a>02877 <span class="keyword">static_cast<</span>KMFolderCachedImap*<span class="keyword">></span>( dest-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() )->initializeFrom( <a name="l02878"></a>02878 static_cast<KMFolderCachedImap*>( lfFolder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ) ); <a name="l02879"></a>02879 dest-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>()-><a class="code" href="classFolderStorage.html#289e0f5decbaaa8134472284db60d9f3" title="Set the type of contents held in this folder (mail, calendar, etc.).">setContentsType</a>( contentsType() ); <a name="l02880"></a>02880 dest-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>()-><a class="code" href="classFolderStorage.html#b9819495eefb7713348092932abce37a" title="Write the config file.">writeConfig</a>(); <a name="l02881"></a>02881 <a name="l02882"></a>02882 KMessageBox::sorry( 0, i18n(<span class="stringliteral">"<p>There are new messages in folder <b>%1</b>, which "</span> <a name="l02883"></a>02883 <span class="stringliteral">"have not been uploaded to the server yet, but the folder has been deleted "</span> <a name="l02884"></a>02884 <span class="stringliteral">"on the server or you do not "</span> <a name="l02885"></a>02885 <span class="stringliteral">"have sufficient access rights on the folder to upload them.</p>"</span> <a name="l02886"></a>02886 <span class="stringliteral">"<p>All affected messages will therefore be moved to <b>%2</b> "</span> <a name="l02887"></a>02887 <span class="stringliteral">"to avoid data loss.</p>"</span>).arg( folder()->prettyURL() ).arg( dest-><a class="code" href="classKMFolder.html#978272752c47b2a2c0ebef7b3203419d" title="URL of the node for visualization purposes.">prettyURL</a>() ), <a name="l02888"></a>02888 i18n(<span class="stringliteral">"Insufficient access rights"</span>) ); <a name="l02889"></a>02889 manualMove = <span class="keyword">false</span>; <a name="l02890"></a>02890 <span class="keywordflow">break</span>; <a name="l02891"></a>02891 } <a name="l02892"></a>02892 <a name="l02893"></a>02893 <span class="keywordflow">if</span> ( manualMove ) { <a name="l02894"></a>02894 <span class="keyword">const</span> QString msg ( i18n( <span class="stringliteral">"<p>There are new messages in this folder (%1), which "</span> <a name="l02895"></a>02895 <span class="stringliteral">"have not been uploaded to the server yet, but the folder has been deleted "</span> <a name="l02896"></a>02896 <span class="stringliteral">"on the server or you do not "</span> <a name="l02897"></a>02897 <span class="stringliteral">"have sufficient access rights on the folder now to upload them. "</span> <a name="l02898"></a>02898 <span class="stringliteral">"Please contact your administrator to allow upload of new messages "</span> <a name="l02899"></a>02899 <span class="stringliteral">"to you, or move them out of this folder.</p> "</span> <a name="l02900"></a>02900 <span class="stringliteral">"<p>Do you want to move these messages to another folder now?</p>"</span>).arg( folder()->prettyURL() ) ); <a name="l02901"></a>02901 <span class="keywordflow">if</span> ( KMessageBox::warningYesNo( 0, msg, QString::null, i18n(<span class="stringliteral">"Move"</span>), i18n(<span class="stringliteral">"Do Not Move"</span>) ) == KMessageBox::Yes ) { <a name="l02902"></a>02902 KMail::KMFolderSelDlg dlg( kmkernel->getKMMainWidget(), <a name="l02903"></a>02903 i18n(<span class="stringliteral">"Move Messages to Folder"</span>), true ); <a name="l02904"></a>02904 <span class="keywordflow">if</span> ( dlg.exec() ) { <a name="l02905"></a>02905 dest = dlg.folder(); <a name="l02906"></a>02906 } <a name="l02907"></a>02907 } <a name="l02908"></a>02908 } <a name="l02909"></a>02909 <span class="keywordflow">if</span> ( dest ) { <a name="l02910"></a>02910 QPtrList<KMMsgBase> msgs; <a name="l02911"></a>02911 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i < count(); ++i ) { <a name="l02912"></a>02912 KMMsgBase *msg = getMsgBase( i ); <a name="l02913"></a>02913 <span class="keywordflow">if</span>( !msg ) <span class="keywordflow">continue</span>; <span class="comment">/* what goes on if getMsg() returns 0? */</span> <a name="l02914"></a>02914 <span class="keywordflow">if</span> ( msg->UID() == 0 ) <a name="l02915"></a>02915 msgs.append( msg ); <a name="l02916"></a>02916 } <a name="l02917"></a>02917 KMCommand *command = <span class="keyword">new</span> KMMoveCommand( dest, msgs ); <a name="l02918"></a>02918 command->start(); <a name="l02919"></a>02919 <span class="keywordflow">return</span> command; <a name="l02920"></a>02920 } <a name="l02921"></a>02921 <span class="keywordflow">return</span> 0; <a name="l02922"></a>02922 } <a name="l02923"></a>02923 <a name="l02924"></a>02924 <span class="keywordtype">void</span> KMFolderCachedImap::rescueUnsyncedMessagesAndDeleteFolder( <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *folder, <span class="keywordtype">bool</span> root ) <a name="l02925"></a>02925 { <a name="l02926"></a>02926 kdDebug() << k_funcinfo << folder << <span class="stringliteral">" "</span> << root << endl; <a name="l02927"></a>02927 <span class="keywordflow">if</span> ( root ) <a name="l02928"></a>02928 mToBeDeletedAfterRescue.append( folder ); <a name="l02929"></a>02929 folder-><a class="code" href="classKMFolder.html#c12a4bb5f265447d87b3e0e9a9482cc6" title="Open folder for access.">open</a>(<span class="stringliteral">"cachedimap"</span>); <a name="l02930"></a>02930 KMFolderCachedImap* storage = <span class="keyword">dynamic_cast<</span>KMFolderCachedImap*<span class="keyword">></span>( folder-><a class="code" href="classKMFolder.html#4c7476219c137471fb93cb8c88061336">storage</a>() ); <a name="l02931"></a>02931 <span class="keywordflow">if</span> ( storage ) { <a name="l02932"></a>02932 KMCommand *command = storage->rescueUnsyncedMessages(); <a name="l02933"></a>02933 <span class="keywordflow">if</span> ( command ) { <a name="l02934"></a>02934 connect( command, SIGNAL(completed(KMCommand*)), <a name="l02935"></a>02935 SLOT(slotRescueDone(KMCommand*)) ); <a name="l02936"></a>02936 ++mRescueCommandCount; <a name="l02937"></a>02937 } <span class="keywordflow">else</span> { <a name="l02938"></a>02938 <span class="comment">// nothing to rescue, close folder</span> <a name="l02939"></a>02939 <span class="comment">// (we don't need to close it in the other case, it will be deleted anyway)</span> <a name="l02940"></a>02940 folder-><a class="code" href="classKMFolder.html#8d167662bca3ad6315fa5ad67bb9e4dd" title="Close folder.">close</a>(<span class="stringliteral">"cachedimap"</span>); <a name="l02941"></a>02941 } <a name="l02942"></a>02942 } <a name="l02943"></a>02943 <span class="keywordflow">if</span> ( folder-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>() ) { <a name="l02944"></a>02944 KMFolderNode *node = folder-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->first(); <a name="l02945"></a>02945 <span class="keywordflow">while</span> (node) { <a name="l02946"></a>02946 <span class="keywordflow">if</span> (!node->isDir() ) { <a name="l02947"></a>02947 <a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a> *subFolder = <span class="keyword">static_cast<</span><a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>*<span class="keyword">></span>( node ); <a name="l02948"></a>02948 rescueUnsyncedMessagesAndDeleteFolder( subFolder, <span class="keyword">false</span> ); <a name="l02949"></a>02949 } <a name="l02950"></a>02950 node = folder-><a class="code" href="classKMFolder.html#e64663017e257b091a827139446b5c06" title="Returns the folder directory associated with this node or 0 if no such directory...">child</a>()->next(); <a name="l02951"></a>02951 } <a name="l02952"></a>02952 } <a name="l02953"></a>02953 } <a name="l02954"></a>02954 <a name="l02955"></a>02955 <span class="keywordtype">void</span> KMFolderCachedImap::slotRescueDone(KMCommand * command) <a name="l02956"></a>02956 { <a name="l02957"></a>02957 <span class="comment">// FIXME: check command result</span> <a name="l02958"></a>02958 <span class="keywordflow">if</span> ( command ) <a name="l02959"></a>02959 --mRescueCommandCount; <a name="l02960"></a>02960 <span class="keywordflow">if</span> ( mRescueCommandCount > 0 ) <a name="l02961"></a>02961 <span class="keywordflow">return</span>; <a name="l02962"></a>02962 <span class="keywordflow">for</span> ( QValueList<KMFolder*>::ConstIterator it = mToBeDeletedAfterRescue.constBegin(); <a name="l02963"></a>02963 it != mToBeDeletedAfterRescue.constEnd(); ++it ) { <a name="l02964"></a>02964 kmkernel->dimapFolderMgr()->remove( *it ); <a name="l02965"></a>02965 } <a name="l02966"></a>02966 mToBeDeletedAfterRescue.clear(); <a name="l02967"></a>02967 serverSyncInternal(); <a name="l02968"></a>02968 } <a name="l02969"></a>02969 <a name="l02970"></a>02970 <span class="preprocessor">#include "kmfoldercachedimap.moc"</span> </pre></div></div> </div></div> </td> </tr> <tr> <td valign="top" id="leftmenu" width="25%"> <a name="navigation"></a> <div class="menu_box"><h2>kmail</h2> <div class="nav_list"> <ul><li><a href="index.html">Main Page</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="files.html">File List</a></li><li><a href="namespacemembers.html">Namespace Members</a></li><li><a href="functions.html">Class Members</a></li><li><a href="pages.html">Related Pages</a></li></ul> <!-- <h2>Class Picker</h2> <div style="text-align: center;"> <form name="guideform"> <select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value"> <option value="annotated.html">-- Choose --</option> <option value="classAccountUpdater.html">accountupdater</option>, <option value="classAttachmentModifyCommand.html">attachmentmodifycommand</option>, <option value="classFolderStorage.html">folderstorage</option>, <option value="classKCursorSaver.html">kcursorsaver</option>, <option value="classKleo_1_1KeyResolver.html">kleo::keyresolver</option>, <option value="classKListViewIndexedSearchLine.html">klistviewindexedsearchline</option>, <option value="classKMAcctFolder.html">kmacctfolder</option>, <option value="classKMAcctSelDlg.html">kmacctseldlg</option>, <option value="classKMail_1_1AccountComboBox.html">kmail::accountcombobox</option>, <option value="classKMail_1_1AccountManager.html">kmail::accountmanager</option>, <option value="classKMail_1_1ACLEntryDialog.html">kmail::aclentrydialog</option>, <option value="classKMail_1_1ACLJobs_1_1DeleteACLJob.html">kmail::acljobs::deleteacljob</option>, <option value="classKMail_1_1ACLJobs_1_1GetACLJob.html">kmail::acljobs::getacljob</option>, <option value="classKMail_1_1ACLJobs_1_1GetUserRightsJob.html">kmail::acljobs::getuserrightsjob</option>, <option value="classKMail_1_1ACLJobs_1_1MultiSetACLJob.html">kmail::acljobs::multisetacljob</option>, <option value="classKMail_1_1AnnotationJobs_1_1GetAnnotationJob.html">kmail::annotationjobs::getannotationjob</option>, <option value="classKMail_1_1AnnotationJobs_1_1MultiGetAnnotationJob.html">kmail::annotationjobs::multigetannotationjob</option>, <option value="classKMail_1_1AnnotationJobs_1_1MultiSetAnnotationJob.html">kmail::annotationjobs::multisetannotationjob</option>, <option value="classKMail_1_1AnnotationJobs_1_1MultiUrlGetAnnotationJob.html">kmail::annotationjobs::multiurlgetannotationjob</option>, <option value="classKMail_1_1AntiSpamConfig.html">kmail::antispamconfig</option>, <option value="classKMail_1_1AntiSpamWizard.html">kmail::antispamwizard</option>, <option value="classKMail_1_1AntiSpamWizard_1_1ConfigReader.html">kmail::antispamwizard::configreader</option>, <option value="classKMail_1_1AntiSpamWizard_1_1SpamToolConfig.html">kmail::antispamwizard::spamtoolconfig</option>, <option value="classKMail_1_1Callback.html">kmail::callback</option>, <option value="classKMail_1_1CopyFolderJob.html">kmail::copyfolderjob</option>, <option value="classKMail_1_1DictionaryComboBox.html">kmail::dictionarycombobox</option>, <option value="classKMail_1_1EditorWatcher.html">kmail::editorwatcher</option>, <option value="classKMail_1_1FilterImporterExporter.html">kmail::filterimporterexporter</option>, <option value="classKMail_1_1FilterLog.html">kmail::filterlog</option>, <option value="classKMail_1_1FilterLogDialog.html">kmail::filterlogdialog</option>, <option value="classKMail_1_1FolderDiaACLTab.html">kmail::folderdiaacltab</option>, <option value="classKMail_1_1FolderDiaGeneralTab.html">kmail::folderdiageneraltab</option>, <option value="classKMail_1_1FolderDiaQuotaTab.html">kmail::folderdiaquotatab</option>, <option value="classKMail_1_1FolderDiaTab.html">kmail::folderdiatab</option>, <option value="classKMail_1_1FolderDiaTemplatesTab.html">kmail::folderdiatemplatestab</option>, <option value="classKMail_1_1FolderRequester.html">kmail::folderrequester</option>, <option value="classKMail_1_1HeaderItem.html">kmail::headeritem</option>, <option value="classKMail_1_1HeaderStyle.html">kmail::headerstyle</option>, <option value="classKMail_1_1HtmlStatusBar.html">kmail::htmlstatusbar</option>, <option value="classKMail_1_1HtmlWriter.html">kmail::htmlwriter</option>, <option value="classKMail_1_1IdentityDrag.html">kmail::identitydrag</option>, <option value="classKMail_1_1IdentityListView.html">kmail::identitylistview</option>, <option value="classKMail_1_1IdentityListViewItem.html">kmail::identitylistviewitem</option>, <option value="classKMail_1_1Interface_1_1BodyPart.html">kmail::interface::bodypart</option>, <option value="classKMail_1_1Interface_1_1BodyPartFormatterPlugin.html">kmail::interface::bodypartformatterplugin</option>, <option value="classKMail_1_1Interface_1_1BodyPartMemento.html">kmail::interface::bodypartmemento</option>, <option value="classKMail_1_1Interface_1_1BodyPartURLHandler.html">kmail::interface::bodyparturlhandler</option>, <option value="classKMail_1_1Interface_1_1Observable.html">kmail::interface::observable</option>, <option value="classKMail_1_1Interface_1_1Observer.html">kmail::interface::observer</option>, <option value="classKMail_1_1JobScheduler.html">kmail::jobscheduler</option>, <option value="classKMail_1_1ListJob.html">kmail::listjob</option>, <option value="classKMail_1_1MaildirCompactionJob.html">kmail::maildircompactionjob</option>, <option value="classKMail_1_1MailingList.html">kmail::mailinglist</option>, <option value="classKMail_1_1MboxCompactionJob.html">kmail::mboxcompactionjob</option>, <option value="classKMail_1_1MessageActions.html">kmail::messageactions</option>, <option value="classKMail_1_1MessageCopyHelper.html">kmail::messagecopyhelper</option>, <option value="classKMail_1_1PartNodeBodyPart.html">kmail::partnodebodypart</option>, <option value="classKMail_1_1PopAccount.html">kmail::popaccount</option>, <option value="classKMail_1_1QuotaJobs_1_1GetQuotarootJob.html">kmail::quotajobs::getquotarootjob</option>, <option value="classKMail_1_1QuotaJobs_1_1GetStorageQuotaJob.html">kmail::quotajobs::getstoragequotajob</option>, <option value="classKMail_1_1RedirectDialog.html">kmail::redirectdialog</option>, <option value="classKMail_1_1RenameJob.html">kmail::renamejob</option>, <option value="classKMail_1_1RuleWidgetHandler.html">kmail::rulewidgethandler</option>, <option value="classKMail_1_1RuleWidgetHandlerManager.html">kmail::rulewidgethandlermanager</option>, <option value="classKMail_1_1ScheduledCompactionTask.html">kmail::scheduledcompactiontask</option>, <option value="classKMail_1_1ScheduledExpireTask.html">kmail::scheduledexpiretask</option>, <option value="classKMail_1_1ScheduledJob.html">kmail::scheduledjob</option>, <option value="classKMail_1_1ScheduledTask.html">kmail::scheduledtask</option>, <option value="classKMail_1_1SearchJob.html">kmail::searchjob</option>, <option value="classKMail_1_1SearchWindow.html">kmail::searchwindow</option>, <option value="classKMail_1_1SecondaryWindow.html">kmail::secondarywindow</option>, <option value="classKMail_1_1SieveDebugDialog.html">kmail::sievedebugdialog</option>, <option value="classKMail_1_1SortCacheItem.html">kmail::sortcacheitem</option>, <option value="classKMail_1_1SpamHeaderAnalyzer.html">kmail::spamheaderanalyzer</option>, <option value="classKMail_1_1SpamScore.html">kmail::spamscore</option>, <option value="classKMail_1_1TeeHtmlWriter.html">kmail::teehtmlwriter</option>, <option value="classKMail_1_1TransportManager.html">kmail::transportmanager</option>, <option value="classKMail_1_1UndoInfo.html">kmail::undoinfo</option>, <option value="classKMail_1_1URLHandler.html">kmail::urlhandler</option>, <option value="classKMail_1_1URLHandlerManager.html">kmail::urlhandlermanager</option>, <option value="classKMail_1_1Util_1_1LaterDeleter.html">kmail::util::laterdeleter</option>, <option value="classKMailICalIfaceImpl.html">kmailicalifaceimpl</option>, <option value="classKMailIface.html">kmailiface</option>, <option value="classKMDict.html">kmdict</option>, <option value="classKMDictItem.html">kmdictitem</option>, <option value="classKMFilterAction.html">kmfilteraction</option>, <option value="classKMFilterActionDict.html">kmfilteractiondict</option>, <option value="classKMFilterActionWidget.html">kmfilteractionwidget</option>, <option value="classKMFilterActionWithAddress.html">kmfilteractionwithaddress</option>, <option value="classKMFilterActionWithFolder.html">kmfilteractionwithfolder</option>, <option value="classKMFilterActionWithNone.html">kmfilteractionwithnone</option>, <option value="classKMFilterActionWithString.html">kmfilteractionwithstring</option>, <option value="classKMFilterActionWithStringList.html">kmfilteractionwithstringlist</option>, <option value="classKMFilterActionWithUOID.html">kmfilteractionwithuoid</option>, <option value="classKMFilterActionWithUrl.html">kmfilteractionwithurl</option>, <option value="classKMFilterDlg.html">kmfilterdlg</option>, <option value="classKMFilterListBox.html">kmfilterlistbox</option>, <option value="classKMFolder.html">kmfolder</option>, <option value="classKMFolderDialog.html">kmfolderdialog</option>, <option value="classKMFolderDir.html">kmfolderdir</option>, <option value="classKMFolderIndex.html">kmfolderindex</option>, <option value="classKMFolderOpener.html">kmfolderopener</option>, <option value="classKMHeaders.html">kmheaders</option>, <option value="classKMKernel.html">kmkernel</option>, <option value="classKMMenuCommand.html">kmmenucommand</option>, <option value="classKMMessage.html">kmmessage</option>, <option value="classKMMsgDict.html">kmmsgdict</option>, <option value="classKMMsgList.html">kmmsglist</option>, <option value="classKMMsgPartDialog.html">kmmsgpartdialog</option>, <option value="classKMMsgPartDialogCompat.html">kmmsgpartdialogcompat</option>, <option value="classKMPopHeadersView.html">kmpopheadersview</option>, <option value="classKMReaderWin.html">kmreaderwin</option>, <option value="classKMSearchPattern.html">kmsearchpattern</option>, <option value="classKMSearchPatternEdit.html">kmsearchpatternedit</option>, <option value="classKMSearchRule.html">kmsearchrule</option>, <option value="classKMSearchRuleNumerical.html">kmsearchrulenumerical</option>, <option value="classKMSearchRuleStatus.html">kmsearchrulestatus</option>, <option value="classKMSearchRuleString.html">kmsearchrulestring</option>, <option value="classKMSearchRuleWidget.html">kmsearchrulewidget</option>, <option value="classKMSystemTray.html">kmsystemtray</option>, <option value="classMailComposerIface.html">mailcomposeriface</option>, <option value="classScalix_1_1FolderAttributeParser.html">scalix::folderattributeparser</option>, <option value="classSnippetConfig.html">snippetconfig</option>, <option value="classSnippetGroup.html">snippetgroup</option>, <option value="classSnippetItem.html">snippetitem</option>, <option value="classSnippetSettings.html">snippetsettings</option>, <option value="classSnippetWidget.html">snippetwidget</option>, </select> </form> </div> --> </div></div> <div class="menu_box"><h2>API Dox</h2> <div class="nav_list"> <ul> <li><a href="../../akregator/html/index.html">akregator</a></li><li> <a href="../../akregator/src/html/index.html">src</a></li><li> <a href="../../akregator/src/librss/html/index.html">librss</a></li><li><a href="../../certmanager/html/index.html">certmanager</a></li><li> <a href="../../certmanager/lib/html/index.html">lib</a></li><li><a href="../../kaddressbook/html/index.html">kaddressbook</a></li><li><a href="../../kalarm/html/index.html">kalarm</a></li><li> <a href="../../kalarm/lib/html/index.html">lib</a></li><li><a href="../../kandy/html/index.html">kandy</a></li><li><a href="../../karm/html/index.html">karm</a></li><li><a href="../../kdgantt/html/index.html">kdgantt</a></li><li><a href="../../kgantt/html/index.html">kgantt</a></li><li><a href="../../kioslaves/html/index.html">kioslaves</a></li><li> <a href="../../kioslaves/imap4/html/index.html">imap4</a></li><li> <a href="../../kioslaves/mbox/html/index.html">mbox</a></li><li><a href="../../kitchensync/html/index.html">kitchensync</a></li><li><a href="../../kmail/html/index.html">kmail</a></li><li><a href="../../knotes/html/index.html">knotes</a></li><li><a href="../../konsolekalendar/html/index.html">konsolekalendar</a></li><li><a href="../../kontact/html/index.html">kontact</a></li><li><a href="../../korganizer/html/index.html">korganizer</a></li><li><a href="../../kpilot/html/index.html">kpilot</a></li><li> <a href="../../kpilot/kpilot/html/index.html">kpilot</a></li><li> <a href="../../kpilot/lib/html/index.html">lib</a></li><li><a href="../../libemailfunctions/html/index.html">libemailfunctions</a></li><li><a href="../../libkcal/html/index.html">libkcal</a></li><li><a href="../../libkdepim/html/index.html">libkdepim</a></li><li><a href="../../libkholidays/html/index.html">libkholidays</a></li><li><a href="../../libkmime/html/index.html">libkmime</a></li><li><a href="../../libkpgp/html/index.html">libkpgp</a></li><li><a href="../../libkpimidentities/html/index.html">libkpimidentities</a></li> </ul></div></div> </td> </tr> </table> <span class="doNotDisplay"> <a href="http://www.kde.org/" accesskey="8">KDE Home</a> | <a href="http://accessibility.kde.org/" accesskey="9">KDE Accessibility Home</a> | <a href="http://www.kde.org/media/accesskeys.php" accesskey="0">Description of Access Keys</a> </span> <div style="height: 8px"></div> <div id="footer"> <div id="footer_left"> Maintained by <a href="mailto:groot@kde.org">Adriaan de Groot</a> and <a href="mailto:winter@kde.org">Allen Winter</a>. <br/> KDE and K Desktop Environment are trademarks of <a href="http://www.kde.org/areas/kde-ev/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> | <a href="http://www.kde.org/contact/impressum.php">Legal</a> </div> <div id="footer_right"><img src="/media/images/footer_right.png" style="margin: 0px" alt="" /></div> </div> <!-- WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL BE BLOCKED INSTANTLY AND PERMANENTLY! <a href="mailto:aaaatrap-425acc3b5374943f@kde.org">Block me</a> WARNING END --> </body> </html>