summaryrefslogtreecommitdiffabout
path: root/kmicromail/libmailwrapper/mboxwrapper.cpp
Unidiff
Diffstat (limited to 'kmicromail/libmailwrapper/mboxwrapper.cpp') (more/less context) (show whitespace changes)
-rw-r--r--kmicromail/libmailwrapper/mboxwrapper.cpp338
1 files changed, 338 insertions, 0 deletions
diff --git a/kmicromail/libmailwrapper/mboxwrapper.cpp b/kmicromail/libmailwrapper/mboxwrapper.cpp
new file mode 100644
index 0000000..39dd156
--- a/dev/null
+++ b/kmicromail/libmailwrapper/mboxwrapper.cpp
@@ -0,0 +1,338 @@
1#include "mboxwrapper.h"
2#include "mailtypes.h"
3#include "mailwrapper.h"
4#include <libetpan/libetpan.h>
5#include <qdir.h>
6#include <stdlib.h>
7
8
9#include <qpe/global.h>
10
11using namespace Opie::Core;
12MBOXwrapper::MBOXwrapper(const QString & mbox_dir,const QString&mbox_name)
13 : Genericwrapper(),MBOXPath(mbox_dir),MBOXName(mbox_name)
14{
15 QDir dir(MBOXPath);
16 if (!dir.exists()) {
17 dir.mkdir(MBOXPath);
18 }
19}
20
21MBOXwrapper::~MBOXwrapper()
22{
23}
24
25void MBOXwrapper::listMessages(const QString & mailbox, QValueList<RecMailP> &target )
26{
27 mailstorage*storage = mailstorage_new(NULL);
28 QString p = MBOXPath+"/";
29 p+=mailbox;
30
31 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
32 mailfolder*folder;
33 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
34 r = mailfolder_connect(folder);
35 if (r != MAIL_NO_ERROR) {
36 //odebug << "Error initializing mbox" << oendl;
37 mailfolder_free(folder);
38 mailstorage_free(storage);
39 return;
40 }
41
42 parseList(target,folder->fld_session,mailbox);
43
44 mailfolder_disconnect(folder);
45 mailfolder_free(folder);
46 mailstorage_free(storage);
47 Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(target.count()));
48}
49
50QValueList<Opie::Core::OSmartPointer<Folder> >* MBOXwrapper::listFolders()
51{
52 QValueList<Opie::Core::OSmartPointer<Folder> >* folders = new QValueList<Opie::Core::OSmartPointer<Folder> >();
53 QDir dir(MBOXPath);
54 if (!dir.exists()) return folders;
55 dir.setFilter(QDir::Files|QDir::Writable|QDir::Readable);
56 QStringList entries = dir.entryList();
57 QStringList::ConstIterator it = entries.begin();
58 for (;it!=entries.end();++it) {
59 FolderP inb=new Folder(*it,"/");
60 folders->append(inb);
61 }
62 return folders;
63}
64
65void MBOXwrapper::deleteMail(const RecMailP & mail)
66{
67 mailstorage*storage = mailstorage_new(NULL);
68 QString p = MBOXPath+"/";
69 p+=mail->getMbox();
70 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
71 mailfolder*folder;
72 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
73 r = mailfolder_connect(folder);
74 if (r != MAIL_NO_ERROR) {
75 ; // << "Error initializing mbox" << oendl;
76 mailfolder_free(folder);
77 mailstorage_free(storage);
78 return;
79 }
80 r = mailsession_remove_message(folder->fld_session,mail->getNumber());
81 if (r != MAIL_NO_ERROR) {
82 ; // << "error deleting mail" << oendl;
83 }
84 mailfolder_free(folder);
85 mailstorage_free(storage);
86}
87
88void MBOXwrapper::answeredMail(const RecMailP&)
89{
90}
91
92RecBodyP MBOXwrapper::fetchBody( const RecMailP &mail )
93{
94 RecBodyP body = new RecBody();
95 mailstorage*storage = mailstorage_new(NULL);
96 QString p = MBOXPath+"/";
97 p+=mail->getMbox();
98 mailmessage * msg;
99 char*data=0;
100 size_t size;
101
102 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
103 mailfolder*folder;
104 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
105 r = mailfolder_connect(folder);
106 if (r != MAIL_NO_ERROR) {
107 ; // << "Error initializing mbox" << oendl;
108 mailfolder_free(folder);
109 mailstorage_free(storage);
110 return body;
111 }
112 r = mailsession_get_message(folder->fld_session, mail->getNumber(), &msg);
113 if (r != MAIL_NO_ERROR) {
114 ; // << "Error fetching mail " << mail->getNumber() << "" << oendl;
115 mailfolder_free(folder);
116 mailstorage_free(storage);
117 return body;
118 }
119 r = mailmessage_fetch(msg,&data,&size);
120 if (r != MAIL_NO_ERROR) {
121 ; // << "Error fetching mail " << mail->getNumber() << "" << oendl;
122 mailfolder_free(folder);
123 mailstorage_free(storage);
124 mailmessage_free(msg);
125 return body;
126 }
127 body = parseMail(msg);
128 mailmessage_fetch_result_free(msg,data);
129 mailfolder_free(folder);
130 mailstorage_free(storage);
131
132 return body;
133}
134
135void MBOXwrapper::mbox_progress( size_t current, size_t maximum )
136{
137 ; // << "MBOX " << current << " von " << maximum << "" << oendl;
138}
139
140int MBOXwrapper::createMbox(const QString&folder,const FolderP&,const QString&,bool )
141{
142 QString p = MBOXPath+"/";
143 p+=folder;
144 QFileInfo fi(p);
145 if (fi.exists()) {
146 Global::statusMessage(tr("Mailbox exists."));
147 return 0;
148 }
149 mailmbox_folder*f = 0;
150 if (mailmbox_init(p.latin1(),0,1,0,&f) != MAIL_NO_ERROR) {
151 Global::statusMessage(tr("Error init folder"));
152 return 0;
153 }
154 if (f) mailmbox_done(f);
155 return 1;
156}
157
158void MBOXwrapper::storeMessage(const char*msg,size_t length, const QString&folder)
159{
160 QString p = MBOXPath+"/";
161 p+=folder;
162 mailmbox_folder*f = 0;
163 int r = mailmbox_init(p.latin1(),0,1,0,&f);
164 if (r != MAIL_NO_ERROR) {
165 Global::statusMessage(tr("Error init folder"));
166 return;
167 }
168 r = mailmbox_append_message(f,msg,length);
169 if (r != MAIL_NO_ERROR) {
170 Global::statusMessage(tr("Error writing to message folder"));
171 }
172 mailmbox_done(f);
173}
174
175encodedString* MBOXwrapper::fetchRawBody(const RecMailP&mail)
176{
177 RecBody body;
178 mailstorage*storage = mailstorage_new(NULL);
179 QString p = MBOXPath+"/";
180 p+=mail->getMbox();
181 mailmessage * msg;
182 char*data=0;
183 size_t size;
184
185 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
186 mailfolder*folder;
187 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
188 r = mailfolder_connect(folder);
189 if (r != MAIL_NO_ERROR) {
190 Global::statusMessage(tr("Error initializing mbox"));
191 mailfolder_free(folder);
192 mailstorage_free(storage);
193 return 0;
194 }
195 r = mailsession_get_message(folder->fld_session, mail->getNumber(), &msg);
196 if (r != MAIL_NO_ERROR) {
197 Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
198 mailfolder_free(folder);
199 mailstorage_free(storage);
200 return 0;
201 }
202 r = mailmessage_fetch(msg,&data,&size);
203 if (r != MAIL_NO_ERROR) {
204 Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
205 mailfolder_free(folder);
206 mailstorage_free(storage);
207 mailmessage_free(msg);
208 return 0;
209 }
210 encodedString*result = new encodedString(data,size);
211
212 mailfolder_free(folder);
213 mailstorage_free(storage);
214 mailmessage_free(msg);
215 return result;
216}
217
218void MBOXwrapper::deleteMails(const QString & mailbox,const QValueList<RecMailP> &target)
219{
220 QString p = MBOXPath+"/";
221 p+=mailbox;
222 mailmbox_folder*f = 0;
223 int r = mailmbox_init(p.latin1(),0,1,0,&f);
224 if (r != MAIL_NO_ERROR) {
225 ; // << "Error init folder" << oendl;
226 return;
227 }
228 deleteMails(f,target);
229 mailmbox_done(f);
230}
231
232void MBOXwrapper::deleteMails(mailmbox_folder*f,const QValueList<RecMailP> &target)
233{
234 if (!f) return;
235 int r;
236 QValueList<RecMailP>::ConstIterator it;
237 for (it=target.begin(); it != target.end();++it) {
238 r = mailmbox_delete_msg(f,(*it)->getNumber());
239 if (r!=MAILMBOX_NO_ERROR) {
240 ; // << "error delete mail" << oendl;
241 }
242 }
243 r = mailmbox_expunge(f);
244 if (r != MAILMBOX_NO_ERROR) {
245 ; // << "error expunge mailbox" << oendl;
246 }
247}
248
249int MBOXwrapper::deleteAllMail(const FolderP&tfolder)
250{
251 if (!tfolder) return 0;
252 QString p = MBOXPath+"/"+tfolder->getDisplayName();
253 int res = 1;
254
255 mailfolder*folder = 0;
256 mailmessage_list*l=0;
257 mailstorage*storage = mailstorage_new(NULL);
258 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
259 if (r != MAIL_NO_ERROR) {
260 Global::statusMessage(tr("Error initializing mbox"));
261 res = 0;
262 }
263 if (res) {
264 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
265 r = mailfolder_connect(folder);
266 if (r != MAIL_NO_ERROR) {
267 Global::statusMessage(tr("Error initializing mbox"));
268 res = 0;
269 }
270 }
271 if (res) {
272 r = mailsession_get_messages_list(folder->fld_session,&l);
273 if (r != MAIL_NO_ERROR) {
274 ; // << "Error message list" << oendl;
275 res=0;
276 }
277 }
278 for(unsigned int i = 0 ; l!= 0 && res==1 && i < carray_count(l->msg_tab) ; ++i) {
279 r = mailsession_remove_message(folder->fld_session,i+1);
280 if (r != MAIL_NO_ERROR) {
281 Global::statusMessage(tr("Error deleting mail %1").arg(i+1));
282 res = 0;
283 break;
284 }
285 }
286 if (l) mailmessage_list_free(l);
287 if (folder) mailfolder_free(folder);
288 if (storage) mailstorage_free(storage);
289 return res;
290}
291
292int MBOXwrapper::deleteMbox(const FolderP&tfolder)
293{
294 if (!tfolder) return 0;
295 QString p = MBOXPath+"/"+tfolder->getDisplayName();
296 QFile fi(p);
297 if (!fi.exists()) {
298 Global::statusMessage(tr("Mailbox doesn't exist."));
299 return 0;
300 }
301 if (!fi.remove()) {
302 Global::statusMessage(tr("Error deleting Mailbox."));
303 return 0;
304 }
305 return 1;
306}
307
308void MBOXwrapper::statusFolder(folderStat&target_stat,const QString & mailbox)
309{
310 mailfolder*folder = 0;
311 mailstorage*storage = mailstorage_new(NULL);
312 target_stat.message_count = 0;
313 target_stat.message_unseen = 0;
314 target_stat.message_recent = 0;
315 QString p = MBOXPath+"/"+mailbox;
316 QFile fi(p);
317 if (!fi.exists()) {
318 Global::statusMessage(tr("Mailbox doesn't exist."));
319 return;
320 }
321 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
322 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
323 r = mailfolder_connect(folder);
324 r = mailsession_status_folder(folder->fld_session,(char*)mailbox.latin1(),&target_stat.message_count,
325 &target_stat.message_recent,&target_stat.message_unseen);
326 if (folder) mailfolder_free(folder);
327 if (storage) mailstorage_free(storage);
328}
329
330MAILLIB::ATYPE MBOXwrapper::getType()const
331{
332 return MAILLIB::A_MBOX;
333}
334
335const QString&MBOXwrapper::getName()const
336{
337 return MBOXName;
338}