kmacctmgr.cpp
00001
00002
00003 #ifdef HAVE_CONFIG_H
00004 #include <config.h>
00005 #endif
00006
00007 #include "kmacctmgr.h"
00008
00009 #include "kmacctmaildir.h"
00010 #include "kmacctlocal.h"
00011 #include "kmacctexppop.h"
00012 #include "kmacctimap.h"
00013 #include "networkaccount.h"
00014 using KMail::NetworkAccount;
00015 #include "kmacctcachedimap.h"
00016 #include "kmbroadcaststatus.h"
00017 #include "kmfiltermgr.h"
00018
00019 #include <klocale.h>
00020 #include <kmessagebox.h>
00021 #include <kdebug.h>
00022 #include <kconfig.h>
00023
00024 #include <qregexp.h>
00025
00026
00027 KMAcctMgr::KMAcctMgr(): QObject()
00028 {
00029 mAcctList.setAutoDelete(TRUE);
00030 mAcctChecking.clear();
00031 mAcctTodo.clear();
00032 mTotalNewMailsArrived=0;
00033 }
00034
00035
00036
00037 KMAcctMgr::~KMAcctMgr()
00038 {
00039 writeConfig(FALSE);
00040 }
00041
00042
00043
00044 void KMAcctMgr::writeConfig(bool withSync)
00045 {
00046 KConfig* config = KMKernel::config();
00047 QString groupName;
00048
00049 KConfigGroupSaver saver(config, "General");
00050 config->writeEntry("accounts", mAcctList.count());
00051
00052
00053 QStringList accountGroups =
00054 config->groupList().grep( QRegExp( "Account \\d+" ) );
00055 for ( QStringList::Iterator it = accountGroups.begin() ;
00056 it != accountGroups.end() ; ++it )
00057 config->deleteGroup( *it );
00058
00059
00060 int i = 1;
00061 for ( QPtrListIterator<KMAccount> it(mAcctList) ;
00062 it.current() ; ++it, ++i ) {
00063 groupName.sprintf("Account %d", i);
00064 KConfigGroupSaver saver(config, groupName);
00065 (*it)->writeConfig(*config);
00066 }
00067 if (withSync) config->sync();
00068 }
00069
00070
00071
00072 void KMAcctMgr::readConfig(void)
00073 {
00074 KConfig* config = KMKernel::config();
00075 KMAccount* acct;
00076 QString acctType, acctName;
00077 QCString groupName;
00078 int i, num;
00079
00080 mAcctList.clear();
00081
00082 KConfigGroup general(config, "General");
00083 num = general.readNumEntry("accounts", 0);
00084
00085 for (i=1; i<=num; i++)
00086 {
00087 groupName.sprintf("Account %d", i);
00088 KConfigGroupSaver saver(config, groupName);
00089 acctType = config->readEntry("Type");
00090
00091 if (acctType == "advanced pop" || acctType == "experimental pop")
00092 acctType = "pop";
00093 acctName = config->readEntry("Name");
00094 if (acctName.isEmpty()) acctName = i18n("Account %1").arg(i);
00095 acct = create(acctType, acctName);
00096 if (!acct) continue;
00097 add(acct);
00098 acct->readConfig(*config);
00099 }
00100 }
00101
00102
00103
00104 void KMAcctMgr::singleCheckMail(KMAccount *account, bool _interactive)
00105 {
00106 newMailArrived = false;
00107 interactive = _interactive;
00108
00109
00110 mAcctTodo.append(account);
00111
00112 if (account->checkingMail())
00113 {
00114 kdDebug() << "account " << account->name() << " busy, queuing" << endl;
00115 return;
00116 }
00117
00118 processNextCheck(false);
00119 }
00120
00121
00122 void KMAcctMgr::processNextCheck(bool _newMail)
00123 {
00124 kdDebug(5006) << "processNextCheck, remaining " << mAcctTodo.count() << endl;
00125 KMAccount *curAccount = 0;
00126 newMailArrived |= _newMail;
00127
00128 KMAccount* acct;
00129 for ( acct = mAcctChecking.first(); acct; acct = mAcctChecking.next() )
00130 {
00131 if ( !acct->checkingMail() )
00132 {
00133
00134 kdDebug(5006) << "account " << acct->name() << " finished check" << endl;
00135 mAcctChecking.removeRef( acct );
00136 kmkernel->filterMgr()->deref();
00137 disconnect( acct, SIGNAL(finishedCheck(bool)),
00138 this, SLOT(processNextCheck(bool)) );
00139 emit checkedMail(newMailArrived, interactive);
00140 }
00141 }
00142 if (mAcctChecking.isEmpty())
00143 {
00144
00145 KMBroadcastStatus::instance()->setStatusMsgTransmissionCompleted(
00146 mTotalNewMailsArrived );
00147 mTotalNewMailsArrived = 0;
00148 }
00149 if (mAcctTodo.isEmpty()) return;
00150 curAccount = mAcctTodo.take(0);
00151
00152 if (curAccount->type() != "imap" && curAccount->type() != "cachedimap" &&
00153 curAccount->folder() == 0)
00154 {
00155 QString tmp = i18n("Account %1 has no mailbox defined!\n"
00156 "Mail checking aborted.\n"
00157 "Check your account settings!")
00158 .arg(curAccount->name());
00159 KMessageBox::information(0,tmp);
00160 emit checkedMail(false, interactive);
00161 mTotalNewMailsArrived = 0;
00162 return;
00163 }
00164
00165 connect( curAccount, SIGNAL(finishedCheck(bool)),
00166 this, SLOT(processNextCheck(bool)) );
00167
00168 KMBroadcastStatus::instance()->setStatusMsg(
00169 i18n("Checking account %1 for new mail").arg(curAccount->name()));
00170
00171 NetworkAccount *nacct = dynamic_cast<NetworkAccount*>( curAccount );
00172
00173
00174
00175 if ( nacct ) {
00176 KMBroadcastStatus::instance()->setUsingSSL( nacct->useSSL() ||
00177 nacct->useTLS() );
00178 }
00179 kdDebug(5006) << "processing next mail check for " << curAccount->name() << endl;
00180
00181 curAccount->setCheckingMail(true);
00182 mAcctChecking.append(curAccount);
00183 kmkernel->filterMgr()->ref();
00184 curAccount->processNewMail(interactive);
00185 }
00186
00187
00188 KMAccount* KMAcctMgr::create(const QString &aType, const QString &aName)
00189 {
00190 KMAccount* act = 0;
00191
00192 if (aType == "local")
00193 act = new KMAcctLocal(this, aName);
00194
00195 if (aType == "maildir")
00196 act = new KMAcctMaildir(this, aName);
00197
00198 else if (aType == "pop")
00199 act = new KMAcctExpPop(this, aName);
00200
00201 else if (aType == "imap")
00202 act = new KMAcctImap(this, aName);
00203
00204 else if (aType == "cachedimap")
00205 act = new KMAcctCachedImap(this, aName);
00206
00207 if (act)
00208 {
00209 act->setFolder(kmkernel->inboxFolder());
00210 connect( act, SIGNAL(newMailsProcessed(int)),
00211 this, SLOT(addToTotalNewMailCount(int)) );
00212 }
00213
00214 return act;
00215 }
00216
00217
00218
00219 void KMAcctMgr::add(KMAccount *account)
00220 {
00221 if (account)
00222 mAcctList.append(account);
00223 }
00224
00225
00226
00227 KMAccount* KMAcctMgr::find(const QString &aName)
00228 {
00229 KMAccount* cur;
00230
00231 if (aName.isEmpty()) return 0;
00232
00233 for (cur=mAcctList.first(); cur; cur=mAcctList.next())
00234 {
00235 if (cur->name() == aName) return cur;
00236 }
00237
00238 return 0;
00239 }
00240
00241
00242
00243 KMAccount* KMAcctMgr::first(void)
00244 {
00245 return mAcctList.first();
00246 }
00247
00248
00249
00250 KMAccount* KMAcctMgr::next(void)
00251 {
00252 return mAcctList.next();
00253 }
00254
00255
00256
00257 bool KMAcctMgr::remove( KMAccount* acct )
00258 {
00259
00260 if( !acct )
00261 return false;
00262 mAcctList.removeRef( acct );
00263 emit accountRemoved( acct );
00264 return true;
00265 }
00266
00267
00268 void KMAcctMgr::checkMail(bool _interactive)
00269 {
00270 newMailArrived = false;
00271
00272 if (mAcctList.isEmpty())
00273 {
00274 KMessageBox::information(0,i18n("You need to add an account in the network "
00275 "section of the settings in order to "
00276 "receive mail."));
00277 return;
00278 }
00279
00280 mTotalNewMailsArrived=0;
00281
00282 for ( QPtrListIterator<KMAccount> it(mAcctList) ;
00283 it.current() ; ++it )
00284 {
00285 if (!it.current()->checkExclude())
00286 singleCheckMail(it.current(), _interactive);
00287 }
00288 }
00289
00290
00291
00292 void KMAcctMgr::singleInvalidateIMAPFolders(KMAccount *account) {
00293 account->invalidateIMAPFolders();
00294 }
00295
00296
00297 void KMAcctMgr::invalidateIMAPFolders()
00298 {
00299 if (mAcctList.isEmpty()) {
00300 KMessageBox::information(0,i18n("You need to add an account in the network "
00301 "section of the settings in order to "
00302 "receive mail."));
00303 return;
00304 }
00305
00306 for ( QPtrListIterator<KMAccount> it(mAcctList) ; it.current() ; ++it )
00307 singleInvalidateIMAPFolders(it.current());
00308 }
00309
00310
00311
00312 QStringList KMAcctMgr::getAccounts(bool noImap) {
00313
00314 KMAccount *cur;
00315 QStringList strList;
00316 for (cur=mAcctList.first(); cur; cur=mAcctList.next()) {
00317 if (!noImap || cur->type() != "imap") strList.append(cur->name());
00318 }
00319
00320 return strList;
00321
00322 }
00323
00324
00325 void KMAcctMgr::intCheckMail(int item, bool _interactive)
00326 {
00327 KMAccount* cur;
00328 newMailArrived = false;
00329
00330 mTotalNewMailsArrived = 0;
00331 int x = 0;
00332 cur = mAcctList.first();
00333 while (cur)
00334 {
00335 x++;
00336 if (x > item) break;
00337 cur=mAcctList.next();
00338 }
00339
00340 singleCheckMail(cur, _interactive);
00341 }
00342
00343
00344
00345 void KMAcctMgr::addToTotalNewMailCount(int newmails)
00346 {
00347 if ( newmails == -1 ) mTotalNewMailsArrived = -1;
00348 if ( mTotalNewMailsArrived == -1 ) return;
00349 mTotalNewMailsArrived += newmails;
00350 }
00351
00352
00353 #include "kmacctmgr.moc"
This file is part of the documentation for kmail Library Version 3.2.2.