summaryrefslogtreecommitdiff
path: root/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
Unidiff
Diffstat (limited to 'noncore/net/mail/libmailwrapper/pop3wrapper.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp137
1 files changed, 73 insertions, 64 deletions
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 67bde38..f5eca4a 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -8,37 +8,33 @@
8#include <qstring.h> 8#include <qstring.h>
9 9
10/* we don't fetch messages larger than 5 MB */ 10/* we don't fetch messages larger than 5 MB */
11#define HARD_MSG_SIZE_LIMIT 5242880 11#define HARD_MSG_SIZE_LIMIT 5242880
12 12
13POP3wrapper::POP3wrapper( POP3account *a ) 13POP3wrapper::POP3wrapper( POP3account *a )
14 : Genericwrapper() 14: Genericwrapper() {
15{
16 account = a; 15 account = a;
17 m_pop3 = NULL; 16 m_pop3 = NULL;
18 m_folder = NULL; 17 m_folder = NULL;
19 msgTempName = a->getFileName()+"_msg_cache"; 18 msgTempName = a->getFileName()+"_msg_cache";
20 last_msg_id = 0; 19 last_msg_id = 0;
21} 20}
22 21
23POP3wrapper::~POP3wrapper() 22POP3wrapper::~POP3wrapper() {
24{
25 logout(); 23 logout();
26 QFile msg_cache(msgTempName); 24 QFile msg_cache(msgTempName);
27 if (msg_cache.exists()) { 25 if (msg_cache.exists()) {
28 msg_cache.remove(); 26 msg_cache.remove();
29 } 27 }
30} 28}
31 29
32void POP3wrapper::pop3_progress( size_t current, size_t maximum ) 30void POP3wrapper::pop3_progress( size_t current, size_t maximum ) {
33{
34 qDebug( "POP3: %i of %i", current, maximum ); 31 qDebug( "POP3: %i of %i", current, maximum );
35} 32}
36 33
37RecBody POP3wrapper::fetchBody( const RecMail &mail ) 34RecBody POP3wrapper::fetchBody( const RecMail &mail ) {
38{
39 int err = MAILPOP3_NO_ERROR; 35 int err = MAILPOP3_NO_ERROR;
40 char *message = 0; 36 char *message = 0;
41 size_t length = 0; 37 size_t length = 0;
42 38
43 login(); 39 login();
44 if ( !m_pop3 ) { 40 if ( !m_pop3 ) {
@@ -87,65 +83,83 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
87 msg_data->msg_message = message; 83 msg_data->msg_message = message;
88 msg_data->msg_length = strlen(message); 84 msg_data->msg_length = strlen(message);
89 } 85 }
90 body = parseMail(mailmsg); 86 body = parseMail(mailmsg);
91 87
92 /* clean up */ 88 /* clean up */
93 if (mailmsg) mailmessage_free(mailmsg); 89 if (mailmsg)
94 if (message) free(message); 90 mailmessage_free(mailmsg);
91 if (message)
92 free(message);
95 93
96 return body; 94 return body;
97} 95}
98 96
99void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) 97void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) {
100{
101 login(); 98 login();
102 if (!m_pop3) return; 99 if (!m_pop3)
100 return;
103 uint32_t res_messages,res_recent,res_unseen; 101 uint32_t res_messages,res_recent,res_unseen;
104 mailsession_status_folder(m_folder->fld_session,"INBOX",&res_messages,&res_recent,&res_unseen); 102 mailsession_status_folder(m_folder->fld_session,"INBOX",&res_messages,&res_recent,&res_unseen);
105 parseList(target,m_folder->fld_session,"INBOX"); 103 parseList(target,m_folder->fld_session,"INBOX");
106 Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(res_messages)); 104 Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(res_messages));
107} 105}
108 106
109void POP3wrapper::login() 107void POP3wrapper::login() {
110{ 108 if (account->getOffline())
111 if (account->getOffline()) return; 109 return;
112 /* we'll hold the line */ 110 /* we'll hold the line */
113 if ( m_pop3 != NULL ) return; 111 if ( m_pop3 != NULL )
112 return;
114 113
115 const char *server, *user, *pass; 114 const char *server, *user, *pass;
116 uint16_t port; 115 uint16_t port;
117 int err = MAILPOP3_NO_ERROR; 116 int err = MAILPOP3_NO_ERROR;
118 117
119 server = account->getServer().latin1(); 118 server = account->getServer().latin1();
120 port = account->getPort().toUInt(); 119 port = account->getPort().toUInt();
121 120
122 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 121 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
123 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 122 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
124 login.show(); 123 login.show();
125 if ( QDialog::Accepted == login.exec() ) { 124 if ( QDialog::Accepted == login.exec() ) {
126 // ok 125 // ok
127 user = login.getUser().latin1(); 126 user = login.getUser().latin1();
128 pass = login.getPassword().latin1(); 127 pass = login.getPassword().latin1();
129 } else { 128 } else {
130 // cancel 129 // cancel
131 qDebug( "POP3: Login canceled" ); 130 qDebug( "POP3: Login canceled" );
132 return; 131 return;
133 } 132 }
134 } else { 133 } else {
135 user = account->getUser().latin1(); 134 user = account->getUser().latin1();
136 pass = account->getPassword().latin1(); 135 pass = account->getPassword().latin1();
137 } 136 }
138 137
139 bool ssl = account->getSSL(); 138 // bool ssl = account->getSSL();
140 139
141 m_pop3=mailstorage_new(NULL); 140 m_pop3=mailstorage_new(NULL);
142 int conntype = (ssl?CONNECTION_TYPE_TLS:CONNECTION_TYPE_PLAIN); 141
143 142 int conntypeset = account->ConnectionType();
144 pop3_mailstorage_init(m_pop3,(char*)server,port,NULL,conntype,POP3_AUTH_TYPE_PLAIN, 143 int conntype = 0;
145 (char*)user,(char*)pass,0,0,0); 144 if ( conntypeset == 3 ) {
145 conntype = CONNECTION_TYPE_COMMAND;
146 } else if ( conntypeset == 2 ) {
147 conntype = CONNECTION_TYPE_TLS;
148 } else if ( conntypeset == 1 ) {
149 conntype = CONNECTION_TYPE_STARTTLS;
150 } else if ( conntypeset == 0 ) {
151 conntype = CONNECTION_TYPE_TRY_STARTTLS;
152 }
153
154 //(ssl?CONNECTION_TYPE_TLS:CONNECTION_TYPE_PLAIN);
155
156 pop3_mailstorage_init(m_pop3,(char*)server, port, NULL, conntype, POP3_AUTH_TYPE_PLAIN,
157 (char*)user,(char*)pass,0,0,0);
158
159
146 160
147 m_folder = mailfolder_new(m_pop3, NULL, NULL); 161 m_folder = mailfolder_new(m_pop3, NULL, NULL);
148 162
149 if (m_folder==0) { 163 if (m_folder==0) {
150 Global::statusMessage(tr("Error initializing folder")); 164 Global::statusMessage(tr("Error initializing folder"));
151 mailstorage_free(m_pop3); 165 mailstorage_free(m_pop3);
@@ -160,50 +174,47 @@ void POP3wrapper::login()
160 m_folder = 0; 174 m_folder = 0;
161 mailstorage_free(m_pop3); 175 mailstorage_free(m_pop3);
162 m_pop3 = 0; 176 m_pop3 = 0;
163 } 177 }
164} 178}
165 179
166void POP3wrapper::logout() 180void POP3wrapper::logout() {
167{
168 int err = MAILPOP3_NO_ERROR; 181 int err = MAILPOP3_NO_ERROR;
169 if ( m_pop3 == NULL ) return; 182 if ( m_pop3 == NULL )
183 return;
170 mailfolder_free(m_folder); 184 mailfolder_free(m_folder);
171 m_folder = 0; 185 m_folder = 0;
172 mailstorage_free(m_pop3); 186 mailstorage_free(m_pop3);
173 m_pop3 = 0; 187 m_pop3 = 0;
174} 188}
175 189
176 190
177QList<Folder>* POP3wrapper::listFolders() 191QList<Folder>* POP3wrapper::listFolders() {
178{
179 QList<Folder> * folders = new QList<Folder>(); 192 QList<Folder> * folders = new QList<Folder>();
180 folders->setAutoDelete( false ); 193 folders->setAutoDelete( false );
181 Folder*inb=new Folder("INBOX","/"); 194 Folder*inb=new Folder("INBOX","/");
182 folders->append(inb); 195 folders->append(inb);
183 return folders; 196 return folders;
184} 197}
185 198
186void POP3wrapper::deleteMail(const RecMail&mail) 199void POP3wrapper::deleteMail(const RecMail&mail) {
187{
188 login(); 200 login();
189 if (!m_pop3) return; 201 if (!m_pop3)
202 return;
190 int err = mailsession_remove_message(m_folder->fld_session,mail.getNumber()); 203 int err = mailsession_remove_message(m_folder->fld_session,mail.getNumber());
191 if (err != MAIL_NO_ERROR) { 204 if (err != MAIL_NO_ERROR) {
192 Global::statusMessage(tr("error deleting mail")); 205 Global::statusMessage(tr("error deleting mail"));
193 } 206 }
194} 207}
195 208
196void POP3wrapper::answeredMail(const RecMail&) 209void POP3wrapper::answeredMail(const RecMail&) {}
197{
198}
199 210
200int POP3wrapper::deleteAllMail(const Folder*) 211int POP3wrapper::deleteAllMail(const Folder*) {
201{
202 login(); 212 login();
203 if (!m_pop3) return 0; 213 if (!m_pop3)
214 return 0;
204 int res = 1; 215 int res = 1;
205 216
206 uint32_t result = 0; 217 uint32_t result = 0;
207 int err = mailsession_messages_number(m_folder->fld_session,NULL,&result); 218 int err = mailsession_messages_number(m_folder->fld_session,NULL,&result);
208 if (err != MAIL_NO_ERROR) { 219 if (err != MAIL_NO_ERROR) {
209 Global::statusMessage(tr("Error getting folder info")); 220 Global::statusMessage(tr("Error getting folder info"));
@@ -217,41 +228,39 @@ int POP3wrapper::deleteAllMail(const Folder*)
217 } 228 }
218 break; 229 break;
219 } 230 }
220 return res; 231 return res;
221} 232}
222 233
223void POP3wrapper::statusFolder(folderStat&target_stat,const QString&) 234void POP3wrapper::statusFolder(folderStat&target_stat,const QString&) {
224{
225 login(); 235 login();
226 target_stat.message_count = 0; 236 target_stat.message_count = 0;
227 target_stat.message_unseen = 0; 237 target_stat.message_unseen = 0;
228 target_stat.message_recent = 0; 238 target_stat.message_recent = 0;
229 if (!m_pop3) return; 239 if (!m_pop3)
240 return;
230 int r = mailsession_status_folder(m_folder->fld_session,0,&target_stat.message_count, 241 int r = mailsession_status_folder(m_folder->fld_session,0,&target_stat.message_count,
231 &target_stat.message_recent,&target_stat.message_unseen); 242 &target_stat.message_recent,&target_stat.message_unseen);
232} 243}
233 244
234encodedString* POP3wrapper::fetchRawBody(const RecMail&mail) 245encodedString* POP3wrapper::fetchRawBody(const RecMail&mail) {
235{
236 char*target=0; 246 char*target=0;
237 size_t length=0; 247 size_t length=0;
238 encodedString*res = 0; 248 encodedString*res = 0;
239 mailmessage * mailmsg = 0; 249 mailmessage * mailmsg = 0;
240 int err = mailsession_get_message(m_folder->fld_session, mail.getNumber(), &mailmsg); 250 int err = mailsession_get_message(m_folder->fld_session, mail.getNumber(), &mailmsg);
241 err = mailmessage_fetch(mailmsg,&target,&length); 251 err = mailmessage_fetch(mailmsg,&target,&length);
242 if (mailmsg) mailmessage_free(mailmsg); 252 if (mailmsg)
253 mailmessage_free(mailmsg);
243 if (target) { 254 if (target) {
244 res = new encodedString(target,length); 255 res = new encodedString(target,length);
245 } 256 }
246 return res; 257 return res;
247} 258}
248 259
249const QString&POP3wrapper::getType()const 260const QString&POP3wrapper::getType()const {
250{
251 return account->getType(); 261 return account->getType();
252} 262}
253 263
254const QString&POP3wrapper::getName()const 264const QString&POP3wrapper::getName()const {
255{
256 return account->getAccountName(); 265 return account->getAccountName();
257} 266}