From dcf152e23f7cc85fe2e46521e07b64e2288efdda Mon Sep 17 00:00:00 2001 From: harlekin Date: Sun, 29 Feb 2004 21:55:06 +0000 Subject: beginning of nntp stuff --- (limited to 'noncore/net/mail') 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 @@ -209,6 +209,196 @@ 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 & ) +{ + refresh(); +} + +void NNTPviewItem::refresh() +{ + if (account->getOffline()) return; + QList *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&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 */ IMAPviewItem::IMAPviewItem( IMAPaccount *a, AccountView *parent ) 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 @@ -11,6 +11,7 @@ class QPopupMenu; class Selectstore; class AccountView; class POP3account; +class NNTPaccount; class IMAPaccount; class AbstractMail; class Folder; @@ -76,6 +77,45 @@ protected: POP3viewItem *pop3; }; + +class NNTPviewItem : public AccountViewItem +{ + +public: + NNTPviewItem( NNTPaccount *a, AccountView *parent ); + virtual ~NNTPviewItem(); + virtual void refresh( QList &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&); + virtual RecBody fetchBody(const RecMail&); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + +protected: + void downloadMails(); + NNTPviewItem *nntp; +}; + + + class IMAPviewItem : public AccountViewItem { friend class IMAPfolderItem; 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 @@ -75,7 +75,14 @@ void AccountView::populate( QList list ) /* must not be hold 'cause it isn't required */ (void) new POP3viewItem( pop3, this ); } - } + else if ( it->getType().compare( "NNTP" ) == 0 ) + { + NNTPaccount *nntp = static_cast(it); + qDebug( "added NNTP " + nntp->getAccountName() ); + /* must not be hold 'cause it isn't required */ + (void) new NNTPviewItem( nntp, this ); + } + } } void AccountView::refresh(QListViewItem *item) 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 @@ -1,6 +1,7 @@ #include "abstractmail.h" #include "imapwrapper.h" #include "pop3wrapper.h" +#include "nntpwrapper.h" #include "mhwrapper.h" #include "mboxwrapper.h" #include "mailtypes.h" @@ -22,6 +23,11 @@ AbstractMail* AbstractMail::getWrapper(POP3account *a) return new POP3wrapper(a); } +AbstractMail* AbstractMail::getWrapper(NNTPaccount *a) +{ + return new NNTPwrapper(a); +} + AbstractMail* AbstractMail::getWrapper(const QString&a,const QString&name) { return new MHwrapper(a,name); @@ -48,7 +54,7 @@ encodedString* AbstractMail::decode_String(const encodedString*text,const QStrin int err = mailmime_part_parse(text->Content(),text->Length(),&index,mimetype, &result_text,&target_length); - + encodedString* result = new encodedString(); if (err == MAILIMF_NO_ERROR) { result->setContent(result_text,target_length); @@ -61,7 +67,7 @@ QString AbstractMail::convert_String(const char*text) { size_t index = 0; char*res = 0; - + /* attention - doesn't work with arm systems! */ int err = mailmime_encoded_phrase_parse("iso-8859-1", text, strlen(text),&index, "iso-8859-1",&res); 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 @@ -49,6 +49,7 @@ public: static AbstractMail* getWrapper(IMAPaccount *a); static AbstractMail* getWrapper(POP3account *a); + static AbstractMail* getWrapper(NNTPaccount *a); /* mbox only! */ static AbstractMail* getWrapper(const QString&a,const QString&name="Local Folders"); 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 @@ -13,7 +13,8 @@ HEADERS = mailwrapper.h \ logindialog.h \ sendmailprogress.h \ statusmail.h \ - mhwrapper.h + mhwrapper.h \ + nntpwrapper.h SOURCES = imapwrapper.cpp \ mailwrapper.cpp \ @@ -27,7 +28,8 @@ SOURCES = imapwrapper.cpp \ logindialog.cpp \ sendmailprogress.cpp \ statusmail.cpp \ - mhwrapper.cpp + mhwrapper.cpp \ + nntpwrapper.cpp INTERFACES = logindialogui.ui \ sendmailprogressui.ui 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 + +#include + +#include +#include + + + +#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 &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* NNTPwrapper::listFolders() { + QList * folders = new QList(); + 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 +#include + +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 &target ); + /* should only get the subscribed one */ + virtual QList* 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 @@ -5,7 +5,7 @@ #include #include #include -#include +//#include /* we don't fetch messages larger than 5 MB */ #define HARD_MSG_SIZE_LIMIT 5242880 @@ -93,7 +93,7 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail ) { return body; } -void POP3wrapper::listMessages(const QString &, QList &target ) +void POP3wrapper::listMessages(const QString &, QList &target ) { login(); if (!m_pop3) @@ -167,7 +167,7 @@ void POP3wrapper::login() } } -void POP3wrapper::logout() +void POP3wrapper::logout() { int err = MAILPOP3_NO_ERROR; if ( m_pop3 == NULL ) 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 @@ -11,8 +11,8 @@ 0 0 - 228 - 320 + 413 + 520 @@ -25,136 +25,20 @@ layoutSpacing - + margin - 4 + 3 spacing 3 - - QLineEdit - - name - serverLine - - - - QLabel - - name - portLabel - - - text - Port - - - - QLineEdit - - name - portLine - - - - QLineEdit - - name - accountLine - - - toolTip - Name of the Account - - - - QLabel - - name - accountLabel - - - text - Account - - - - QLabel - - name - serverLabel - - - enabled - true - - - caption - - - - text - Server - - - layoutMargin - - - layoutSpacing - - - - Line - - name - line1 - - - caption - - - - orientation - Horizontal - - - layoutMargin - - - layoutSpacing - - - - QCheckBox - - name - sslBox - - - text - Use SSL - - - - Line + + QTabWidget name - line2 - - - enabled - true - - - caption - - - - orientation - Horizontal + TabWidget2 layoutMargin @@ -162,89 +46,300 @@ layoutSpacing + + QWidget + + name + tab + + + title + Account + + + + margin + 3 + + + spacing + 3 + + + QLineEdit + + name + serverLine + + + + QLabel + + name + portLabel + + + text + Port + + + + QLineEdit + + name + portLine + + + + QLineEdit + + name + accountLine + + + toolTip + Name of the Account + + + + QLabel + + name + accountLabel + + + text + Account + + + + QLabel + + name + serverLabel + + + enabled + true + + + caption + + + + text + Server + + + layoutMargin + + + layoutSpacing + + + + Line + + name + line1 + + + caption + + + + orientation + Horizontal + + + layoutMargin + + + layoutSpacing + + + + QCheckBox + + name + sslBox + + + text + Use SSL + + + + Line + + name + line2 + + + enabled + true + + + caption + + + + orientation + Horizontal + + + layoutMargin + + + layoutSpacing + + + + QLabel + + name + userLabel + + + text + User + + + + QLabel + + name + passLabel + + + text + Password + + + + + name + spacer + + + orientation + Vertical + + + sizeType + Expanding + + + sizeHint + + 20 + 20 + + + + + QCheckBox + + name + loginBox + + + text + Use Login + + + + QLineEdit + + name + userLine + + + enabled + false + + + + QLineEdit + + name + passLine + + + enabled + false + + + echoMode + Password + + + + + + QWidget + + name + tab + + + title + Groups + + + + margin + 3 + + + spacing + 3 + + + QListView + + name + ListViewGroups + + + + QPushButton + + name + GetNGButton + + + text + Get newsgroup list from server + + + + - - QLabel - - name - userLabel - - - text - User - - - - QLabel - - name - passLabel - - - text - Password - - - - - name - spacer - - - orientation - Vertical - - - sizeType - Expanding - - - sizeHint - - 20 - 20 - - - - - QCheckBox - - name - loginBox - - - text - Use Login - - - - QLineEdit - - name - userLine - - - enabled - false - - - - QLineEdit - - name - passLine - - - enabled - false - - - echoMode - Password - - - + + + + QListView +
qlistview.h
+ + -1 + -1 + + 0 + + 5 + 5 + + image0 +
+
+ + + image0 + 789c6dd2c10ac2300c00d07bbf2234b7229d1ddec44f503c0ae2a154410f53d0ed20e2bf6bdb656dd6861dd23d9a66591b0587fd1654235ebded6f0edcd53e419d87ae7b1f4f9b8f906d0bfe012317426a70b07bdc2f3ec77f8ed6b89559061a0343d06a124cc105596482585094bc0ae599b04646c9018926491b2205e140c485cace25755c175d0a967b622ff900b8cc9c7d29af594ea722d589167f813aa852ba07d94b9dce296e883fe7bb163f23896753 + + accountLine serverLine -- cgit v0.9.0.2