author | zautrix <zautrix> | 2004-07-03 16:33:12 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-07-03 16:33:12 (UTC) |
commit | e3b89230f065c48c84b48c88edb6eb088374c487 (patch) (unidiff) | |
tree | 162ea2ef909a6f82ccfcedf45d80d6c821174912 /kmicromail/libmailwrapper/pop3wrapper.cpp | |
parent | 2dd6ac0b2d24c91d35ce674a6c26351352df2b15 (diff) | |
download | kdepimpi-e3b89230f065c48c84b48c88edb6eb088374c487.zip kdepimpi-e3b89230f065c48c84b48c88edb6eb088374c487.tar.gz kdepimpi-e3b89230f065c48c84b48c88edb6eb088374c487.tar.bz2 |
Initial revision
Diffstat (limited to 'kmicromail/libmailwrapper/pop3wrapper.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kmicromail/libmailwrapper/pop3wrapper.cpp | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/kmicromail/libmailwrapper/pop3wrapper.cpp b/kmicromail/libmailwrapper/pop3wrapper.cpp new file mode 100644 index 0000000..e5d083a --- a/dev/null +++ b/kmicromail/libmailwrapper/pop3wrapper.cpp | |||
@@ -0,0 +1,265 @@ | |||
1 | #include <stdlib.h> | ||
2 | #include "pop3wrapper.h" | ||
3 | #include "mailtypes.h" | ||
4 | #include "logindialog.h" | ||
5 | #include <libetpan/libetpan.h> | ||
6 | |||
7 | |||
8 | #include <qpe/global.h> | ||
9 | #include <qfile.h> | ||
10 | |||
11 | /* we don't fetch messages larger than 5 MB */ | ||
12 | #define HARD_MSG_SIZE_LIMIT 5242880 | ||
13 | |||
14 | using namespace Opie::Core; | ||
15 | POP3wrapper::POP3wrapper( POP3account *a ) | ||
16 | : Genericwrapper() { | ||
17 | account = a; | ||
18 | m_pop3 = NULL; | ||
19 | msgTempName = a->getFileName()+"_msg_cache"; | ||
20 | last_msg_id = 0; | ||
21 | } | ||
22 | |||
23 | POP3wrapper::~POP3wrapper() { | ||
24 | logout(); | ||
25 | QFile msg_cache(msgTempName); | ||
26 | if (msg_cache.exists()) { | ||
27 | msg_cache.remove(); | ||
28 | } | ||
29 | } | ||
30 | |||
31 | void POP3wrapper::pop3_progress( size_t current, size_t maximum ) { | ||
32 | ; // odebug << "POP3: " << current << " of " << maximum << "" << oendl; | ||
33 | } | ||
34 | |||
35 | RecBodyP POP3wrapper::fetchBody( const RecMailP &mail ) { | ||
36 | int err = MAILPOP3_NO_ERROR; | ||
37 | char *message = 0; | ||
38 | size_t length = 0; | ||
39 | |||
40 | RecBodyP body = new RecBody(); | ||
41 | |||
42 | login(); | ||
43 | if ( !m_pop3 ) { | ||
44 | return body; | ||
45 | } | ||
46 | |||
47 | mailmessage * mailmsg; | ||
48 | if (mail->Msgsize()>HARD_MSG_SIZE_LIMIT) { | ||
49 | ; // odebug << "Message to large: " << mail->Msgsize() << "" << oendl; | ||
50 | return body; | ||
51 | } | ||
52 | |||
53 | QFile msg_cache(msgTempName); | ||
54 | |||
55 | cleanMimeCache(); | ||
56 | |||
57 | if (mail->getNumber()!=last_msg_id) { | ||
58 | if (msg_cache.exists()) { | ||
59 | msg_cache.remove(); | ||
60 | } | ||
61 | msg_cache.open(IO_ReadWrite|IO_Truncate); | ||
62 | last_msg_id = mail->getNumber(); | ||
63 | err = mailsession_get_message(m_pop3->sto_session, mail->getNumber(), &mailmsg); | ||
64 | err = mailmessage_fetch(mailmsg,&message,&length); | ||
65 | msg_cache.writeBlock(message,length); | ||
66 | } else { | ||
67 | QString msg=""; | ||
68 | msg_cache.open(IO_ReadOnly); | ||
69 | message = new char[4096]; | ||
70 | memset(message,0,4096); | ||
71 | while (msg_cache.readBlock(message,4095)>0) { | ||
72 | msg+=message; | ||
73 | memset(message,0,4096); | ||
74 | } | ||
75 | delete message; | ||
76 | message = (char*)malloc(msg.length()+1*sizeof(char)); | ||
77 | memset(message,0,msg.length()+1); | ||
78 | memcpy(message,msg.latin1(),msg.length()); | ||
79 | /* transform to libetpan stuff */ | ||
80 | mailmsg = mailmessage_new(); | ||
81 | mailmessage_init(mailmsg, NULL, data_message_driver, 0, strlen(message)); | ||
82 | generic_message_t * msg_data; | ||
83 | msg_data = (generic_message_t *)mailmsg->msg_data; | ||
84 | msg_data->msg_fetched = 1; | ||
85 | msg_data->msg_message = message; | ||
86 | msg_data->msg_length = strlen(message); | ||
87 | } | ||
88 | body = parseMail(mailmsg); | ||
89 | |||
90 | /* clean up */ | ||
91 | if (mailmsg) | ||
92 | mailmessage_free(mailmsg); | ||
93 | if (message) | ||
94 | free(message); | ||
95 | |||
96 | return body; | ||
97 | } | ||
98 | |||
99 | void POP3wrapper::listMessages(const QString &, QValueList<Opie::Core::OSmartPointer<RecMail> > &target ) | ||
100 | { | ||
101 | login(); | ||
102 | if (!m_pop3) | ||
103 | return; | ||
104 | uint32_t res_messages,res_recent,res_unseen; | ||
105 | mailsession_status_folder(m_pop3->sto_session,"INBOX",&res_messages,&res_recent,&res_unseen); | ||
106 | parseList(target,m_pop3->sto_session,"INBOX"); | ||
107 | Global::statusMessage( tr("Mailbox contains %1 mail(s)").arg(res_messages)); | ||
108 | } | ||
109 | |||
110 | void POP3wrapper::login() | ||
111 | { | ||
112 | if (account->getOffline()) | ||
113 | return; | ||
114 | /* we'll hold the line */ | ||
115 | if ( m_pop3 != NULL ) | ||
116 | return; | ||
117 | |||
118 | const char *server, *user, *pass; | ||
119 | uint16_t port; | ||
120 | int err = MAILPOP3_NO_ERROR; | ||
121 | |||
122 | server = account->getServer().latin1(); | ||
123 | port = account->getPort().toUInt(); | ||
124 | |||
125 | if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { | ||
126 | LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); | ||
127 | login.show(); | ||
128 | if ( QDialog::Accepted == login.exec() ) { | ||
129 | // ok | ||
130 | user = login.getUser().latin1(); | ||
131 | pass = login.getPassword().latin1(); | ||
132 | } else { | ||
133 | // cancel | ||
134 | ; // odebug << "POP3: Login canceled" << oendl; | ||
135 | return; | ||
136 | } | ||
137 | } else { | ||
138 | user = account->getUser().latin1(); | ||
139 | pass = account->getPassword().latin1(); | ||
140 | } | ||
141 | |||
142 | // bool ssl = account->getSSL(); | ||
143 | |||
144 | m_pop3=mailstorage_new(NULL); | ||
145 | |||
146 | int conntypeset = account->ConnectionType(); | ||
147 | int conntype = 0; | ||
148 | if ( conntypeset == 3 ) { | ||
149 | conntype = CONNECTION_TYPE_COMMAND; | ||
150 | } else if ( conntypeset == 2 ) { | ||
151 | conntype = CONNECTION_TYPE_TLS; | ||
152 | } else if ( conntypeset == 1 ) { | ||
153 | conntype = CONNECTION_TYPE_STARTTLS; | ||
154 | } else if ( conntypeset == 0 ) { | ||
155 | conntype = CONNECTION_TYPE_TRY_STARTTLS; | ||
156 | } | ||
157 | |||
158 | //(ssl?CONNECTION_TYPE_TLS:CONNECTION_TYPE_PLAIN); | ||
159 | |||
160 | pop3_mailstorage_init(m_pop3,(char*)server, port, NULL, conntype, POP3_AUTH_TYPE_PLAIN, | ||
161 | (char*)user,(char*)pass,0,0,0); | ||
162 | |||
163 | |||
164 | err = mailstorage_connect(m_pop3); | ||
165 | if (err != MAIL_NO_ERROR) { | ||
166 | ; // odebug << QString( "FEHLERNUMMER %1" ).arg( err ) << oendl; | ||
167 | Global::statusMessage(tr("Error initializing folder")); | ||
168 | mailstorage_free(m_pop3); | ||
169 | m_pop3 = 0; | ||
170 | } else { | ||
171 | mailsession * session = m_pop3->sto_session; | ||
172 | mailpop3 * mail = ( ( pop3_session_state_data * )session->sess_data )->pop3_session; | ||
173 | if (mail) { | ||
174 | mail->pop3_progr_fun = &pop3_progress; | ||
175 | } | ||
176 | } | ||
177 | } | ||
178 | |||
179 | void POP3wrapper::logout() | ||
180 | { | ||
181 | if ( m_pop3 == NULL ) | ||
182 | return; | ||
183 | mailstorage_free(m_pop3); | ||
184 | m_pop3 = 0; | ||
185 | } | ||
186 | |||
187 | |||
188 | QValueList<Opie::Core::OSmartPointer<Folder> >* POP3wrapper::listFolders() { | ||
189 | QValueList<Opie::Core::OSmartPointer<Folder> >* folders = new QValueList<FolderP>(); | ||
190 | FolderP inb=new Folder("INBOX","/"); | ||
191 | folders->append(inb); | ||
192 | return folders; | ||
193 | } | ||
194 | |||
195 | void POP3wrapper::deleteMail(const RecMailP&mail) { | ||
196 | login(); | ||
197 | if (!m_pop3) | ||
198 | return; | ||
199 | int err = mailsession_remove_message(m_pop3->sto_session,mail->getNumber()); | ||
200 | if (err != MAIL_NO_ERROR) { | ||
201 | Global::statusMessage(tr("error deleting mail")); | ||
202 | } | ||
203 | } | ||
204 | |||
205 | void POP3wrapper::answeredMail(const RecMailP&) {} | ||
206 | |||
207 | int POP3wrapper::deleteAllMail(const FolderP&) { | ||
208 | login(); | ||
209 | if (!m_pop3) | ||
210 | return 0; | ||
211 | int res = 1; | ||
212 | |||
213 | uint32_t result = 0; | ||
214 | int err = mailsession_messages_number(m_pop3->sto_session,NULL,&result); | ||
215 | if (err != MAIL_NO_ERROR) { | ||
216 | Global::statusMessage(tr("Error getting folder info")); | ||
217 | return 0; | ||
218 | } | ||
219 | for (unsigned int i = 0; i < result; ++i) { | ||
220 | err = mailsession_remove_message(m_pop3->sto_session,i+1); | ||
221 | if (err != MAIL_NO_ERROR) { | ||
222 | Global::statusMessage(tr("Error deleting mail %1").arg(i+1)); | ||
223 | res=0; | ||
224 | } | ||
225 | break; | ||
226 | } | ||
227 | return res; | ||
228 | } | ||
229 | |||
230 | void POP3wrapper::statusFolder(folderStat&target_stat,const QString&) { | ||
231 | login(); | ||
232 | target_stat.message_count = 0; | ||
233 | target_stat.message_unseen = 0; | ||
234 | target_stat.message_recent = 0; | ||
235 | if (!m_pop3) | ||
236 | return; | ||
237 | int r = mailsession_status_folder(m_pop3->sto_session,0,&target_stat.message_count, | ||
238 | &target_stat.message_recent,&target_stat.message_unseen); | ||
239 | if (r != MAIL_NO_ERROR) { | ||
240 | ; // odebug << "error getting folter status." << oendl; | ||
241 | } | ||
242 | } | ||
243 | |||
244 | encodedString* POP3wrapper::fetchRawBody(const RecMailP&mail) { | ||
245 | char*target=0; | ||
246 | size_t length=0; | ||
247 | encodedString*res = 0; | ||
248 | mailmessage * mailmsg = 0; | ||
249 | int err = mailsession_get_message(m_pop3->sto_session, mail->getNumber(), &mailmsg); | ||
250 | err = mailmessage_fetch(mailmsg,&target,&length); | ||
251 | if (mailmsg) | ||
252 | mailmessage_free(mailmsg); | ||
253 | if (target) { | ||
254 | res = new encodedString(target,length); | ||
255 | } | ||
256 | return res; | ||
257 | } | ||
258 | |||
259 | MAILLIB::ATYPE POP3wrapper::getType()const { | ||
260 | return account->getType(); | ||
261 | } | ||
262 | |||
263 | const QString&POP3wrapper::getName()const{ | ||
264 | return account->getAccountName(); | ||
265 | } | ||