summaryrefslogtreecommitdiffabout
path: root/kmicromail/libmailwrapper/mhwrapper.cpp
Unidiff
Diffstat (limited to 'kmicromail/libmailwrapper/mhwrapper.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libmailwrapper/mhwrapper.cpp446
1 files changed, 446 insertions, 0 deletions
diff --git a/kmicromail/libmailwrapper/mhwrapper.cpp b/kmicromail/libmailwrapper/mhwrapper.cpp
new file mode 100644
index 0000000..7ef9b32
--- a/dev/null
+++ b/kmicromail/libmailwrapper/mhwrapper.cpp
@@ -0,0 +1,446 @@
1#include "mhwrapper.h"
2#include "mailtypes.h"
3#include "mailwrapper.h"
4#include <libetpan/libetpan.h>
5#include <qdir.h>
6#include <qmessagebox.h>
7#include <stdlib.h>
8#include <qpe/global.h>
9#include <oprocess.h>
10//#include <opie2/odebug.h>
11
12using namespace Opie::Core;
13MHwrapper::MHwrapper(const QString & mbox_dir,const QString&mbox_name)
14 : Genericwrapper(),MHPath(mbox_dir),MHName(mbox_name)
15{
16 if (MHPath.length()>0) {
17 if (MHPath[MHPath.length()-1]=='/') {
18 MHPath=MHPath.left(MHPath.length()-1);
19 }
20 //odebug << MHPath << oendl;
21 QDir dir(MHPath);
22 if (!dir.exists()) {
23 dir.mkdir(MHPath);
24 }
25 init_storage();
26 }
27}
28
29void MHwrapper::init_storage()
30{
31 int r;
32 QString pre = MHPath;
33 if (!m_storage) {
34 m_storage = mailstorage_new(NULL);
35 r = mh_mailstorage_init(m_storage,(char*)pre.latin1(),0,0,0);
36 if (r != MAIL_NO_ERROR) {
37 qDebug(" error init storage ");
38 mailstorage_free(m_storage);
39 m_storage = 0;
40 return;
41 }
42 }
43 r = mailstorage_connect(m_storage);
44 if (r!=MAIL_NO_ERROR) {
45 qDebug("error connecting storage ");
46 mailstorage_free(m_storage);
47 m_storage = 0;
48 }
49}
50
51void MHwrapper::clean_storage()
52{
53 if (m_storage) {
54 mailstorage_disconnect(m_storage);
55 mailstorage_free(m_storage);
56 m_storage = 0;
57 }
58}
59
60MHwrapper::~MHwrapper()
61{
62 clean_storage();
63}
64
65void MHwrapper::listMessages(const QString & mailbox, QValueList<Opie::Core::OSmartPointer<RecMail> > &target )
66{
67 init_storage();
68 if (!m_storage) {
69 return;
70 }
71 QString f = buildPath(mailbox);
72 int r = mailsession_select_folder(m_storage->sto_session,(char*)f.latin1());
73 if (r!=MAIL_NO_ERROR) {
74 qDebug("listMessages: error selecting folder! ");
75 return;
76 }
77 parseList(target,m_storage->sto_session,f);
78 Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(target.count()));
79}
80
81QValueList<Opie::Core::OSmartPointer<Folder> >* MHwrapper::listFolders()
82{
83 QValueList<Opie::Core::OSmartPointer<Folder> >* folders = new QValueList<Opie::Core::OSmartPointer<Folder> >();
84 /* this is needed! */
85 if (m_storage) mailstorage_disconnect(m_storage);
86 init_storage();
87 if (!m_storage) {
88 return folders;
89 }
90 mail_list*flist = 0;
91 clistcell*current=0;
92 int r = mailsession_list_folders(m_storage->sto_session,NULL,&flist);
93 if (r != MAIL_NO_ERROR || !flist) {
94 qDebug("error getting folder list ");
95 return folders;
96 }
97 for (current=clist_begin(flist->mb_list);current!=0;current=clist_next(current)) {
98 QString t = (char*)current->data;
99 t.replace(0,MHPath.length(),"");
100 folders->append(new MHFolder(t,MHPath));
101 }
102 mail_list_free(flist);
103 return folders;
104}
105
106void MHwrapper::deleteMail(const RecMailP&mail)
107{
108 init_storage();
109 if (!m_storage) {
110 return;
111 }
112 int r = mailsession_select_folder(m_storage->sto_session,(char*)mail->getMbox().latin1());
113 if (r!=MAIL_NO_ERROR) {
114 qDebug("error selecting folder! ");
115 return;
116 }
117 r = mailsession_remove_message(m_storage->sto_session,mail->getNumber());
118 if (r != MAIL_NO_ERROR) {
119 qDebug("error deleting mail ");
120 }
121}
122
123void MHwrapper::answeredMail(const RecMailP&)
124{
125}
126
127RecBodyP MHwrapper::fetchBody( const RecMailP &mail )
128{
129 RecBodyP body = new RecBody();
130 init_storage();
131 if (!m_storage) {
132 return body;
133 }
134 mailmessage * msg;
135 char*data=0;
136
137 /* mail should hold the complete path! */
138 int r = mailsession_select_folder(m_storage->sto_session,(char*)mail->getMbox().latin1());
139 if (r != MAIL_NO_ERROR) {
140 return body;
141 }
142 r = mailsession_get_message(m_storage->sto_session, mail->getNumber(), &msg);
143 if (r != MAIL_NO_ERROR) {
144 qDebug("Error fetching mail ");
145
146 return body;
147 }
148 body = parseMail(msg);
149 mailmessage_fetch_result_free(msg,data);
150 return body;
151}
152
153void MHwrapper::mbox_progress( size_t current, size_t maximum )
154{
155 qDebug("MBox Progress %d of %d",current,maximum );
156 //odebug << "MH " << current << " von " << maximum << "" << oendl;
157}
158
159QString MHwrapper::buildPath(const QString&p)
160{
161 QString f="";
162 if (p.length()==0||p=="/")
163 return MHPath;
164 if (!p.startsWith(MHPath)) {
165 f+=MHPath;
166 }
167 if (!p.startsWith("/")) {
168 f+="/";
169 }
170 f+=p;
171 return f;
172}
173
174int MHwrapper::createMbox(const QString&folder,const FolderP&pfolder,const QString&,bool )
175{
176 init_storage();
177 if (!m_storage) {
178 return 0;
179 }
180 QString f;
181 if (!pfolder) {
182 // toplevel folder
183 f = buildPath(folder);
184 } else {
185 f = pfolder->getName();
186 f+="/";
187 f+=folder;
188 }
189
190 int r = mailsession_create_folder(m_storage->sto_session,(char*)f.latin1());
191 if (r != MAIL_NO_ERROR) {
192 qDebug("error creating folder ");
193 return 0;
194 }
195 qDebug("Folder created ");
196 return 1;
197}
198
199void MHwrapper::storeMessage(const char*msg,size_t length, const QString&Folder)
200{
201 init_storage();
202 if (!m_storage) {
203 return;
204 }
205 QString f = buildPath(Folder);
206 int r = mailsession_select_folder(m_storage->sto_session,(char*)f.latin1());
207 if (r!=MAIL_NO_ERROR) {
208 qDebug("error selecting folder! ");
209 return;
210 }
211 r = mailsession_append_message(m_storage->sto_session,(char*)msg,length);
212 if (r!=MAIL_NO_ERROR) {
213 qDebug("error storing mail ");
214 }
215 return;
216}
217
218encodedString* MHwrapper::fetchRawBody(const RecMailP&mail)
219{
220 encodedString*result = 0;
221 init_storage();
222 if (!m_storage) {
223 return result;
224 }
225 mailmessage * msg = 0;
226 char*data=0;
227 size_t size;
228 int r = mailsession_select_folder(m_storage->sto_session,(char*)mail->getMbox().latin1());
229 if (r!=MAIL_NO_ERROR) {
230 qDebug("error selecting folder! ");
231 return result;
232 }
233 r = mailsession_get_message(m_storage->sto_session, mail->getNumber(), &msg);
234 if (r != MAIL_NO_ERROR) {
235 Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
236 return 0;
237 }
238 r = mailmessage_fetch(msg,&data,&size);
239 if (r != MAIL_NO_ERROR) {
240 Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
241 if (msg) mailmessage_free(msg);
242 return 0;
243 }
244 result = new encodedString(data,size);
245 if (msg) mailmessage_free(msg);
246 return result;
247}
248
249void MHwrapper::deleteMails(const QString & mailbox,const QValueList<RecMailP> &target)
250{
251 QString f = buildPath(mailbox);
252 int r = mailsession_select_folder(m_storage->sto_session,(char*)f.latin1());
253 if (r!=MAIL_NO_ERROR) {
254 qDebug("deleteMails: error selecting folder! ");
255 return;
256 }
257 QValueList<RecMailP>::ConstIterator it;
258 for (it=target.begin(); it!=target.end();++it) {
259 r = mailsession_remove_message(m_storage->sto_session,(*it)->getNumber());
260 if (r != MAIL_NO_ERROR) {
261 qDebug("error deleting mail ");
262 break;
263 }
264 }
265}
266
267int MHwrapper::deleteAllMail(const FolderP&tfolder)
268{
269 init_storage();
270 if (!m_storage) {
271 return 0;
272 }
273 int res = 1;
274 if (!tfolder) return 0;
275 int r = mailsession_select_folder(m_storage->sto_session,(char*)tfolder->getName().latin1());
276 if (r!=MAIL_NO_ERROR) {
277 qDebug("error selecting folder! ");
278 return 0;
279 }
280 mailmessage_list*l=0;
281 r = mailsession_get_messages_list(m_storage->sto_session,&l);
282 if (r != MAIL_NO_ERROR) {
283 qDebug("Error message list ");
284 res = 0;
285 }
286 unsigned j = 0;
287 for(unsigned int i = 0 ; l!= 0 && res==1 && i < carray_count(l->msg_tab) ; ++i) {
288 mailmessage * msg;
289 msg = (mailmessage*)carray_get(l->msg_tab, i);
290 j = msg->msg_index;
291 r = mailsession_remove_message(m_storage->sto_session,j);
292 if (r != MAIL_NO_ERROR) {
293 Global::statusMessage(tr("Error deleting mail %1").arg(i+1));
294 res = 0;
295 break;
296 }
297 }
298 if (l) mailmessage_list_free(l);
299 return res;
300}
301
302int MHwrapper::deleteMbox(const FolderP&tfolder)
303{
304 init_storage();
305 if (!m_storage) {
306 return 0;
307 }
308 if (!tfolder) return 0;
309 if (tfolder->getName()=="/" || tfolder->getName().isEmpty()) return 0;
310
311 int r = mailsession_delete_folder(m_storage->sto_session,(char*)tfolder->getName().latin1());
312
313 if (r != MAIL_NO_ERROR) {
314 qDebug("error deleting mail box ");
315 return 0;
316 }
317 QString cmd = "rm -rf "+tfolder->getName();
318 QStringList command;
319 command << "/bin/sh";
320 command << "-c";
321 command << cmd.latin1();
322 OProcess *process = new OProcess();
323
324 connect(process, SIGNAL(processExited(Opie::Core::OProcess*)),
325 this, SLOT( processEnded(Opie::Core::OProcess*)));
326 connect(process, SIGNAL( receivedStderr(Opie::Core::OProcess*,char*,int)),
327 this, SLOT( oprocessStderr(Opie::Core::OProcess*,char*,int)));
328
329 *process << command;
330 removeMboxfailed = false;
331 if(!process->start(OProcess::Block, OProcess::All) ) {
332 qDebug("could not start process ");
333 return 0;
334 }
335 qDebug("mail box deleted ");
336 return 1;
337}
338
339void MHwrapper::processEnded(OProcess *p)
340{
341 if (p) delete p;
342}
343
344void MHwrapper::oprocessStderr(OProcess*, char *buffer, int )
345{
346 QString lineStr = buffer;
347 QMessageBox::warning( 0, tr("Error"), lineStr ,tr("Ok") );
348 removeMboxfailed = true;
349}
350
351void MHwrapper::statusFolder(folderStat&target_stat,const QString & mailbox)
352{
353 init_storage();
354 if (!m_storage) {
355 return;
356 }
357 target_stat.message_count = 0;
358 target_stat.message_unseen = 0;
359 target_stat.message_recent = 0;
360 QString f = buildPath(mailbox);
361 int r = mailsession_status_folder(m_storage->sto_session,(char*)f.latin1(),&target_stat.message_count,
362 &target_stat.message_recent,&target_stat.message_unseen);
363 if (r != MAIL_NO_ERROR) {
364 Global::statusMessage(tr("Error retrieving status"));
365 }
366}
367
368MAILLIB::ATYPE MHwrapper::getType()const
369{
370 return MAILLIB::A_MH;
371}
372
373const QString&MHwrapper::getName()const
374{
375 return MHName;
376}
377void MHwrapper::mvcpMail(const RecMailP&mail,const QString&targetFolder,AbstractMail*targetWrapper,bool moveit)
378{
379 init_storage();
380 if (!m_storage) {
381 return;
382 }
383 if (targetWrapper != this) {
384 qDebug("Using generic ");
385 Genericwrapper::mvcpMail(mail,targetFolder,targetWrapper,moveit);
386 return;
387 }
388 qDebug("Using internal routines for move/copy ");
389 QString tf = buildPath(targetFolder);
390 int r = mailsession_select_folder(m_storage->sto_session,(char*)mail->getMbox().latin1());
391 if (r != MAIL_NO_ERROR) {
392 qDebug("Error selecting source mailbox ");
393 return;
394 }
395 if (moveit) {
396 r = mailsession_move_message(m_storage->sto_session,mail->getNumber(),(char*)tf.latin1());
397 } else {
398 r = mailsession_copy_message(m_storage->sto_session,mail->getNumber(),(char*)tf.latin1());
399 }
400 if (r != MAIL_NO_ERROR) {
401 qDebug("Error copy/moving mail internal ");
402 }
403}
404
405void MHwrapper::mvcpAllMails(const FolderP&fromFolder,
406 const QString&targetFolder,AbstractMail*targetWrapper,bool moveit)
407{
408 init_storage();
409 if (!m_storage) {
410 return;
411 }
412 if (targetWrapper != this) {
413 qDebug("Using generic ");
414 Genericwrapper::mvcpAllMails(fromFolder,targetFolder,targetWrapper,moveit);
415 return;
416 }
417 if (!fromFolder) return;
418 int r = mailsession_select_folder(m_storage->sto_session,(char*)fromFolder->getName().latin1());
419 if (r!=MAIL_NO_ERROR) {
420 qDebug("error selecting source folder! ");
421 return;
422 }
423 QString tf = buildPath(targetFolder);
424 mailmessage_list*l=0;
425 r = mailsession_get_messages_list(m_storage->sto_session,&l);
426 if (r != MAIL_NO_ERROR) {
427 qDebug("Error message list ");
428 }
429 unsigned j = 0;
430 for(unsigned int i = 0 ; l!= 0 && i < carray_count(l->msg_tab) ; ++i) {
431 mailmessage * msg;
432 msg = (mailmessage*)carray_get(l->msg_tab, i);
433 j = msg->msg_index;
434 if (moveit) {
435 r = mailsession_move_message(m_storage->sto_session,j,(char*)tf.latin1());
436 } else {
437 r = mailsession_copy_message(m_storage->sto_session,j,(char*)tf.latin1());
438 }
439 if (r != MAIL_NO_ERROR) {
440 qDebug("Error copy/moving mail interna ");
441
442 break;
443 }
444 }
445 if (l) mailmessage_list_free(l);
446}