summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/mail/accountitem.cpp190
-rw-r--r--noncore/net/mail/accountitem.h40
-rw-r--r--noncore/net/mail/accountview.cpp7
-rw-r--r--noncore/net/mail/libmailwrapper/abstractmail.cpp6
-rw-r--r--noncore/net/mail/libmailwrapper/abstractmail.h1
-rw-r--r--noncore/net/mail/libmailwrapper/libmailwrapper.pro6
-rw-r--r--noncore/net/mail/libmailwrapper/nntpwrapper.cpp241
-rw-r--r--noncore/net/mail/libmailwrapper/nntpwrapper.h48
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp2
-rw-r--r--noncore/net/mail/nntpconfigui.ui103
10 files changed, 637 insertions, 7 deletions
diff --git a/noncore/net/mail/accountitem.cpp b/noncore/net/mail/accountitem.cpp
index c8f6ec4..32a96ff 100644
--- a/noncore/net/mail/accountitem.cpp
+++ b/noncore/net/mail/accountitem.cpp
@@ -211,2 +211,192 @@ void POP3folderItem::contextMenuSelected(int which)
/**
+ * NNTP Account stuff
+ */
+NNTPviewItem::NNTPviewItem( NNTPaccount *a, AccountView *parent )
+ : AccountViewItem( parent )
+{
+ account = a;
+ wrapper = AbstractMail::getWrapper( account );
+ //FIXME
+ SETPIX(PIXMAP_POP3FOLDER);
+#if 0
+ if (!account->getOffline())
+ {
+ setPixmap( 0, );
+ }
+ else
+ {
+ setPixmap( 0, PIXMAP_OFFLINE );
+ }
+#endif
+ setText( 0, account->getAccountName() );
+ setOpen( true );
+}
+
+NNTPviewItem::~NNTPviewItem()
+{
+ delete wrapper;
+}
+
+AbstractMail *NNTPviewItem::getWrapper()
+{
+ return wrapper;
+}
+
+void NNTPviewItem::refresh( QList<RecMail> & )
+{
+ refresh();
+}
+
+void NNTPviewItem::refresh()
+{
+ if (account->getOffline()) return;
+ 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 NNTPfolderItem( it, this , item );
+ item->setSelectable(it->may_select());
+ }
+ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ folders->setAutoDelete(false);
+ delete folders;
+}
+
+RecBody NNTPviewItem::fetchBody( const RecMail &mail )
+{
+ qDebug( "NNTP fetchBody" );
+ return wrapper->fetchBody( mail );
+}
+
+QPopupMenu * NNTPviewItem::getContextMenu()
+{
+ QPopupMenu *m = new QPopupMenu(0);
+ if (m)
+ {
+ if (!account->getOffline())
+ {
+ m->insertItem(QObject::tr("Disconnect",contextName),0);
+ m->insertItem(QObject::tr("Set offline",contextName),1);
+ }
+ else
+ {
+ m->insertItem(QObject::tr("Set online",contextName),1);
+ }
+ }
+ return m;
+}
+
+void NNTPviewItem::disconnect()
+{
+ QListViewItem *child = firstChild();
+ while ( child )
+ {
+ QListViewItem *tmp = child;
+ child = child->nextSibling();
+ delete tmp;
+ }
+ wrapper->logout();
+}
+
+void NNTPviewItem::setOnOffline()
+{
+ if (!account->getOffline())
+ {
+ disconnect();
+ }
+ account->setOffline(!account->getOffline());
+ account->save();
+ //FIXME
+ SETPIX(PIXMAP_POP3FOLDER);
+ refresh();
+}
+
+void NNTPviewItem::contextMenuSelected(int which)
+{
+ switch (which)
+ {
+ case 0:
+ disconnect();
+ break;
+ case 1:
+ setOnOffline();
+ break;
+ }
+}
+
+NNTPfolderItem::~NNTPfolderItem()
+{}
+
+NNTPfolderItem::NNTPfolderItem( Folder *folderInit, NNTPviewItem *parent , QListViewItem*after )
+ : AccountViewItem( parent,after )
+{
+ folder = folderInit;
+ nntp = parent;
+ if (folder->getDisplayName().lower()!="inbox")
+ {
+ setPixmap( 0, PIXMAP_POP3FOLDER );
+ }
+ else
+ {
+ setPixmap( 0, PIXMAP_INBOXFOLDER);
+ }
+ setText( 0, folder->getDisplayName() );
+}
+
+void NNTPfolderItem::refresh(QList<RecMail>&target)
+{
+ if (folder->may_select())
+ nntp->getWrapper()->listMessages( folder->getName(),target );
+}
+
+RecBody NNTPfolderItem::fetchBody(const RecMail&aMail)
+{
+ return nntp->getWrapper()->fetchBody(aMail);
+}
+
+QPopupMenu * NNTPfolderItem::getContextMenu()
+{
+ QPopupMenu *m = new QPopupMenu(0);
+ if (m)
+ {
+ m->insertItem(QObject::tr("Refresh header list",contextName),0);
+ m->insertItem(QObject::tr("Move/Copie all mails",contextName),1);
+ }
+ return m;
+}
+
+void NNTPfolderItem::downloadMails()
+{
+ AccountView*bl = nntp->accountView();
+ if (!bl) return;
+ bl->downloadMails(folder,nntp->getWrapper());
+}
+
+void NNTPfolderItem::contextMenuSelected(int which)
+{
+ AccountView * view = (AccountView*)listView();
+ switch (which)
+ {
+ case 0:
+ /* must be 'cause pop3 lists are cached */
+ nntp->getWrapper()->logout();
+ view->refreshCurrent();
+ break;
+ case 1:
+ downloadMails();
+ break;
+ default:
+ break;
+ }
+}
+
+/**
* IMAP Account stuff
diff --git a/noncore/net/mail/accountitem.h b/noncore/net/mail/accountitem.h
index 99208b6..a138c9b 100644
--- a/noncore/net/mail/accountitem.h
+++ b/noncore/net/mail/accountitem.h
@@ -13,2 +13,3 @@ class AccountView;
class POP3account;
+class NNTPaccount;
class IMAPaccount;
@@ -78,2 +79,41 @@ protected:
+
+class NNTPviewItem : public AccountViewItem
+{
+
+public:
+ NNTPviewItem( NNTPaccount *a, AccountView *parent );
+ virtual ~NNTPviewItem();
+ virtual void refresh( QList<RecMail> &target );
+ virtual RecBody fetchBody( const RecMail &mail );
+ AbstractMail *getWrapper();
+ virtual QPopupMenu * getContextMenu();
+ virtual void contextMenuSelected(int);
+
+protected:
+ NNTPaccount *account;
+ virtual void refresh();
+ AbstractMail *wrapper;
+ void disconnect();
+ void setOnOffline();
+};
+
+class NNTPfolderItem : public AccountViewItem
+{
+
+public:
+ NNTPfolderItem( Folder *folder, NNTPviewItem *parent , QListViewItem*after );
+ virtual ~NNTPfolderItem();
+ virtual void refresh(QList<RecMail>&);
+ virtual RecBody fetchBody(const RecMail&);
+ virtual QPopupMenu * getContextMenu();
+ virtual void contextMenuSelected(int);
+
+protected:
+ void downloadMails();
+ NNTPviewItem *nntp;
+};
+
+
+
class IMAPviewItem : public AccountViewItem
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp
index 2ddf834..c2185f2 100644
--- a/noncore/net/mail/accountview.cpp
+++ b/noncore/net/mail/accountview.cpp
@@ -77,2 +77,9 @@ void AccountView::populate( QList<Account> list )
}
+ else if ( it->getType().compare( "NNTP" ) == 0 )
+ {
+ NNTPaccount *nntp = static_cast<NNTPaccount *>(it);
+ qDebug( "added NNTP " + nntp->getAccountName() );
+ /* must not be hold 'cause it isn't required */
+ (void) new NNTPviewItem( nntp, this );
+ }
}
diff --git a/noncore/net/mail/libmailwrapper/abstractmail.cpp b/noncore/net/mail/libmailwrapper/abstractmail.cpp
index 592cd5e..741a8e1 100644
--- a/noncore/net/mail/libmailwrapper/abstractmail.cpp
+++ b/noncore/net/mail/libmailwrapper/abstractmail.cpp
@@ -3,2 +3,3 @@
#include "pop3wrapper.h"
+#include "nntpwrapper.h"
#include "mhwrapper.h"
@@ -24,2 +25,7 @@ AbstractMail* AbstractMail::getWrapper(POP3account *a)
+AbstractMail* AbstractMail::getWrapper(NNTPaccount *a)
+{
+ return new NNTPwrapper(a);
+}
+
AbstractMail* AbstractMail::getWrapper(const QString&a,const QString&name)
diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h
index f93bab4..b6e1538 100644
--- a/noncore/net/mail/libmailwrapper/abstractmail.h
+++ b/noncore/net/mail/libmailwrapper/abstractmail.h
@@ -51,2 +51,3 @@ public:
static AbstractMail* getWrapper(POP3account *a);
+ static AbstractMail* getWrapper(NNTPaccount *a);
/* mbox only! */
diff --git a/noncore/net/mail/libmailwrapper/libmailwrapper.pro b/noncore/net/mail/libmailwrapper/libmailwrapper.pro
index 71f6cca..8ea04a4 100644
--- a/noncore/net/mail/libmailwrapper/libmailwrapper.pro
+++ b/noncore/net/mail/libmailwrapper/libmailwrapper.pro
@@ -15,3 +15,4 @@ HEADERS = mailwrapper.h \
statusmail.h \
- mhwrapper.h
+ mhwrapper.h \
+ nntpwrapper.h
@@ -29,3 +30,4 @@ SOURCES = imapwrapper.cpp \
statusmail.cpp \
- mhwrapper.cpp
+ mhwrapper.cpp \
+ nntpwrapper.cpp
diff --git a/noncore/net/mail/libmailwrapper/nntpwrapper.cpp b/noncore/net/mail/libmailwrapper/nntpwrapper.cpp
new file mode 100644
index 0000000..e73a890
--- a/dev/null
+++ b/noncore/net/mail/libmailwrapper/nntpwrapper.cpp
@@ -0,0 +1,241 @@
+#include "nntpwrapper.h"
+#include "logindialog.h"
+#include "mailtypes.h"
+
+#include <qfile.h>
+
+#include <stdlib.h>
+
+#include <libetpan/libetpan.h>
+#include <libetpan/nntpdriver.h>
+
+
+
+#define HARD_MSG_SIZE_LIMIT 5242880
+
+NNTPwrapper::NNTPwrapper( NNTPaccount *a )
+: Genericwrapper() {
+ account = a;
+ m_nntp = NULL;
+ msgTempName = a->getFileName()+"_msg_cache";
+ last_msg_id = 0;
+}
+
+NNTPwrapper::~NNTPwrapper() {
+ logout();
+ QFile msg_cache(msgTempName);
+ if (msg_cache.exists()) {
+ msg_cache.remove();
+ }
+}
+
+void NNTPwrapper::nntp_progress( size_t current, size_t maximum ) {
+ qDebug( "NNTP: %i of %i", current, maximum );
+}
+
+
+RecBody NNTPwrapper::fetchBody( const RecMail &mail ) {
+ int err = NEWSNNTP_NO_ERROR;
+ char *message = 0;
+ size_t length = 0;
+
+ login();
+ if ( !m_nntp ) {
+ return RecBody();
+ }
+
+ RecBody body;
+ mailmessage * mailmsg;
+ if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) {
+ qDebug("Message to large: %i",mail.Msgsize());
+ return body;
+ }
+
+ QFile msg_cache(msgTempName);
+
+ cleanMimeCache();
+
+ if (mail.getNumber()!=last_msg_id) {
+ if (msg_cache.exists()) {
+ msg_cache.remove();
+ }
+ msg_cache.open(IO_ReadWrite|IO_Truncate);
+ last_msg_id = mail.getNumber();
+ err = mailsession_get_message(m_nntp->sto_session, mail.getNumber(), &mailmsg);
+ err = mailmessage_fetch(mailmsg,&message,&length);
+ msg_cache.writeBlock(message,length);
+ } else {
+ QString msg="";
+ msg_cache.open(IO_ReadOnly);
+ message = new char[4096];
+ memset(message,0,4096);
+ while (msg_cache.readBlock(message,4095)>0) {
+ msg+=message;
+ memset(message,0,4096);
+ }
+ delete message;
+ message = (char*)malloc(msg.length()+1*sizeof(char));
+ memset(message,0,msg.length()+1);
+ memcpy(message,msg.latin1(),msg.length());
+ /* transform to libetpan stuff */
+ mailmsg = mailmessage_new();
+ mailmessage_init(mailmsg, NULL, data_message_driver, 0, strlen(message));
+ generic_message_t * msg_data;
+ msg_data = (generic_message_t *)mailmsg->msg_data;
+ msg_data->msg_fetched = 1;
+ msg_data->msg_message = message;
+ msg_data->msg_length = strlen(message);
+ }
+ body = parseMail(mailmsg);
+
+ /* clean up */
+ if (mailmsg)
+ mailmessage_free(mailmsg);
+ if (message)
+ free(message);
+
+ return body;
+}
+
+
+void NNTPwrapper::listMessages(const QString &, QList<RecMail> &target )
+{
+ login();
+ if (!m_nntp)
+ return;
+ uint32_t res_messages,res_recent,res_unseen;
+ mailsession_status_folder(m_nntp->sto_session,"INBOX",&res_messages,&res_recent,&res_unseen);
+ parseList(target,m_nntp->sto_session,"INBOX");
+}
+
+void NNTPwrapper::login()
+{
+ if (account->getOffline())
+ return;
+ /* we'll hold the line */
+ if ( m_nntp != NULL )
+ return;
+
+ const char *server, *user, *pass;
+ uint16_t port;
+ int err = NEWSNNTP_NO_ERROR;
+
+ server = account->getServer().latin1();
+ port = account->getPort().toUInt();
+
+ if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
+ LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
+ login.show();
+ if ( QDialog::Accepted == login.exec() ) {
+ // ok
+ user = login.getUser().latin1();
+ pass = login.getPassword().latin1();
+ } else {
+ // cancel
+ qDebug( "NNTP: Login canceled" );
+ return;
+ }
+ } else {
+ user = account->getUser().latin1();
+ pass = account->getPassword().latin1();
+ }
+
+ // bool ssl = account->getSSL();
+
+ m_nntp=mailstorage_new(NULL);
+
+ int conntypeset = account->ConnectionType();
+ int conntype = 0;
+ if ( conntypeset == 3 ) {
+ conntype = CONNECTION_TYPE_COMMAND;
+ } else if ( conntypeset == 2 ) {
+ conntype = CONNECTION_TYPE_TLS;
+ } else if ( conntypeset == 1 ) {
+ conntype = CONNECTION_TYPE_STARTTLS;
+ } else if ( conntypeset == 0 ) {
+ conntype = CONNECTION_TYPE_TRY_STARTTLS;
+ }
+
+ nntp_mailstorage_init(m_nntp,(char*)server, port, NULL, conntype, NNTP_AUTH_TYPE_PLAIN,
+ (char*)user,(char*)pass,0,0,0);
+
+ err = mailstorage_connect(m_nntp);
+
+ if (err != NEWSNNTP_NO_ERROR) {
+ qDebug( QString( "FEHLERNUMMER %1" ).arg( err ) );
+ // Global::statusMessage(tr("Error initializing folder"));
+ mailstorage_free(m_nntp);
+ m_nntp = 0;
+ }
+}
+
+void NNTPwrapper::logout()
+{
+ int err = NEWSNNTP_NO_ERROR;
+ if ( m_nntp == NULL )
+ return;
+ mailstorage_free(m_nntp);
+ m_nntp = 0;
+}
+
+QList<Folder>* NNTPwrapper::listFolders() {
+ QList<Folder> * folders = new QList<Folder>();
+ folders->setAutoDelete( false );
+ clist *result = 0;
+
+ // int err =
+// if ( err == _NO_ERROR ) {
+// current = result->first;
+// for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) {
+
+
+// Folder*inb=new Folder("INBOX","/");
+
+
+// folders->append(inb);
+ return folders;
+}
+
+
+void NNTPwrapper::answeredMail(const RecMail&) {}
+
+void NNTPwrapper::statusFolder(folderStat&target_stat,const QString&) {
+ login();
+ target_stat.message_count = 0;
+ target_stat.message_unseen = 0;
+ target_stat.message_recent = 0;
+ if (!m_nntp)
+ return;
+ int r = mailsession_status_folder(m_nntp->sto_session,0,&target_stat.message_count,
+ &target_stat.message_recent,&target_stat.message_unseen);
+}
+
+
+encodedString* NNTPwrapper::fetchRawBody(const RecMail&mail) {
+ char*target=0;
+ size_t length=0;
+ encodedString*res = 0;
+ mailmessage * mailmsg = 0;
+ int err = mailsession_get_message(m_nntp->sto_session, mail.getNumber(), &mailmsg);
+ err = mailmessage_fetch(mailmsg,&target,&length);
+ if (mailmsg)
+ mailmessage_free(mailmsg);
+ if (target) {
+ res = new encodedString(target,length);
+ }
+ return res;
+}
+
+const QString&NNTPwrapper::getType()const {
+ return account->getType();
+}
+
+const QString&NNTPwrapper::getName()const{
+ return account->getAccountName();
+}
+
+void NNTPwrapper::deleteMail(const RecMail&mail) {
+}
+
+int NNTPwrapper::deleteAllMail(const Folder*) {
+}
diff --git a/noncore/net/mail/libmailwrapper/nntpwrapper.h b/noncore/net/mail/libmailwrapper/nntpwrapper.h
new file mode 100644
index 0000000..e47e68f
--- a/dev/null
+++ b/noncore/net/mail/libmailwrapper/nntpwrapper.h
@@ -0,0 +1,48 @@
+#ifndef __NNTPWRAPPER
+#define __NNTPWRAPPER
+
+#include "mailwrapper.h"
+#include "genericwrapper.h"
+#include <qstring.h>
+#include <libetpan/clist.h>
+
+class encodedString;
+struct mailstorage;
+struct mailfolder;
+
+class NNTPwrapper : public Genericwrapper
+{
+
+ Q_OBJECT
+
+public:
+ NNTPwrapper( NNTPaccount *a );
+ virtual ~NNTPwrapper();
+
+ /* mailbox will be ignored */
+ virtual void listMessages(const QString & mailbox, QList<RecMail> &target );
+ /* should only get the subscribed one */
+ virtual QList<Folder>* listFolders();
+ /* mailbox will be ignored */
+ virtual void statusFolder(folderStat&target_stat,const QString & mailbox="INBOX");
+
+ virtual void deleteMail(const RecMail&mail);
+ virtual void answeredMail(const RecMail&mail);
+ virtual int deleteAllMail(const Folder*);
+
+ virtual RecBody fetchBody( const RecMail &mail );
+ virtual encodedString* fetchRawBody(const RecMail&mail);
+ virtual void logout();
+ virtual const QString&getType()const;
+ virtual const QString&getName()const;
+ static void nntp_progress( size_t current, size_t maximum );
+
+protected:
+ void login();
+ NNTPaccount *account;
+ mailstorage* m_nntp;
+
+
+};
+
+#endif
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 14c2059..6fab401 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -7,3 +7,3 @@
#include <qfile.h>
-#include <qstring.h>
+//#include <qstring.h>
diff --git a/noncore/net/mail/nntpconfigui.ui b/noncore/net/mail/nntpconfigui.ui
index cc439f4..7769804 100644
--- a/noncore/net/mail/nntpconfigui.ui
+++ b/noncore/net/mail/nntpconfigui.ui
@@ -13,4 +13,4 @@
<y>0</y>
- <width>228</width>
- <height>320</height>
+ <width>413</width>
+ <height>520</height>
</rect>
@@ -27,2 +27,33 @@
</property>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>3</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>3</number>
+ </property>
+ <widget>
+ <class>QTabWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TabWidget2</cstring>
+ </property>
+ <property>
+ <name>layoutMargin</name>
+ </property>
+ <property>
+ <name>layoutSpacing</name>
+ </property>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>Account</string>
+ </attribute>
<grid>
@@ -30,3 +61,3 @@
<name>margin</name>
- <number>4</number>
+ <number>3</number>
</property>
@@ -140,3 +171,3 @@
</widget>
- <widget row="5" column="0" rowspan="1" colspan="2" >
+ <widget row="5" column="0" rowspan="2" colspan="2" >
<class>Line</class>
@@ -247,2 +278,66 @@
</widget>
+ <widget>
+ <class>QWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>tab</cstring>
+ </property>
+ <attribute>
+ <name>title</name>
+ <string>Groups</string>
+ </attribute>
+ <vbox>
+ <property stdset="1">
+ <name>margin</name>
+ <number>3</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>3</number>
+ </property>
+ <widget>
+ <class>QListView</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>ListViewGroups</cstring>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>GetNGButton</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Get newsgroup list from server</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>QListView</class>
+ <header location="global">qlistview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image>
+ <name>image0</name>
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753</data>
+ </image>
+</images>
<tabstops>