summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/mail/accountview.cpp58
-rw-r--r--noncore/net/mail/accountview.h16
-rw-r--r--noncore/net/mail/defines.h2
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp55
-rw-r--r--noncore/net/mail/pop3wrapper.cpp55
5 files changed, 150 insertions, 36 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp
index d725b87..8e21d39 100644
--- a/noncore/net/mail/accountview.cpp
+++ b/noncore/net/mail/accountview.cpp
@@ -18,29 +18,75 @@ POP3viewItem::POP3viewItem( POP3account *a, QListView *parent )
POP3viewItem::~POP3viewItem()
{
delete wrapper;
}
-void POP3viewItem::refresh( QList<RecMail> &target )
+AbstractMail *POP3viewItem::getWrapper()
{
- qDebug( "POP3: refresh" );
- wrapper->listMessages("INBOX", target );
+ return wrapper;
}
+void POP3viewItem::refresh( QList<RecMail> & )
+{
+ QList<Folder> *folders = wrapper->listFolders();
+ QListViewItem *child = firstChild();
+ while ( child ) {
+ QListViewItem *tmp = child;
+ child = child->nextSibling();
+ delete tmp;
+ }
+ Folder *it;
+ QListViewItem*item = 0;
+ for ( it = folders->first(); it; it = folders->next() ) {
+ item = new POP3folderItem( it, this , item );
+ item->setSelectable(it->may_select());
+ }
+ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ folders->setAutoDelete(false);
+ delete folders;
+}
RecBody POP3viewItem::fetchBody( const RecMail &mail )
{
qDebug( "POP3 fetchBody" );
return wrapper->fetchBody( mail );
}
+POP3folderItem::~POP3folderItem()
+{
+ delete folder;
+}
+
+POP3folderItem::POP3folderItem( Folder *folderInit, POP3viewItem *parent , QListViewItem*after )
+ : AccountViewItem( parent,after )
+{
+ folder = folderInit;
+ pop3 = parent;
+ if (folder->getDisplayName().lower()!="inbox") {
+ setPixmap( 0, PIXMAP_POP3FOLDER );
+ } else {
+ setPixmap( 0, PIXMAP_INBOXFOLDER);
+ }
+ setText( 0, folder->getDisplayName() );
+}
+
+void POP3folderItem::refresh(QList<RecMail>&target)
+{
+ if (folder->may_select())
+ pop3->getWrapper()->listMessages( folder->getName(),target );
+}
+
+RecBody POP3folderItem::fetchBody(const RecMail&aMail)
+{
+ return pop3->getWrapper()->fetchBody(aMail);
+}
+
/**
* IMAP Account stuff
*/
-
IMAPviewItem::IMAPviewItem( IMAPaccount *a, QListView *parent )
: AccountViewItem( parent )
{
account = a;
wrapper = AbstractMail::getWrapper( account );
setPixmap( 0, PIXMAP_IMAPFOLDER );
@@ -92,13 +138,17 @@ IMAPfolderItem::~IMAPfolderItem()
IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPviewItem *parent , QListViewItem*after )
: AccountViewItem( parent,after )
{
folder = folderInit;
imap = parent;
+ if (folder->getDisplayName().lower()!="inbox") {
setPixmap( 0, PIXMAP_IMAPFOLDER );
+ } else {
+ setPixmap( 0, PIXMAP_INBOXFOLDER);
+ }
setText( 0, folder->getDisplayName() );
}
void IMAPfolderItem::refresh(QList<RecMail>&target)
{
if (folder->may_select())
diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h
index 04f9b7a..d035af4 100644
--- a/noncore/net/mail/accountview.h
+++ b/noncore/net/mail/accountview.h
@@ -28,19 +28,32 @@ class POP3viewItem : public AccountViewItem
public:
POP3viewItem( POP3account *a, QListView *parent );
~POP3viewItem();
virtual void refresh( QList<RecMail> &target );
virtual RecBody fetchBody( const RecMail &mail );
-
+ AbstractMail *getWrapper();
private:
POP3account *account;
AbstractMail *wrapper;
};
+class POP3folderItem : public AccountViewItem
+{
+
+public:
+ POP3folderItem( Folder *folder, POP3viewItem *parent , QListViewItem*after );
+ ~POP3folderItem();
+ virtual void refresh(QList<RecMail>&);
+ virtual RecBody fetchBody(const RecMail&);
+private:
+ Folder *folder;
+ POP3viewItem *pop3;
+};
+
class IMAPviewItem : public AccountViewItem
{
public:
IMAPviewItem( IMAPaccount *a, QListView *parent );
~IMAPviewItem();
@@ -60,13 +73,12 @@ public:
~IMAPfolderItem();
virtual void refresh(QList<RecMail>&);
virtual RecBody fetchBody(const RecMail&);
private:
Folder *folder;
IMAPviewItem *imap;
-
};
class AccountView : public QListView
{
Q_OBJECT
diff --git a/noncore/net/mail/defines.h b/noncore/net/mail/defines.h
index 679459d..c849f1a 100644
--- a/noncore/net/mail/defines.h
+++ b/noncore/net/mail/defines.h
@@ -11,23 +11,25 @@
#define PIC_SEARCHMAILS "opiemail/searchmails"
#define PIC_EDITSETTINGS "opiemail/editsettings"
#define PIC_EDITACCOUNTS "opiemail/editaccounts"
#define PIC_SYNC "opiemail/sync"
#define PIC_IMAPFOLDER "opiemail/imapfolder"
#define PIC_POP3FOLDER "opiemail/pop3folder"
+#define PIC_INBOXFOLDER "opiemail/inbox"
#define ICON_COMPOSEMAIL QIconSet( Resource::loadPixmap( PIC_COMPOSEMAIL ) )
#define ICON_SENDQUEUED QIconSet( Resource::loadPixmap( PIC_SENDQUEUED ) )
#define ICON_SHOWFOLDERS QIconSet( Resource::loadPixmap( PIC_SHOWFOLDERS ) )
#define ICON_SEARCHMAILS QIconSet( Resource::loadPixmap( PIC_SEARCHMAILS ) )
#define ICON_EDITSETTINGS QIconSet( Resource::loadPixmap( PIC_EDITSETTINGS ) )
#define ICON_EDITACCOUNTS QIconSet( Resource::loadPixmap( PIC_EDITACCOUNTS ) )
#define ICON_SYNC QIconSet( Resource::loadPixmap( PIC_SYNC ) )
#define PIXMAP_IMAPFOLDER QPixmap( Resource::loadPixmap( PIC_IMAPFOLDER ) )
#define PIXMAP_POP3FOLDER QPixmap( Resource::loadPixmap( PIC_POP3FOLDER ) )
+#define PIXMAP_INBOXFOLDER QPixmap( Resource::loadPixmap( PIC_INBOXFOLDER) )
#define IMAP_PORT "143"
#define IMAP_SSL_PORT "993"
#define SMTP_PORT "25"
#define SMTP_SSL_PORT "465"
#define POP3_PORT "110"
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 46c854b..2411399 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -1,7 +1,7 @@
-
+#include <stdlib.h>
#include "pop3wrapper.h"
#include "mailtypes.h"
#include <libetpan/mailpop3.h>
POP3wrapper::POP3wrapper( POP3account *a )
{
@@ -40,63 +40,72 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
return parseBody( message );
}
RecBody POP3wrapper::parseBody( const char *message )
{
int err = MAILIMF_NO_ERROR;
- size_t curTok;
- mailimf_message *result;
+ /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
+ size_t curTok = 0;
+ mailimf_message *result = 0;
RecBody body;
err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result );
- if ( err != MAILIMF_NO_ERROR ) return body;
+ if ( err != MAILIMF_NO_ERROR ) {
+ if (result) mailimf_message_free(result);
+ return body;
+ }
if ( result && result->msg_body && result->msg_body->bd_text ) {
qDebug( "POP3: bodytext found" );
- // TODO: why does this line segfault???? gdb says segfault in strlen(), maybe a bug in libetpan.
+ // when curTok isn't set to 0 this line will fault! 'cause upper line faults!
body.setBodytext( QString( result->msg_body->bd_text ) );
}
-
+ if (result) mailimf_message_free(result);
return body;
}
void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
{
int err = MAILPOP3_NO_ERROR;
- char *header;
- size_t length;
- carray *messages;
+ char * header = 0;
+ /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
+ size_t length = 0;
+ carray * messages = 0;
login();
if (!m_pop3) return;
mailpop3_list( m_pop3, &messages );
- for ( int i = carray_count( messages ); i > 0; i-- ) {
- mailpop3_msg_info *info = (mailpop3_msg_info *) carray_get( messages, i - 1 );
-
+ //for ( int i = carray_count( messages ); i > 0; i-- ) {
+ for (unsigned int i = 0; i < carray_count(messages);++i) {
+ mailpop3_msg_info *info;
+ int r = mailpop3_get_msg_info(m_pop3,i+1,&info);
err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
if ( err != MAILPOP3_NO_ERROR ) {
qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
+ free(header);
logout();
return;
}
RecMail *mail = parseHeader( header );
mail->setNumber( info->msg_index );
mail->setWrapper(this);
target.append( mail );
+ free(header);
}
-
logout();
}
RecMail *POP3wrapper::parseHeader( const char *header )
{
int err = MAILIMF_NO_ERROR;
- size_t curTok;
+ size_t curTok = 0;
RecMail *mail = new RecMail();
mailimf_fields *fields;
+ mailimf_references * refs;
+ mailimf_keywords*keys;
err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
mailimf_field *field = (mailimf_field *) current->data;
switch ( field->fld_type ) {
case MAILIMF_FIELD_FROM:
@@ -114,17 +123,33 @@ RecMail *POP3wrapper::parseHeader( const char *header )
case MAILIMF_FIELD_SUBJECT:
mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) );
break;
case MAILIMF_FIELD_ORIG_DATE:
mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
break;
+ case MAILIMF_FIELD_MESSAGE_ID:
+ mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
+ break;
+ case MAILIMF_FIELD_REFERENCES:
+ refs = field->fld_data.fld_references;
+ if (refs && refs->mid_list && clist_count(refs->mid_list)) {
+ char * text = (char*)refs->mid_list->first->data;
+ mail->setReplyto(QString(text));
+ }
+ break;
+ case MAILIMF_FIELD_KEYWORDS:
+ keys = field->fld_data.fld_keywords;
+ for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) {
+ qDebug("Keyword: %s",(char*)cur->data);
+ }
+ break;
default:
break;
}
}
-
+ if (fields) mailimf_fields_free(fields);
return mail;
}
QString POP3wrapper::parseDateTime( mailimf_date_time *date )
{
char tmp[23];
diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp
index 46c854b..2411399 100644
--- a/noncore/net/mail/pop3wrapper.cpp
+++ b/noncore/net/mail/pop3wrapper.cpp
@@ -1,7 +1,7 @@
-
+#include <stdlib.h>
#include "pop3wrapper.h"
#include "mailtypes.h"
#include <libetpan/mailpop3.h>
POP3wrapper::POP3wrapper( POP3account *a )
{
@@ -40,63 +40,72 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
return parseBody( message );
}
RecBody POP3wrapper::parseBody( const char *message )
{
int err = MAILIMF_NO_ERROR;
- size_t curTok;
- mailimf_message *result;
+ /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
+ size_t curTok = 0;
+ mailimf_message *result = 0;
RecBody body;
err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result );
- if ( err != MAILIMF_NO_ERROR ) return body;
+ if ( err != MAILIMF_NO_ERROR ) {
+ if (result) mailimf_message_free(result);
+ return body;
+ }
if ( result && result->msg_body && result->msg_body->bd_text ) {
qDebug( "POP3: bodytext found" );
- // TODO: why does this line segfault???? gdb says segfault in strlen(), maybe a bug in libetpan.
+ // when curTok isn't set to 0 this line will fault! 'cause upper line faults!
body.setBodytext( QString( result->msg_body->bd_text ) );
}
-
+ if (result) mailimf_message_free(result);
return body;
}
void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
{
int err = MAILPOP3_NO_ERROR;
- char *header;
- size_t length;
- carray *messages;
+ char * header = 0;
+ /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
+ size_t length = 0;
+ carray * messages = 0;
login();
if (!m_pop3) return;
mailpop3_list( m_pop3, &messages );
- for ( int i = carray_count( messages ); i > 0; i-- ) {
- mailpop3_msg_info *info = (mailpop3_msg_info *) carray_get( messages, i - 1 );
-
+ //for ( int i = carray_count( messages ); i > 0; i-- ) {
+ for (unsigned int i = 0; i < carray_count(messages);++i) {
+ mailpop3_msg_info *info;
+ int r = mailpop3_get_msg_info(m_pop3,i+1,&info);
err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
if ( err != MAILPOP3_NO_ERROR ) {
qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
+ free(header);
logout();
return;
}
RecMail *mail = parseHeader( header );
mail->setNumber( info->msg_index );
mail->setWrapper(this);
target.append( mail );
+ free(header);
}
-
logout();
}
RecMail *POP3wrapper::parseHeader( const char *header )
{
int err = MAILIMF_NO_ERROR;
- size_t curTok;
+ size_t curTok = 0;
RecMail *mail = new RecMail();
mailimf_fields *fields;
+ mailimf_references * refs;
+ mailimf_keywords*keys;
err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
mailimf_field *field = (mailimf_field *) current->data;
switch ( field->fld_type ) {
case MAILIMF_FIELD_FROM:
@@ -114,17 +123,33 @@ RecMail *POP3wrapper::parseHeader( const char *header )
case MAILIMF_FIELD_SUBJECT:
mail->setSubject( QString( field->fld_data.fld_subject->sbj_value ) );
break;
case MAILIMF_FIELD_ORIG_DATE:
mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
break;
+ case MAILIMF_FIELD_MESSAGE_ID:
+ mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
+ break;
+ case MAILIMF_FIELD_REFERENCES:
+ refs = field->fld_data.fld_references;
+ if (refs && refs->mid_list && clist_count(refs->mid_list)) {
+ char * text = (char*)refs->mid_list->first->data;
+ mail->setReplyto(QString(text));
+ }
+ break;
+ case MAILIMF_FIELD_KEYWORDS:
+ keys = field->fld_data.fld_keywords;
+ for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) {
+ qDebug("Keyword: %s",(char*)cur->data);
+ }
+ break;
default:
break;
}
}
-
+ if (fields) mailimf_fields_free(fields);
return mail;
}
QString POP3wrapper::parseDateTime( mailimf_date_time *date )
{
char tmp[23];