You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
7.5 KiB
306 lines
7.5 KiB
/*
|
|
KNode, the KDE newsreader
|
|
Copyright (c) 1999-2005 the KNode authors.
|
|
See file AUTHORS for details
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software Foundation,
|
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <tqdir.h>
|
|
|
|
#include <kdebug.h>
|
|
#include <ksimpleconfig.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <kstandarddirs.h>
|
|
#include <kwallet.h>
|
|
|
|
#include "kngroupmanager.h"
|
|
#include "knnntpaccount.h"
|
|
#include "knglobals.h"
|
|
#include "knconfigmanager.h"
|
|
#include "utilities.h"
|
|
#include "knaccountmanager.h"
|
|
#include "knfoldermanager.h"
|
|
|
|
KWallet::Wallet* KNAccountManager::mWallet = 0;
|
|
bool KNAccountManager::mWalletOpenFailed = false;
|
|
|
|
KNAccountManager::KNAccountManager(KNGroupManager *gm, TQObject * tqparent, const char * name)
|
|
: TQObject(tqparent, name), gManager(gm), c_urrentAccount(0),
|
|
mAsyncOpening( false )
|
|
{
|
|
s_mtp = new KNServerInfo();
|
|
s_mtp->setType(KNServerInfo::STsmtp);
|
|
s_mtp->setId(0);
|
|
KConfig *conf = knGlobals.config();
|
|
conf->setGroup("MAILSERVER");
|
|
s_mtp->readConf(conf);
|
|
|
|
loadAccounts();
|
|
}
|
|
|
|
|
|
KNAccountManager::~KNAccountManager()
|
|
{
|
|
TQValueList<KNNntpAccount*>::Iterator it;
|
|
for ( it = mAccounts.begin(); it != mAccounts.end(); ++it )
|
|
delete (*it);
|
|
mAccounts.clear();
|
|
delete s_mtp;
|
|
delete mWallet;
|
|
mWallet = 0;
|
|
}
|
|
|
|
|
|
void KNAccountManager::prepareShutdown()
|
|
{
|
|
TQValueList<KNNntpAccount*>::Iterator it;
|
|
for ( it = mAccounts.begin(); it != mAccounts.end(); ++it )
|
|
(*it)->saveInfo();
|
|
}
|
|
|
|
|
|
void KNAccountManager::loadAccounts()
|
|
{
|
|
TQString dir(locateLocal("data","knode/"));
|
|
if (dir.isNull()) {
|
|
KNHelper::displayInternalFileError();
|
|
return;
|
|
}
|
|
TQDir d(dir);
|
|
KNNntpAccount *a;
|
|
TQStringList entries(d.entryList("nntp.*", TQDir::Dirs));
|
|
|
|
TQStringList::Iterator it;
|
|
for(it = entries.begin(); it != entries.end(); ++it) {
|
|
a = new KNNntpAccount();
|
|
if (a->readInfo(dir+(*it) + "/info")) {
|
|
mAccounts.append(a);
|
|
gManager->loadGroups(a);
|
|
emit accountAdded(a);
|
|
} else {
|
|
delete a;
|
|
kdError(5003) << "Unable to load account " << (*it) << "!" << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
KNNntpAccount* KNAccountManager::account( int id )
|
|
{
|
|
if ( id <= 0 )
|
|
return 0;
|
|
TQValueList<KNNntpAccount*>::ConstIterator it;
|
|
for ( it = mAccounts.begin(); it != mAccounts.end(); ++it )
|
|
if ( (*it)->id() == id )
|
|
return *it;
|
|
return 0;
|
|
}
|
|
|
|
|
|
void KNAccountManager::setCurrentAccount(KNNntpAccount *a)
|
|
{
|
|
c_urrentAccount = a;
|
|
}
|
|
|
|
|
|
// a is new account allocated and configured by the caller
|
|
bool KNAccountManager::newAccount(KNNntpAccount *a)
|
|
{
|
|
// find a unused id for the new account...
|
|
TQString dir(locateLocal("data","knode/"));
|
|
if (dir.isNull()) {
|
|
delete a;
|
|
KNHelper::displayInternalFileError();
|
|
return false;
|
|
}
|
|
TQDir d(dir);
|
|
TQStringList entries(d.entryList("nntp.*", TQDir::Dirs));
|
|
|
|
int id = 1;
|
|
while (entries.tqfindIndex(TQString("nntp.%1").tqarg(id))!=-1)
|
|
++id;
|
|
|
|
a->setId(id);
|
|
|
|
dir = locateLocal("data",TQString("knode/nntp.%1/").tqarg(a->id()));
|
|
if (!dir.isNull()) {
|
|
mAccounts.append(a);
|
|
emit(accountAdded(a));
|
|
return true;
|
|
} else {
|
|
delete a;
|
|
KMessageBox::error(knGlobals.topWidget, i18n("Cannot create a folder for this account."));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
// a==0: remove current account
|
|
bool KNAccountManager::removeAccount(KNNntpAccount *a)
|
|
{
|
|
if(!a) a=c_urrentAccount;
|
|
if(!a) return false;
|
|
|
|
TQValueList<KNGroup*> lst;
|
|
if(knGlobals.folderManager()->unsentForAccount(a->id()) > 0) {
|
|
KMessageBox::sorry(knGlobals.topWidget, i18n("This account cannot be deleted since there are some unsent messages for it."));
|
|
}
|
|
else if(KMessageBox::warningContinueCancel(knGlobals.topWidget, i18n("Do you really want to delete this account?"),"",KGuiItem(i18n("&Delete"),"editdelete"))==KMessageBox::Continue) {
|
|
lst = gManager->groupsOfAccount( a );
|
|
for ( TQValueList<KNGroup*>::Iterator it = lst.begin(); it != lst.end(); ++it ) {
|
|
if ( (*it)->isLocked() ) {
|
|
KMessageBox::sorry(knGlobals.topWidget, i18n("At least one group of this account is currently in use.\nThe account cannot be deleted at the moment."));
|
|
return false;
|
|
}
|
|
}
|
|
for ( TQValueList<KNGroup*>::Iterator it = lst.begin(); it != lst.end(); ++it )
|
|
gManager->unsubscribeGroup( (*it) );
|
|
|
|
TQDir dir(a->path());
|
|
if (dir.exists()) {
|
|
const TQFileInfoList *list = dir.entryInfoList(); // get list of matching files and delete all
|
|
if (list) {
|
|
TQFileInfoListIterator it( *list );
|
|
while (it.current()) {
|
|
dir.remove(it.current()->fileName());
|
|
++it;
|
|
}
|
|
}
|
|
dir.cdUp(); // directory should now be empty, deleting it
|
|
dir.rmdir(TQString("nntp.%1/").tqarg(a->id()));
|
|
}
|
|
|
|
if(c_urrentAccount==a) setCurrentAccount(0);
|
|
|
|
emit(accountRemoved(a));
|
|
mAccounts.remove( a ); // finally delete a
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
void KNAccountManager::editProperties(KNNntpAccount *a)
|
|
{
|
|
if(!a) a=c_urrentAccount;
|
|
if(!a) return;
|
|
|
|
a->editProperties(knGlobals.topWidget);
|
|
emit(accountModified(a));
|
|
}
|
|
|
|
|
|
void KNAccountManager::accountRenamed(KNNntpAccount *a)
|
|
{
|
|
if(!a) a=c_urrentAccount;
|
|
if(!a) return;
|
|
|
|
emit(accountModified(a));
|
|
}
|
|
|
|
|
|
KNNntpAccount* KNAccountManager::first() const
|
|
{
|
|
if ( mAccounts.isEmpty() )
|
|
return 0;
|
|
return mAccounts.first();
|
|
}
|
|
|
|
|
|
void KNAccountManager::loadPasswordsAsync()
|
|
{
|
|
if ( !mWallet && !mWalletOpenFailed ) {
|
|
if ( knGlobals.top )
|
|
mWallet = Wallet::openWallet( Wallet::NetworkWallet(),
|
|
knGlobals.topWidget->tqtopLevelWidget()->winId(),
|
|
Wallet::Asynchronous );
|
|
else
|
|
mWallet = Wallet::openWallet( Wallet::NetworkWallet(), 0, Wallet::Asynchronous );
|
|
if ( mWallet ) {
|
|
connect( mWallet, TQT_SIGNAL(walletOpened(bool)), TQT_SLOT(slotWalletOpened(bool)) );
|
|
mAsyncOpening = true;
|
|
}
|
|
else {
|
|
mWalletOpenFailed = true;
|
|
loadPasswords();
|
|
}
|
|
return;
|
|
}
|
|
if ( mWallet && !mAsyncOpening )
|
|
loadPasswords();
|
|
}
|
|
|
|
|
|
void KNAccountManager::loadPasswords()
|
|
{
|
|
s_mtp->readPassword();
|
|
TQValueList<KNNntpAccount*>::Iterator it;
|
|
for ( it = mAccounts.begin(); it != mAccounts.end(); ++it )
|
|
(*it)->readPassword();
|
|
emit passwordsChanged();
|
|
}
|
|
|
|
|
|
KWallet::Wallet* KNAccountManager::wallet()
|
|
{
|
|
if ( mWallet && mWallet->isOpen() )
|
|
return mWallet;
|
|
|
|
if ( !Wallet::isEnabled() || mWalletOpenFailed )
|
|
return 0;
|
|
|
|
delete mWallet;
|
|
if ( knGlobals.top )
|
|
mWallet = Wallet::openWallet( Wallet::NetworkWallet(),
|
|
knGlobals.topWidget->tqtopLevelWidget()->winId() );
|
|
else
|
|
mWallet = Wallet::openWallet( Wallet::NetworkWallet() );
|
|
|
|
if ( !mWallet ) {
|
|
mWalletOpenFailed = true;
|
|
return 0;
|
|
}
|
|
|
|
prepareWallet();
|
|
return mWallet;
|
|
}
|
|
|
|
|
|
void KNAccountManager::prepareWallet()
|
|
{
|
|
if ( !mWallet )
|
|
return;
|
|
if ( !mWallet->hasFolder("knode") )
|
|
mWallet->createFolder( "knode" );
|
|
mWallet->setFolder( "knode" );
|
|
}
|
|
|
|
|
|
void KNAccountManager::slotWalletOpened( bool success )
|
|
{
|
|
mAsyncOpening = false;
|
|
if ( !success ) {
|
|
mWalletOpenFailed = true;
|
|
delete mWallet;
|
|
mWallet = 0;
|
|
} else {
|
|
prepareWallet();
|
|
}
|
|
loadPasswords();
|
|
}
|
|
|
|
//--------------------------------
|
|
|
|
#include "knaccountmanager.moc"
|