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
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
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
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
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
00137 user = login.getUser().latin1();
00138 pass = login.getPassword().latin1();
00139 } else {
00140
00141 odebug << "POP3: Login canceled" << oendl;
00142 return;
00143 }
00144 } else {
00145 user = account->getUser().latin1();
00146 pass = account->getPassword().latin1();
00147 }
00148
00149
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
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 }