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.
kshowmail/kshowmail/showrecord.cpp

670 lines
20 KiB

/***************************************************************************
showrecord.cpp - description
-------------------
begin : Mon Dec 3 2001
copyright : (C) 2001 by Eggert Ehmke
email : eggert.ehmke@berlin.de
***************************************************************************/
/***************************************************************************
* *
* 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 "showrecord.h"
int const ShowRecord::continueShowHeaders( 0 );
int const ShowRecord::cancelShowHeaders( 1 );
ShowRecord::ShowRecord()
{
//set auto delete to true. This is a function of the parent class, which deletes
//all items when the list is deleted or cleared.
setAutoDelete( true );
}
ShowRecord::~ShowRecord()
{
}
void ShowRecord::saveOptions( TQDomDocument& doc, TQDomElement& parent )
{
//Loop over all mail items
for( ShowRecordElem* pElem = first(); pElem; pElem = next() )
{
//call the method of the mail to save it
pElem->saveOptions( doc, parent );
}
}
void ShowRecord::readStoredMails( TQDomElement& parent )
{
//clear the list
clear();
//get first DOM node (mail)
TQDomNode n = parent.firstChild();
//iterate over all mail items stored in the given account
while( !n.isNull() )
{
//get element of the current node
TQDomElement e = n.toElement();
//create mail object
ShowRecordElem* pElem = new ShowRecordElem();
//store the currently read mail data in the new object
pElem->readOptions( e );
//store the new mail object in this list
append( pElem );
//get next DOM node
n = n.nextSibling();
}
}
bool ShowRecord::hasSelectedMails( )
{
bool selected = false; //TRUE when a selected mail was found
ShowRecordElem* mail; //mail which we want to check
//get first mail
mail = first();
//iterate over all mails until we have found a selected mail
while( mail != NULL && !selected )
{
//check the current mail
selected = mail->isSelected();
//get next mail
mail = next();
}
return selected;
}
MailNumberList_Type ShowRecord::getSelectedMails( )
{
MailNumberList_Type list; //contains the numbers of selected mails
ShowRecordElem* mail; //mail from which we want to get the number (if selected)
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
//iterate over all mails
while( ( mail = it.current() ) != NULL )
{
//increment iterator to next mail
++it;
//if current mail is selected append its number to the mail number list
if( mail->isSelected() )
list.append( mail->number() );
}
return list;
}
void ShowRecord::removeMail( int number )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, remove it
if( mail->number() == number )
remove( mail );
}
}
TQStringList ShowRecord::getSelectedSubjects( ) const
{
TQStringList subjects; //contains the subjects
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
//iterate over all mails
while( ( mail = it.current() ) != NULL )
{
//increment iterator to next mail
++it;
//if the mail is selected, append subject to list
if( mail->isSelected() )
subjects.append( mail->subject() );
}
return subjects;
}
TQString ShowRecord::getSenderOf( int number ) const
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
TQString sender; //sender of the wanted mail
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, remove it
if( mail->number() == number )
{
sender = mail->from();
found = true;
}
}
return sender;
}
TQString ShowRecord::getDateOf( int number ) const
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
TQString date; //sent date of the wanted mail
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, remove it
if( mail->number() == number )
{
date = mail->date();
found = true;
}
}
return date;
}
TQString ShowRecord::getSizeOf( int number ) const
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
TQString size; //size of the wanted mail
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, remove it
if( mail->number() == number )
{
size = mail->strSizePrefix();
found = true;
}
}
return size;
}
TQString ShowRecord::getSubjectOf( int number ) const
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
TQString subject; //subject of the wanted mail
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, get the subject
if( mail->number() == number )
{
subject = mail->subject();
found = true;
}
}
return subject;
}
TQString ShowRecord::decodeMailBody( TQByteArray body, int number, bool preferHTML ) const
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
TQString mailbody; //decoded mail
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, decode the mail
if( mail->number() == number )
{
mailbody = mail->decodeMailBody( body, preferHTML );
found = true;
}
}
return mailbody;
}
bool ShowRecord::hasMail( TQString uid )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//compare the uid
if( mail->uidl() == uid )
{
found = true;
}
}
return found;
}
void ShowRecord::appendNewMail( int number, TQString uid, bool isNew )
{
//create new mail
ShowRecordElem* newMail = new ShowRecordElem( number, uid, isNew );
//append new mail
if( newMail != NULL )
append( newMail );
}
void ShowRecord::printMailList( )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
while( ( mail = it.current() ) )
{
//increment iterator to next mail
++it;
//print mail
cout << mail->number() << " - UID: " << mail->uidl().local8Bit() << "; Size: " << mail->size() << "; Subject: " << mail->subject().local8Bit() << "; New: " << mail->isNew() << endl;
}
}
void ShowRecord::setSize( int number, long size )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, decode the mail
if( mail->number() == number )
{
mail->setSize( size );
found = true;
}
}
}
Types::MailNumberList_Type ShowRecord::getNewMails( )
{
MailNumberList_Type list; //contains the numbers of the new mails
ShowRecordElem* mail; //mail from which we want to get the number (if new)
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
//iterate over all mails
while( ( mail = it.current() ) != NULL )
{
//increment iterator to next mail
++it;
//if current mail is new append its number to the mail number list
if( mail->isNew() )
list.append( mail->number() );
}
return list;
}
void ShowRecord::setHeader( int number, TQString header )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, set the header
if( mail->number() == number )
{
mail->setHeader( header );
found = true;
}
}
}
TQStringList ShowRecord::getUIDsOfOldMails( )
{
TQStringList list; //contains the UIDs of the old mails
ShowRecordElem* mail; //mail from which we want to get the uid (if old)
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
//iterate over all mails
while( ( mail = it.current() ) != NULL )
{
//increment iterator to next mail
++it;
//if current mail is new append its number to the mail number list
if( !mail->isNew() )
list.append( mail->uidl() );
}
return list;
}
TQString ShowRecord::getHeaderOf( TQString uid )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
TQString header; //header of the wanted mail
//looking for the mail with the UID 'uid'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given uid, get the header
if( mail->uidl() == uid )
{
header = mail->header();
found = true;
}
}
return header;
}
void ShowRecord::setHeader( TQString uid, TQString header )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
//looking for the mail with the UID 'uid'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given UID, set the header
if( mail->uidl() == uid )
{
mail->setHeader( header );
found = true;
}
}
}
int ShowRecord::getNumberNewMails( )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
int number = 0; //number of new mails
while( ( mail = it.current() ) )
{
//increment iterator to next mail
++it;
//increment number, if this mail is new
if( mail->isNew() )
number++;
}
return number;
}
int ShowRecord::getNumberMails( )
{
return count();
}
long ShowRecord::getTotalSize( )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
long size = 0; //total size of all mails
while( ( mail = it.current() ) )
{
//increment iterator to next mail
++it;
size += mail->size();
}
return size;
}
void ShowRecord::fillMailListView( KshowmailView * view, TQString & account )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
//iterate over all mails and order the mail to create a list view item
while( ( mail = it.current() ) )
{
//increment iterator to next mail
++it;
//insert list view item
TQString number = TQString( "%1" ).arg( mail->number() );
TQString from = mail->from();
TQString to = mail->to();
TQString subject = mail->subject();
TQString date = mail->date();
TQString size = TQString( "%1" ).arg( mail->size() );
TQString content = mail->content();
TQString state = mail->state();
TQString time = mail->strUnixTime();
mail->setViewItem( view->insertMail( number, account, from, to, subject, date, size, content, state, time ) );
}
}
int ShowRecord::showSelectedHeaders( TQString& account )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
int showNextHeader = ShowRecordElem::continueShowHeaders; //return value of ShowRecordElem::showHeader()
while( ( mail = it.current() ) && showNextHeader == ShowRecordElem::continueShowHeaders )
{
//increment iterator to next mail
++it;
//order the mail to show its header
if( mail->isSelected() )
showNextHeader = mail->showHeader( account );
}
return showNextHeader == ShowRecordElem::continueShowHeaders ? ShowRecord::continueShowHeaders : ShowRecord::cancelShowHeaders;
}
bool ShowRecord::isNew( TQString uid ) const
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
bool newMail = false; //at time we have not found it, therefore the return value is false
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//compare the uid
if( mail->uidl() == uid )
{
found = true;
newMail = mail->isNew();
}
}
return newMail;
}
void ShowRecord::applyHeaderFilter( HeaderFilter * filter, TQString account, MailNumberList_Type& deleteList, MailToDownloadMap_Type& downloadList, int& nmbIgnoredMails, FilterLog* log )
{
MailNumberList_Type mailsToIgnore; //this list holds the numbers of all mails, which shall be ignored
//Loop over all mails in this list
for( ShowRecordElem* pElem = first(); pElem; pElem = next() )
{
//apply the filters to the current mail
TQString mailbox;
FilterAction_Type action = pElem->applyHeaderFilter( filter, account, mailbox, log );
//do recommend action
//we don't need to do everything for action MARK, because ShowRecordElem::applyHeaderFilter() marks the mail entry itself
struct DownloadActionParams_Type params;
switch( action )
{
case FActDelete : deleteList.append( pElem->number() ); break;
case FActMove : params.action = FActMove;
params.mailbox = mailbox;
downloadList.insert( pElem->number(), params );
break;
case FActIgnore : mailsToIgnore.append( pElem->number() ); break;
case FActSpamcheck : params.action = FActSpamcheck;
downloadList.insert( pElem->number(), params );
default : break;
}
}
//remove all mails which shall be ignored from the mail list
nmbIgnoredMails = mailsToIgnore.count();
MailNumberList_Type::iterator it;
for ( it = mailsToIgnore.begin(); it != mailsToIgnore.end(); ++it )
removeMail( *it );
}
void ShowRecord::writeToMoveLog( FilterLog * log, int number, TQString account, TQString mailbox )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, set the header
if( mail->number() == number )
{
mail->writeToMoveLog( log, account, mailbox );
found = true;
}
}
}
void ShowRecord::writeToDeleteLog( FilterLog * log, int number, TQString account )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, set the header
if( mail->number() == number )
{
mail->writeToDeleteLog( log, account );
found = true;
}
}
}
void ShowRecord::setMarkAtNextViewRefresh( int number )
{
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
bool found = false; //True, when the wanted mail was found
//looking for the mail with the number 'number'
while( ( mail = it.current() ) != NULL && !found )
{
//increment iterator to next mail
++it;
//if the current mail has the given number, set the header
if( mail->number() == number )
{
mail->setMarkAtNextViewRefresh();
found = true;
}
}
}
TQStringList ShowRecord::getSelectedSenders( ) const
{
TQStringList senders; //contains the senders
TQPtrListIterator<ShowRecordElem> it( *this ); //iterator for the mail list
ShowRecordElem* mail; //current mail
//iterate over all mails
while( ( mail = it.current() ) != NULL )
{
//increment iterator to next mail
++it;
//if the mail is selected, append subject to list
if( mail->isSelected() )
senders.append( mail->from() );
}
return senders;
}