summaryrefslogtreecommitdiffstats
path: root/kshowmail/configlist.cpp
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-07-24 15:57:00 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-07-24 15:57:00 -0500
commitb888c7edb54e483ec0e3c2e2ce0eafd73acdcc65 (patch)
tree7ca76d42f66fb21ea08142de9a8d3bf16e597404 /kshowmail/configlist.cpp
downloadkshowmail-b888c7edb54e483ec0e3c2e2ce0eafd73acdcc65.tar.gz
kshowmail-b888c7edb54e483ec0e3c2e2ce0eafd73acdcc65.zip
Initial import from kshowmail 3.3.1 sources
Diffstat (limited to 'kshowmail/configlist.cpp')
-rw-r--r--kshowmail/configlist.cpp1203
1 files changed, 1203 insertions, 0 deletions
diff --git a/kshowmail/configlist.cpp b/kshowmail/configlist.cpp
new file mode 100644
index 0000000..0098550
--- /dev/null
+++ b/kshowmail/configlist.cpp
@@ -0,0 +1,1203 @@
+/***************************************************************************
+ configlist.cpp - description
+ -------------------
+ begin : Tue May 9 2000
+ copyright : (C) 2000-2001 by Eggert Ehmke
+ email : eggert.ehmke@berlin.de
+
+ 26 Sep 2002 - Allow for columns to be hidden. Allistar Melville
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <qfile.h>
+
+#include <kconfig.h>
+#include <ksavefile.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kaudioplayer.h>
+#include <kdebug.h>
+
+#include "configlist.h"
+
+ConfigList::ConfigList() : QObject()
+{
+ setAutoDelete (true);
+
+ //assume, no window to show a mail is open at beginning
+ ctrOpenMessageWindows = 0;
+
+ //set default values
+ m_bShowMessage = DEFAULT_ACTION_NEW_MAIL_ALERTWINDOW;
+ m_bShowMainWindow = DEFAULT_ACTION_NEW_MAIL_MAINWINDOW;
+ m_bBeep = DEFAULT_ACTION_NEW_MAIL_BEEP;
+ m_bSound = DEFAULT_ACTION_NEW_MAIL_SOUND;
+ m_bCommand = DEFAULT_ACTION_NEW_MAIL_COMMAND;
+ m_bMinimize = DEFAULT_ACTION_NO_NEW_MAIL_MINIMIZE;
+ m_bTerminate = DEFAULT_ACTION_NO_NEW_MAIL_TERMINATE;
+
+ m_bConfirmClose = DEFAULT_CONFIRM_CLOSE;
+ m_bConfirmDelete = DEFAULT_CONFIRM_DELETE;
+ m_bStartMinimized = DEFAULT_START_MINIMIZED;
+ m_bCloseMinimizes = DEFAULT_CLOSE_TO_TRAY;
+ m_bMinimizeToTray = DEFAULT_MINIMIZE_TO_TRAY;
+ m_bShowConnectionErrors = DEFAULT_SHOW_CONNECTION_ERRORS;
+ m_bKeepNew = DEFAULT_KEEP_NEW;
+ m_nInitTimer = DEFAULT_INITIAL_TIME;
+ m_nIntervalTimer = DEFAULT_INTERVAL_TIME;
+ m_nPop3Timer = DEFAULT_TIMEOUT_TIME;
+
+}
+
+int ConfigList::compareItems( QCollection::Item item1, QCollection::Item item2 )
+{
+ ConfigElem* p1 = (ConfigElem*)item1;
+ ConfigElem* p2 = (ConfigElem*)item2;
+
+ return strcmp( p1->getAccountName(), p2->getAccountName() );
+}
+
+QCollection::Item ConfigList::newItem( QCollection::Item item )
+{
+ return new ConfigElem( (ConfigElem*)item );
+}
+
+void ConfigList::saveOptions ()
+{
+ kdDebug () << "ConfigList::saveOptions" << endl;
+
+ //create XML document
+ QDomDocument doc( "KShowmail" );
+
+ //create root element
+ QDomElement accounts = doc.createElement( ROOT_ELEMENT );
+
+ //create for every account an element
+ //the account saves its mails into this element
+ //after that the element will be appended to the root element
+ int i = 0;
+ ConfigElem* account = NULL; //current processed account
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ //save mails
+ QDomElement accElem = doc.createElement( QString( ACCOUNT_ELEMENT ) + QString( "%1" ).arg( i++ ) );
+ account->saveOptions( doc, accElem ); //account saves the mails into given XML document and the setup into the application config file
+ accounts.appendChild( accElem );
+
+ }
+
+ //append root element to XML document
+ doc.appendChild( accounts );
+
+ //save XML document
+ QCString str = doc.toCString(); //convert XML document to a string
+ QString cachefilename = locateLocal( "config", MAIL_FILE ); //get file path
+ KSaveFile file( cachefilename, 0600 ); //create file
+
+ if( file.status() != 0 )
+ {
+ kdError() << "Couldn't save mail cache. " << strerror( file.status() );
+ return;
+ }
+
+ //write data
+ file.file()->writeBlock( str.data(), str.length() );
+
+ //close file
+ if( !file.close() )
+ {
+ kdError () << "Couldn't save mail cache. " << strerror(file.status());
+ return;
+ }
+}
+
+
+void ConfigList::setList (QListView* list)
+{
+ QPixmap pix (::locate ("data", "kshowmail/pics/ok.png"));
+ list->clear ();
+ int nIndex = at ();
+ QListViewItem* last = NULL;
+ for (ConfigElem* pElem = first(); pElem; pElem = next())
+ {
+ last = new QListViewItem (list, last, "", pElem->getAccountName(), pElem->getURL().host(), pElem->getURL().user(), "?");
+ pElem->setListViewItem( last );
+ if (pElem->isActive())
+ pElem->getListViewItem()->setPixmap (0, pix);
+ }
+
+ if (nIndex >= 0)
+ {
+ at (nIndex);
+// list->setCurrentItem (nIndex);
+ }
+}
+
+
+bool ConfigList::setItem (const char* item)
+{
+ int nPos = at ();
+ ConfigElem* pActive = new ConfigElem (this, item);
+ bool result = (find (pActive) >= 0);
+ delete pActive;
+ if (result)
+ return true;
+ else
+ {
+ at (nPos);
+ return false;
+ }
+}
+
+void ConfigList::beep ()
+{
+ if (m_bBeep)
+ kapp->beep ();
+}
+
+void ConfigList::playSound ()
+{
+ if (m_bSound)
+ playSound (m_strSoundFile);
+}
+
+void ConfigList::playSound (const char* file)
+{
+ KAudioPlayer::play(file);
+}
+
+int ConfigList::getRefreshTimeInterval( ) const
+{
+ return m_nIntervalTimer;
+}
+
+void ConfigList::setRefreshTimeInterval( unsigned int interval )
+{
+ m_nIntervalTimer = interval;
+}
+
+bool ConfigList::AutoRefreshOn( ) const
+{
+ return ( m_nIntervalTimer > 0 );
+}
+
+bool ConfigList::hasActiveAccounts( )
+{
+ bool activeAccountFound = false; //when a active account was found, this will be set to TRUE
+ ConfigElem* currentAccount; //saved current account
+ ConfigElem* Account; //used by the search
+
+ //save the current account
+ currentAccount = current();
+
+ //get the first account
+ Account = first();
+
+ //looking for an active account
+ while( Account != NULL && !activeAccountFound )
+ {
+ //have we found one?
+ activeAccountFound = Account->isActive();
+
+ //get next account
+ Account = next();
+ }
+
+ //set the saved account to current
+ if( currentAccount != NULL )
+ findRef( currentAccount );
+
+ //return the result
+ return activeAccountFound;
+}
+
+
+uint ConfigList::getTimeoutTime( ) const
+{
+ return m_nPop3Timer;
+}
+
+void ConfigList::setTimeoutTime( uint time )
+{
+ if( time < MINIMUM_TIMEOUT_TIME )
+ m_nPop3Timer = MINIMUM_TIMEOUT_TIME;
+ else
+ m_nPop3Timer = time;
+}
+
+ConfigElem* ConfigList::getSelectedAccount( )
+{
+ //get the first account in the list
+ ConfigElem* account = first();
+
+ //return NULL if there are no accounts
+ if( account == NULL )
+ return NULL;
+
+ //return the account, if it is selected
+ if( account->isSelected() )
+ return account;
+
+ //iterate over all accounts
+ bool selectedAccountFound = false; //is TRUE, if a selected account was found
+ while( account != NULL && !selectedAccountFound )
+ {
+ //get next account
+ account = next();
+
+ //is the account selected?
+ if( account != NULL )
+ selectedAccountFound = account->isSelected();
+ else
+ selectedAccountFound = false;
+ }
+
+ //return the current account if we have found a selected account
+ //otherwise return FALSE
+ if( selectedAccountFound )
+ return account;
+ else
+ return NULL;
+}
+
+void ConfigList::deleteSelectedMails( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+
+ //clear the map, which contains the names of the accounts,
+ //which have gotten an order to delete
+ AccountDeletionMap.clear();
+
+ //refresh connects
+ connectAccounts();
+
+ //inserts an item for every account which will get an order to delete
+ //its selected mails. The key is the account name and the data is TRUE.
+ //it is important to do this in a seperate iteration because this avoids
+ //race conditions
+ while( ( account = it.current() ) != NULL )
+ {
+ //insert item
+ AccountDeletionMap.insert( account->getAccountName(), true );
+
+ //get next account
+ ++it;
+ }
+
+ //order all accounts to delete its selected mail
+ it.toFirst();
+ while( ( account = it.current() ) != NULL )
+ {
+ account->deleteSelectedMails();
+
+ //get next account
+ ++it;
+ }
+}
+
+void ConfigList::slotAccountConfigChanged( )
+{
+ emit sigConfigChanged();
+}
+
+void ConfigList::slotCheckDeletionState( QString account )
+{
+ bool accountDeleting = false; //set to TRUE if an account is still deleting
+ AccountTaskMap_Type::Iterator it; //iterator over the account deletion map
+
+ //set the appropriate item in AccountDeletionMap to FALSE
+ AccountDeletionMap[ account ] = false;
+
+ //iterate over the account deletion map to check, whether all accounts
+ //are ready
+ for ( it = AccountDeletionMap.begin(); it != AccountDeletionMap.end(); ++it )
+ {
+ if( *it == true )
+ accountDeleting = true;
+ }
+
+ //emit sigDeleteReady if all accounts are ready
+ if( !accountDeleting )
+ emit sigDeleteReady();
+}
+
+void ConfigList::connectAccounts( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to connect
+
+ while( ( account = it.current() ) != NULL )
+ {
+ //disconnect old connections
+ account->disconnect();
+
+ //connect
+ connect( account, SIGNAL( sigConfigChanged() ), this, SLOT( slotAccountConfigChanged() ) );
+ connect( account, SIGNAL( sigDeleteReady( QString ) ), this, SLOT( slotCheckDeletionState( QString ) ) );
+ connect( account, SIGNAL( sigShowBodiesReady( QString ) ), this, SLOT( slotCheckShowBodiesState( QString ) ) );
+ connect( account, SIGNAL( sigMessageWindowOpened() ), this, SLOT( slotMessageWindowOpened() ) );
+ connect( account, SIGNAL( sigMessageWindowClosed() ), this, SLOT( slotMessageWindowClosed() ) );
+ connect( account, SIGNAL( sigRefreshReady( QString ) ), this, SLOT( slotCheckRefreshState( QString ) ) );
+
+ //get next account
+ ++it;
+ }
+}
+
+void ConfigList::setConfirmDeletion( bool confirm )
+{
+ m_bConfirmDelete = confirm;
+}
+
+bool ConfigList::confirmDeletion( )
+{
+ return m_bConfirmDelete;
+}
+
+QStringList ConfigList::getSelectedSubjects( ) const
+{
+ QStringList subjects; //contains all subjects
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //current account
+
+ while( ( account = it.current() ) != NULL )
+ {
+ //get subjects of the current account and append them to the list
+ subjects += account->getSelectedSubjects();
+
+ //get next account
+ ++it;
+ }
+
+ return subjects;
+}
+
+bool ConfigList::hasSelectedMails( )
+{
+ bool foundSelected = false; //set to TRUE, when an account with selected mails was found
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //current account
+
+ while( ( account = it.current() ) != NULL && !foundSelected )
+ {
+ foundSelected = account->hasSelectedMails();
+
+ //get next account
+ ++it;
+ }
+
+ return foundSelected;
+
+}
+
+void ConfigList::showSelectedMails( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+
+ //clear the map, which contains the names of the accounts,
+ //which have gotten an order to show mails
+ AccountShowBodiesMap.clear();
+
+ //refresh connects
+ connectAccounts();
+
+ //inserts an item for every account which will get an order to show
+ //its selected mails. The key is the account name and the data is TRUE.
+ //it is important to do this in a seperate iteration because this avoids
+ //race conditions
+ while( ( account = it.current() ) != NULL )
+ {
+ //insert item
+ AccountShowBodiesMap.insert( account->getAccountName(), true );
+
+ //get next account
+ ++it;
+ }
+
+ //order all accounts to show its selected mail
+ it.toFirst();
+ while( ( account = it.current() ) != NULL )
+ {
+ account->showSelectedMails();
+
+ //get next account
+ ++it;
+ }
+
+}
+
+void ConfigList::slotCheckShowBodiesState( QString account )
+{
+ bool accountDownloading = false; //set to TRUE if an account is downloading mail body yet
+ AccountTaskMap_Type::Iterator it; //iterator over the account map
+
+ //set the appropriate item in AccountShowBodiesMap to FALSE
+ AccountShowBodiesMap[ account ] = false;
+
+ //iterate over the account map to check, whether all accounts
+ //are ready
+ for ( it = AccountShowBodiesMap.begin(); it != AccountShowBodiesMap.end(); ++it )
+ {
+ if( *it == true )
+ accountDownloading = true;
+ }
+
+ //emit sigShowBodiesReady if all accounts are ready
+ //and assume all windows to show the mails are closed
+ if( !accountDownloading )
+ {
+ emit sigShowBodiesReady();
+ ctrOpenMessageWindows = 0;
+ }
+}
+
+void ConfigList::setAllowHTML( bool allowHTML )
+{
+ m_bAllowHTML = allowHTML;
+}
+
+bool ConfigList::allowHTML( ) const
+{
+ return m_bAllowHTML;
+}
+
+void ConfigList::slotMessageWindowOpened( )
+{
+ //increment the window counter
+ ctrOpenMessageWindows++;
+
+ //if the counter was incremented from zero
+ //(the first window was opened), emit the
+ //signal
+ if( ctrOpenMessageWindows == 1 )
+ emit sigMessageWindowOpened();
+}
+
+void ConfigList::slotMessageWindowClosed( )
+{
+ //decrement the window counter
+ ctrOpenMessageWindows--;
+ if( ctrOpenMessageWindows < 0 )
+ ctrOpenMessageWindows = 0;
+
+ //if counter is zero (all windows was closed),
+ //emit signal
+ if( ctrOpenMessageWindows == 0 )
+ emit sigAllMessageWindowsClosed();
+}
+
+void ConfigList::refreshMailLists( FilterLog* log )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+
+ //return, if no accounts available
+ if( count() == 0 )
+ {
+ emit sigRefreshReady();
+ return;
+ }
+
+ //clear the map, which contains the names of the accounts,
+ //which have gotten an order to show mails
+ AccountRefreshMap.clear();
+
+ //refresh connects
+ connectAccounts();
+
+ //inserts an item for every account which will get an order to refresh
+ //its mail list. The key is the account name and the data is TRUE.
+ //it is important to do this in a seperate iteration because this avoids
+ //race conditions
+ while( ( account = it.current() ) != NULL )
+ {
+ //insert item
+ AccountRefreshMap.insert( account->getAccountName(), true );
+
+ //get next account
+ ++it;
+ }
+
+ //order all accounts to refresh their mail lists
+ it.toFirst();
+ while( ( account = it.current() ) != NULL )
+ {
+ account->refreshMailList( log );
+
+ //get next account
+ ++it;
+ }
+
+}
+
+void ConfigList::slotCheckRefreshState( QString account )
+{
+ bool accountRefreshing = false; //set to TRUE if an account is still refreshing
+ AccountTaskMap_Type::Iterator it; //iterator over the account map
+
+ //set the appropriate item in AccountRefreshMap to FALSE
+ AccountRefreshMap[ account ] = false;
+
+ //iterate over the account map to check whether all accounts
+ //are ready
+ for ( it = AccountRefreshMap.begin(); it != AccountRefreshMap.end(); ++it )
+ {
+ if( *it == true )
+ accountRefreshing = true;
+ }
+
+ //emit sigRefreshReady if all accounts are ready
+ if( !accountRefreshing )
+ {
+ emit sigRefreshReady();
+ }
+
+}
+
+int ConfigList::getNumberNewMails( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+ int number = 0; //number of new mails
+
+ //iterate over all accounts and sum up the number of new mails
+ while( ( account = it.current() ) != NULL )
+ {
+ if( account->isActive() )
+ number += account->getNumberNewMails();
+
+ //get next account
+ ++it;
+ }
+
+ return number;
+}
+
+int ConfigList::getNumberMails( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+ int number = 0; //number of mails
+
+ //iterate over all accounts and sum up the number of mails
+ while( ( account = it.current() ) != NULL )
+ {
+ if( account->isActive() )
+ number += account->getNumberMails();
+
+ //get next account
+ ++it;
+ }
+
+ return number;
+}
+
+long ConfigList::getTotalSize( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+ long size = 0; //total size of all mails
+
+ //iterate over all accounts and sum up the size of all mails
+ while( ( account = it.current() ) != NULL )
+ {
+ if( account->isActive() )
+ size += account->getTotalSize();
+
+ //get next account
+ ++it;
+ }
+
+ return size;
+}
+
+void ConfigList::fillMailListView( KshowmailView * view )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+
+ //iterate over all accounts and order the active accounts to fill their mails
+ //into the list view
+ while( ( account = it.current() ) != NULL )
+ {
+ if( account->isActive() )
+ account->fillMailListView( view );
+
+ //get next account
+ ++it;
+ }
+
+}
+
+bool ConfigList::showMainWindowForNewMails( )
+{
+ return m_bShowMainWindow;
+}
+
+bool ConfigList::showAlertMessageForNewMails( )
+{
+ return m_bShowMessage;
+}
+
+bool ConfigList::quitNoNewMails( )
+{
+ return m_bTerminate;
+}
+
+bool ConfigList::minimizeMainWindowNoNewMails( )
+{
+ return m_bMinimize;
+}
+
+int ConfigList::getInitTime( )
+{
+ return m_nInitTimer;
+}
+
+void ConfigList::setInitTime( int time )
+{
+ if( time >= 0 )
+ m_nInitTimer = time;
+ else
+ m_nInitTimer = 0;
+}
+
+bool ConfigList::hasInitTime( )
+{
+ return m_nInitTimer > 0;
+}
+
+void ConfigList::refreshAccountList( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+
+ //iterate over all accounts and order the account to refresh its
+ //account list view item
+ while( ( account = it.current() ) != NULL )
+ {
+ account->refreshAccountListItem();
+
+ //get next account
+ ++it;
+ }
+
+}
+
+void ConfigList::killPOP3Jobs( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+
+ //iterate over all accounts and order the account to kill
+ //a running pop3 job
+ while( ( account = it.current() ) != NULL )
+ {
+ account->killPOP3Job();
+
+ //get next account
+ ++it;
+ }
+}
+
+void ConfigList::showSelectedHeaders( )
+{
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //account to process
+ int showNextHeader = ConfigElem::continueShowHeaders; //return value of ConfigElem::showSelectedHeaders
+
+ //iterate over all accounts and order the account to show
+ //the headers of all selected mails.
+ while( ( account = it.current() ) != NULL && showNextHeader == ConfigElem::continueShowHeaders )
+ {
+ if( account->hasSelectedMails() )
+ showNextHeader = account->showSelectedHeaders();
+
+ //get next account
+ ++it;
+ }
+}
+
+void ConfigList::refreshSetup( KListView* view )
+{
+ //get application config object (kshowmailrc)
+ config = KApplication::kApplication()->config();
+
+ //read actions group
+ config->setGroup( CONFIG_GROUP_ACTIONS );
+
+ m_bShowMessage = config->readBoolEntry( CONFIG_ENTRY_NEW_MAIL_ALERTWINDOW, DEFAULT_ACTION_NEW_MAIL_ALERTWINDOW );
+ m_bShowMainWindow = config->readBoolEntry( CONFIG_ENTRY_NEW_MAIL_MAINWINDOW, DEFAULT_ACTION_NEW_MAIL_MAINWINDOW );
+ m_bBeep = config->readBoolEntry( CONFIG_ENTRY_NEW_MAIL_BEEP, DEFAULT_ACTION_NEW_MAIL_BEEP );
+ m_bSound = config->readBoolEntry( CONFIG_ENTRY_NEW_MAIL_SOUND, DEFAULT_ACTION_NEW_MAIL_SOUND );
+ m_strSoundFile = config->readEntry( CONFIG_ENTRY_NEW_MAIL_SOUNDPATH );
+ m_bCommand = config->readBoolEntry( CONFIG_ENTRY_NEW_MAIL_COMMAND, DEFAULT_ACTION_NEW_MAIL_COMMAND );
+ m_strCommandPath = config->readEntry( CONFIG_ENTRY_NEW_MAIL_COMMANDPATH );
+ m_bMinimize = config->readBoolEntry( CONFIG_ENTRY_NO_NEW_MAIL_MINIMIZE, DEFAULT_ACTION_NO_NEW_MAIL_MINIMIZE );
+ m_bTerminate = config->readBoolEntry( CONFIG_ENTRY_NO_NEW_MAIL_TERMINATE, DEFAULT_ACTION_NO_NEW_MAIL_TERMINATE );
+
+ //read general group
+ config->setGroup( CONFIG_GROUP_GENERAL );
+ m_bConfirmClose = config->readBoolEntry( CONFIG_ENTRY_CONFIRM_CLOSE, DEFAULT_CONFIRM_CLOSE );
+ m_bConfirmDelete = config->readBoolEntry( CONFIG_ENTRY_CONFIRM_DELETE, DEFAULT_CONFIRM_DELETE );
+ m_bStartMinimized = config->readBoolEntry( CONFIG_ENTRY_START_MINIMIZED, DEFAULT_START_MINIMIZED );
+ m_bCloseMinimizes = config->readBoolEntry( CONFIG_ENTRY_CLOSE_TO_TRAY, DEFAULT_CLOSE_TO_TRAY );
+ m_bMinimizeToTray = config->readBoolEntry( CONFIG_ENTRY_MINIMIZE_TO_TRAY, DEFAULT_MINIMIZE_TO_TRAY );
+ m_bShowConnectionErrors = config->readBoolEntry( CONFIG_ENTRY_SHOW_CONNECTION_ERRORS, DEFAULT_SHOW_CONNECTION_ERRORS );
+ m_bKeepNew = config->readBoolEntry( CONFIG_ENTRY_KEEP_NEW, DEFAULT_KEEP_NEW );
+
+ m_nInitTimer = config->readNumEntry( CONFIG_ENTRY_INITIAL_TIME, DEFAULT_INITIAL_TIME );
+ m_nIntervalTimer = config->readNumEntry( CONFIG_ENTRY_INTERVAL_TIME, DEFAULT_INTERVAL_TIME);
+ m_nPop3Timer = config->readNumEntry( CONFIG_ENTRY_TIMEOUT_TIME, DEFAULT_TIMEOUT_TIME );
+
+ //read display group
+ config->setGroup( CONFIG_GROUP_VIEW );
+ m_bAllowHTML = config->readBoolEntry( CONFIG_ENTRY_VIEW_USE_HTML, DEFAULT_VIEW_USE_HTML );
+
+ //read Spam configs
+ config->setGroup( CONFIG_GROUP_SPAMCHECK );
+ int intSpamAction = config->readNumEntry( CONFIG_ENTRY_SPAMCHECK_ACTION, DEFAULT_SPAMCHECK_ACTION );
+
+ switch( intSpamAction )
+ {
+ case CONFIG_VALUE_SPAMCHECK_ACTION_DELETE : spamAction = FActDelete; break;
+ case CONFIG_VALUE_SPAMCHECK_ACTION_MARK : spamAction = FActMark; break;
+ case CONFIG_VALUE_SPAMCHECK_ACTION_MOVE : spamAction = FActMove; break;
+ default :
+ kdError() << "Invalid value in " << CONFIG_ENTRY_SPAMCHECK_ACTION << ". Set default value." << endl;
+ switch( DEFAULT_SPAMCHECK_ACTION )
+ {
+ case CONFIG_VALUE_SPAMCHECK_ACTION_DELETE : spamAction = FActDelete; break;
+ case CONFIG_VALUE_SPAMCHECK_ACTION_MARK : spamAction = FActMark; break;
+ case CONFIG_VALUE_SPAMCHECK_ACTION_MOVE : spamAction = FActMove; break;
+ default : spamAction = FActMark; break;
+ }
+
+ }
+
+ if( spamAction == FActMove )
+ spamMailbox = config->readEntry( CONFIG_ENTRY_SPAMCHECK_MOVE_MAILBOX, DEFAULT_SPAMCHECK_ACTION_MOVE_MAILBOX );
+
+
+ //read account configuration and setup accounts
+ //---------------------------------------------
+
+ //get account names from the config file
+ config->setGroup( CONFIG_GROUP_ACCOUNTS );
+ QStringList accounts = config->readListEntry( CONFIG_ENTRY_ACCOUNTS_LIST, QStringList() );
+
+ //remove deleted accounts from the account list
+ //accounts are deleted, if the are in ConfigList yet, but not in the list of the config file (accounts)
+ ConfigElem* accountDel = NULL; //current processed account
+ QPtrListIterator<ConfigElem> iter( *this ); //iterator for the account list (ConfigList)
+
+ //iterate over all accounts (ConfigList)
+ while( ( accountDel = iter.current() ) != NULL )
+ {
+ //increment iterator to get next account
+ ++iter;
+
+ //search for the current account in the account list of the config file
+ QStringList::Iterator foundAccount = accounts.find( accountDel->getAccountName() );
+
+ //remove account from ConfigList, if it is not in the list of the config file
+ if( foundAccount == accounts.end() )
+ remove( accountDel );
+ }
+
+ //add or edit accounts
+ ConfigElem* acc;
+ //iterate over all items of the account list of the config file
+ for( QStringList::Iterator it = accounts.begin(); it != accounts.end(); ++it )
+ {
+ //create a new account, if it is not in the list yet (ConfigList)
+ //or get the account
+ if( !hasAccount( *it ) )
+ {
+ //create new account
+ acc = new ConfigElem( this, *it );
+ inSort( acc );
+
+ //the pointer list inserts a copy of the new account object
+ //we have to delete the original
+ delete acc;
+ }
+
+ //get account from ConfigList
+ acc = getAccount( *it );
+
+ //get the setup of the account from the config file and setup the account
+ config->setGroup( *it );
+
+ acc->setHost( config->readEntry( CONFIG_ENTRY_ACCOUNT_SERVER, DEFAULT_ACCOUNT_SERVER ) );
+
+ //set protocol and security
+ //if the read protocol is POP3 and SSL is enabled, the account protocol will set to "pop3s"
+ QString proto = config->readEntry( CONFIG_ENTRY_ACCOUNT_PROTOCOL, DEFAULT_ACCOUNT_PROTOCOL ).lower();
+ int secureTransfer = config->readNumEntry( CONFIG_ENTRY_ACCOUNT_SECTRANSFER, DEFAULT_ACCOUNT_SECTRANSFER );
+
+ if( proto == "pop3" && secureTransfer == CONFIG_VALUE_ACCOUNT_SECTRANSFER_SSL )
+ {
+ acc->setProtocol( "pop3s" );
+ }
+ else
+ {
+ acc->setProtocol( proto );
+ }
+
+ if( secureTransfer == CONFIG_VALUE_ACCOUNT_SECTRANSFER_TLS )
+ acc->setTLS( true );
+ else
+ acc->setTLS( false );
+
+
+ acc->setPort( config->readNumEntry( CONFIG_ENTRY_ACCOUNT_PORT, DEFAULT_ACCOUNT_PORT_POP3 ) );
+ acc->setUser( config->readEntry( CONFIG_ENTRY_ACCOUNT_USER, DEFAULT_ACCOUNT_USER ) );
+ acc->setActive( config->readBoolEntry( CONFIG_ENTRY_ACCOUNT_ACTIVE, DEFAULT_ACCOUNT_ACTIVE ) );
+ int StorageType = config->readNumEntry( CONFIG_ENTRY_ACCOUNT_PASSWORD_STORAGE, DEFAULT_ACCOUNT_PASSWORD_STORAGE );
+
+ switch( StorageType )
+ {
+ case CONFIG_VALUE_ACCOUNT_PASSWORD_DONT_SAVE:
+ acc->setPasswordStorage( CONFIG_VALUE_ACCOUNT_PASSWORD_DONT_SAVE );
+ acc->setPassword( QString::null );
+ break;
+
+ case CONFIG_VALUE_ACCOUNT_PASSWORD_SAVE_FILE:
+ acc->setPasswordStorage( CONFIG_VALUE_ACCOUNT_PASSWORD_SAVE_FILE );
+ acc->setPassword( Encryption::decrypt( config->readEntry( CONFIG_ENTRY_ACCOUNT_PASSWORD, DEFAULT_ACCOUNT_PASSWORD ) ) );
+ break;
+
+ case CONFIG_VALUE_ACCOUNT_PASSWORD_SAVE_KWALLET:
+ acc->setPasswordStorage( CONFIG_VALUE_ACCOUNT_PASSWORD_SAVE_KWALLET );
+ acc->setPassword( KWalletAccess::getPassword( *it ) );
+ break;
+
+ default:
+ acc->setPasswordStorage( DEFAULT_ACCOUNT_PASSWORD_STORAGE );
+ acc->setPassword( QString::null );
+ }
+
+ //order the account to reloads its filter setup
+ acc->reloadFilterSettings();
+ }
+
+ //connect the signals of the accounts with ConfigList
+ connectAccounts();
+
+ //refresh account list view
+ setList( view );
+}
+
+void ConfigList::executeNewMailCommand( )
+{
+ if( m_bCommand )
+ {
+ if( m_strCommandPath != QString::null && m_strCommandPath != "" )
+ {
+ KShellProcess proc; //process handler to execute the binary
+
+ proc << m_strCommandPath;
+
+ proc.start( KShellProcess::DontCare );
+ }
+ }
+}
+
+bool ConfigList::keepNew( )
+{
+ return m_bKeepNew;
+}
+
+bool ConfigList::confirmClose( ) const
+{
+ return m_bConfirmClose;
+}
+
+bool ConfigList::startMinimized( ) const
+{
+ return m_bStartMinimized;
+}
+
+bool ConfigList::closeToTray( ) const
+{
+ return m_bCloseMinimizes;
+}
+
+bool ConfigList::minimizesToTray( ) const
+{
+ return m_bMinimizeToTray;
+}
+
+bool ConfigList::showConnectionErrors( ) const
+{
+ return m_bShowConnectionErrors;
+}
+
+bool ConfigList::hasAccount( const QString & name ) const
+{
+ bool found = false; //TRUE if we have found the given account
+ ConfigElem* account; //account from which we want to get its name
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL && !found )
+ {
+ //increment iterator to next account
+ ++it;
+
+ //if current account is the searched one set found to TRUE
+ if( account->getAccountName() == name )
+ found = true;
+ }
+
+ return found;
+}
+
+ConfigElem * ConfigList::getAccount( const QString & name ) const
+{
+ bool found = false; //TRUE if we have found the given account
+ ConfigElem* account = NULL; //account from which we want to get its name
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+ ConfigElem* returnValue = NULL;
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL && !found )
+ {
+ //increment iterator to next account
+ ++it;
+
+ //if current account is the searched one set found to TRUE
+ if( account->getAccountName() == name )
+ {
+ found = true;
+ returnValue = account;
+ }
+ }
+
+ return returnValue;
+}
+
+void ConfigList::printSetup( )
+{
+ ConfigElem* account = NULL; //account from which we want to print the setup
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ //print setup
+ account->printSetup();
+ }
+}
+
+void ConfigList::readStoredMails( )
+{
+ //open file
+ QString MailFileName = locateLocal( "config", MAIL_FILE );
+ QFile file( MailFileName );
+ bool fileOpen = file.open( IO_ReadOnly );
+
+ //return, if the file could not be opened
+ if( !fileOpen )
+ {
+ kdError() << "ConfigList::readStoredMails: File " << MailFileName << " could not be opened." << endl;
+ return;
+ }
+
+ //create DOM document with the content read from the file
+ QDomDocument doc( MAIL_FILE_DOCTYPE );
+ QString* errorMsg = new QString();
+
+ bool success = doc.setContent( &file );
+ if( !success )
+ {
+ kdError() << "ConfigList::readStoredMails: Invalid content in " << MAIL_FILE << ". " << *errorMsg << endl;
+ }
+
+ //get the root element
+ QDomElement accounts = doc.namedItem ( ROOT_ELEMENT ).toElement();
+
+ //get the first account element
+ QDomNode accNode = accounts.firstChild();
+
+ //get all account elements
+ while( !accNode.isNull() )
+ {
+ //convert account node to DOM element
+ QDomElement accElem = accNode.toElement();
+
+ //get the account name
+ QString accName = accElem.attribute( ATTRIBUTE_ACCOUNT_NAME );
+
+ //get the proper account object
+ ConfigElem* account = getAccount( accName );
+
+ //order the account to read its stored mails
+ account->readStoredMails( accElem );
+
+ //get next account node
+ accNode = accNode.nextSibling();
+ }
+
+ //close file
+ file.close();
+}
+
+FilterAction_Type ConfigList::getSpamAction( )
+{
+ return spamAction;
+}
+
+QString ConfigList::getSpamMailbox( )
+{
+ return spamMailbox;
+}
+
+int ConfigList::numberDeletedMailsLastRefresh( )
+{
+ ConfigElem* account = NULL;
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+ int number = 0;
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ number += account->numberDeletedMailsLastRefresh();
+ }
+
+ return number;
+}
+
+int ConfigList::numberDeletedMailsStart( )
+{
+ ConfigElem* account = NULL;
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+ int number = 0;
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ number += account->numberDeletedMailsStart();
+ }
+
+ return number;
+}
+
+int ConfigList::numberMovedMailsLastRefresh( )
+{
+ ConfigElem* account = NULL;
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+ int number = 0;
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ number += account->numberMovedMailsLastRefresh();
+ }
+
+ return number;
+}
+
+int ConfigList::numberMovedMailsStart( )
+{
+ ConfigElem* account = NULL;
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+ int number = 0;
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ number += account->numberMovedMailsStart();
+ }
+
+ return number;
+}
+
+int ConfigList::numberIgnoredMails( )
+{
+ ConfigElem* account = NULL;
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+ int number = 0;
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ number += account->numberIgnoredMails();
+ }
+
+ return number;
+}
+
+QStringList ConfigList::getSelectedSenders( ) const
+{
+ QStringList senders; //contains all senders
+ QPtrListIterator<ConfigElem> it( *this ); //to iterate over all accounts
+ ConfigElem* account; //current account
+
+ while( ( account = it.current() ) != NULL )
+ {
+ //get senders of the current account and append them to the list
+ senders += account->getSelectedSenders();
+
+ //get next account
+ ++it;
+ }
+
+ return senders;
+}
+
+void ConfigList::refreshFilterSetup( )
+{
+ ConfigElem* account; //account
+ QPtrListIterator<ConfigElem> it( *this ); //iterator for the account list
+
+ //iterate over all accounts
+ while( ( account = it.current() ) != NULL )
+ {
+ //increment iterator to next account
+ ++it;
+
+ //reload filter setup of the current account
+ account->reloadFilterSettings();
+ }
+
+}
+
+