Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

pop3wrapper.cpp

Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include "pop3wrapper.h"
00003 #include "mailtypes.h"
00004 #include "logindialog.h"
00005 #include <libetpan/libetpan.h>
00006 
00007 #include <opie2/odebug.h>
00008 #include <qpe/global.h>
00009 #include <qfile.h>
00010 #include <qmessagebox.h>
00011 
00012 /* we don't fetch messages larger than 5 MB */
00013 #define HARD_MSG_SIZE_LIMIT 5242880
00014 
00015 using namespace Opie::Core;
00016 POP3wrapper::POP3wrapper( POP3account *a )
00017 : Genericwrapper() {
00018     account = a;
00019     m_pop3 = NULL;
00020     msgTempName = a->getFileName()+"_msg_cache";
00021     last_msg_id = 0;
00022     m_maxsize = account->getMaxSize();
00023     m_checksize = account->getCheckMaxSize();
00024 }
00025 
00026 POP3wrapper::~POP3wrapper() {
00027     logout();
00028     QFile msg_cache(msgTempName);
00029     if (msg_cache.exists()) {
00030         msg_cache.remove();
00031     }
00032 }
00033 
00034 void POP3wrapper::pop3_progress( size_t current, size_t maximum ) {
00035     odebug << "POP3: " << current << " of " << maximum << "" << oendl;
00036 }
00037 
00038 RecBodyP POP3wrapper::fetchBody( const RecMailP &mail ) {
00039     int err = MAILPOP3_NO_ERROR;
00040     char *message = 0;
00041     size_t length = 0;
00042 
00043     RecBodyP body = new RecBody();
00044 
00045     login();
00046     if ( !m_pop3 ) {
00047         return body;
00048     }
00049 
00050     mailmessage * mailmsg;
00051     if (mail->Msgsize()/1024>m_maxsize && m_checksize && mail->getNumber()!=last_msg_id) {
00052         QString quest = QString(tr("Download mail?\nIt is %1 kByte but your limit is %2 kByte")).arg(mail->Msgsize()/1024).arg(m_maxsize);
00053         int yesno = QMessageBox::warning(0,tr("Download message"),
00054             quest,tr("Yes"),tr("No"),QString::null,0,1);
00055         odebug << "Message to large: " << mail->Msgsize() << "" << oendl;
00056         if (yesno==1)
00057             return body;
00058     }
00059 
00060     QFile msg_cache(msgTempName);
00061 
00062     cleanMimeCache();
00063 
00064     if (mail->getNumber()!=last_msg_id) {
00065         if (msg_cache.exists()) {
00066             msg_cache.remove();
00067         }
00068         msg_cache.open(IO_ReadWrite|IO_Truncate);
00069         last_msg_id = mail->getNumber();
00070         err = mailsession_get_message(m_pop3->sto_session, mail->getNumber(), &mailmsg);
00071         err = mailmessage_fetch(mailmsg,&message,&length);
00072         msg_cache.writeBlock(message,length);
00073     } else {
00074         QString msg="";
00075         msg_cache.open(IO_ReadOnly);
00076         message = new char[4096];
00077         memset(message,0,4096);
00078         while (msg_cache.readBlock(message,4095)>0) {
00079             msg+=message;
00080             memset(message,0,4096);
00081         }
00082         delete message;
00083         message = (char*)malloc(msg.length()+1*sizeof(char));
00084         memset(message,0,msg.length()+1);
00085         memcpy(message,msg.latin1(),msg.length());
00086         /* transform to libetpan stuff */
00087         mailmsg = mailmessage_new();
00088         mailmessage_init(mailmsg, NULL, data_message_driver, 0, strlen(message));
00089         generic_message_t * msg_data;
00090         msg_data = (generic_message_t *)mailmsg->msg_data;
00091         msg_data->msg_fetched = 1;
00092         msg_data->msg_message = message;
00093         msg_data->msg_length = strlen(message);
00094     }
00095     body = parseMail(mailmsg);
00096 
00097     /* clean up */
00098     if (mailmsg)
00099         mailmessage_free(mailmsg);
00100     if (message)
00101         free(message);
00102 
00103     return body;
00104 }
00105 
00106 void POP3wrapper::listMessages(const QString &, QValueList<Opie::Core::OSmartPointer<RecMail> > &target )
00107 {
00108     login();
00109     if (!m_pop3)
00110         return;
00111     uint32_t res_messages,res_recent,res_unseen;
00112     mailsession_status_folder(m_pop3->sto_session,"INBOX",&res_messages,&res_recent,&res_unseen);
00113     parseList(target,m_pop3->sto_session,"INBOX");
00114     Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(res_messages));
00115 }
00116 
00117 void POP3wrapper::login()
00118 {
00119     if (account->getOffline())
00120         return;
00121     /* we'll hold the line */
00122     if ( m_pop3 != NULL )
00123         return;
00124 
00125     const char *server, *user, *pass;
00126     uint16_t port;
00127     int err = MAILPOP3_NO_ERROR;
00128 
00129     server = account->getServer().latin1();
00130     port = account->getPort().toUInt();
00131 
00132     if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
00133         LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
00134         login.show();
00135         if ( QDialog::Accepted == login.exec() ) {
00136             // ok
00137             user = login.getUser().latin1();
00138             pass = login.getPassword().latin1();
00139         } else {
00140             // cancel
00141             odebug << "POP3: Login canceled" << oendl;
00142             return;
00143         }
00144     } else {
00145         user = account->getUser().latin1();
00146         pass = account->getPassword().latin1();
00147     }
00148 
00149     //  bool ssl = account->getSSL();
00150 
00151     m_pop3=mailstorage_new(NULL);
00152 
00153     int conntypeset = account->ConnectionType();
00154     int conntype = 0;
00155     if ( conntypeset == 3 ) {
00156         conntype = CONNECTION_TYPE_COMMAND;
00157     } else if ( conntypeset == 2 ) {
00158         conntype = CONNECTION_TYPE_TLS;
00159     } else if ( conntypeset == 1 ) {
00160         conntype = CONNECTION_TYPE_STARTTLS;
00161     } else if ( conntypeset == 0 ) {
00162         conntype = CONNECTION_TYPE_TRY_STARTTLS;
00163     }
00164 
00165     //(ssl?CONNECTION_TYPE_TLS:CONNECTION_TYPE_PLAIN);
00166 
00167     pop3_mailstorage_init(m_pop3,(char*)server, port, NULL, conntype, POP3_AUTH_TYPE_PLAIN,
00168                           (char*)user,(char*)pass,0,0,0);
00169 
00170 
00171     err = mailstorage_connect(m_pop3);
00172     if (err != MAIL_NO_ERROR) {
00173         odebug << QString( "FEHLERNUMMER %1" ).arg(  err ) << oendl;
00174         Global::statusMessage(tr("Error initializing folder"));
00175         mailstorage_free(m_pop3);
00176         m_pop3 = 0;
00177     } else {
00178         mailsession * session = m_pop3->sto_session;
00179         mailpop3 * mail =  ( (  pop3_session_state_data * )session->sess_data )->pop3_session;
00180         if (mail) {
00181             mail->pop3_progr_fun = &pop3_progress;
00182         }
00183     }
00184 }
00185 
00186 void POP3wrapper::logout()
00187 {
00188     if ( m_pop3 == NULL )
00189         return;
00190     mailstorage_free(m_pop3);
00191     m_pop3 = 0;
00192 }
00193 
00194 
00195 QValueList<Opie::Core::OSmartPointer<Folder> >* POP3wrapper::listFolders() {
00196     QValueList<Opie::Core::OSmartPointer<Folder> >* folders = new QValueList<FolderP>();
00197     FolderP inb=new Folder("INBOX","/");
00198     folders->append(inb);
00199     return folders;
00200 }
00201 
00202 void POP3wrapper::deleteMail(const RecMailP&mail) {
00203     login();
00204     if (!m_pop3)
00205         return;
00206     int err = mailsession_remove_message(m_pop3->sto_session,mail->getNumber());
00207     if (err != MAIL_NO_ERROR) {
00208         Global::statusMessage(tr("error deleting mail"));
00209     }
00210 }
00211 
00212 void POP3wrapper::answeredMail(const RecMailP&) {}
00213 
00214 int POP3wrapper::deleteAllMail(const FolderP&) {
00215     login();
00216     if (!m_pop3)
00217         return 0;
00218     int res = 1;
00219 
00220     uint32_t result = 0;
00221     int err = mailsession_messages_number(m_pop3->sto_session,NULL,&result);
00222     if (err != MAIL_NO_ERROR) {
00223         Global::statusMessage(tr("Error getting folder info"));
00224         return 0;
00225     }
00226     for (unsigned int i = 0; i < result; ++i) {
00227         err = mailsession_remove_message(m_pop3->sto_session,i+1);
00228         if (err != MAIL_NO_ERROR) {
00229             Global::statusMessage(tr("Error deleting mail %1").arg(i+1));
00230             res=0;
00231         }
00232         break;
00233     }
00234     return res;
00235 }
00236 
00237 void POP3wrapper::statusFolder(folderStat&target_stat,const QString&) {
00238     login();
00239     target_stat.message_count = 0;
00240     target_stat.message_unseen = 0;
00241     target_stat.message_recent = 0;
00242     if (!m_pop3)
00243         return;
00244     int r = mailsession_status_folder(m_pop3->sto_session,0,&target_stat.message_count,
00245                                       &target_stat.message_recent,&target_stat.message_unseen);
00246     if (r != MAIL_NO_ERROR) {
00247         odebug << "error getting folter status." << oendl;
00248     }
00249 }
00250 
00251 encodedString* POP3wrapper::fetchRawBody(const RecMailP&mail) {
00252     char*target=0;
00253     size_t length=0;
00254     encodedString*res = 0;
00255     mailmessage * mailmsg = 0;
00256     int err = mailsession_get_message(m_pop3->sto_session, mail->getNumber(), &mailmsg);
00257     err = mailmessage_fetch(mailmsg,&target,&length);
00258     if (mailmsg)
00259         mailmessage_free(mailmsg);
00260     if (target) {
00261         res = new encodedString(target,length);
00262     }
00263     return res;
00264 }
00265 
00266 MAILLIB::ATYPE POP3wrapper::getType()const {
00267     return account->getType();
00268 }
00269 
00270 const QString&POP3wrapper::getName()const{
00271     return account->getAccountName();
00272 }

Generated on Sat Nov 5 16:17:38 2005 for OPIE by  doxygen 1.4.2