summaryrefslogtreecommitdiffabout
path: root/kmicromail/libmailwrapper/mboxwrapper.cpp
Side-by-side diff
Diffstat (limited to 'kmicromail/libmailwrapper/mboxwrapper.cpp') (more/less context) (ignore 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 @@
+#include "mboxwrapper.h"
+#include "mailtypes.h"
+#include "mailwrapper.h"
+#include <libetpan/libetpan.h>
+#include <qdir.h>
+#include <stdlib.h>
+
+
+#include <qpe/global.h>
+
+using namespace Opie::Core;
+MBOXwrapper::MBOXwrapper(const QString & mbox_dir,const QString&mbox_name)
+ : Genericwrapper(),MBOXPath(mbox_dir),MBOXName(mbox_name)
+{
+ QDir dir(MBOXPath);
+ if (!dir.exists()) {
+ dir.mkdir(MBOXPath);
+ }
+}
+
+MBOXwrapper::~MBOXwrapper()
+{
+}
+
+void MBOXwrapper::listMessages(const QString & mailbox, QValueList<RecMailP> &target )
+{
+ mailstorage*storage = mailstorage_new(NULL);
+ QString p = MBOXPath+"/";
+ p+=mailbox;
+
+ int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
+ mailfolder*folder;
+ folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
+ r = mailfolder_connect(folder);
+ if (r != MAIL_NO_ERROR) {
+ //odebug << "Error initializing mbox" << oendl;
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ return;
+ }
+
+ parseList(target,folder->fld_session,mailbox);
+
+ mailfolder_disconnect(folder);
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(target.count()));
+}
+
+QValueList<Opie::Core::OSmartPointer<Folder> >* MBOXwrapper::listFolders()
+{
+ QValueList<Opie::Core::OSmartPointer<Folder> >* folders = new QValueList<Opie::Core::OSmartPointer<Folder> >();
+ QDir dir(MBOXPath);
+ if (!dir.exists()) return folders;
+ dir.setFilter(QDir::Files|QDir::Writable|QDir::Readable);
+ QStringList entries = dir.entryList();
+ QStringList::ConstIterator it = entries.begin();
+ for (;it!=entries.end();++it) {
+ FolderP inb=new Folder(*it,"/");
+ folders->append(inb);
+ }
+ return folders;
+}
+
+void MBOXwrapper::deleteMail(const RecMailP & mail)
+{
+ mailstorage*storage = mailstorage_new(NULL);
+ QString p = MBOXPath+"/";
+ p+=mail->getMbox();
+ int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
+ mailfolder*folder;
+ folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
+ r = mailfolder_connect(folder);
+ if (r != MAIL_NO_ERROR) {
+ ; // << "Error initializing mbox" << oendl;
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ return;
+ }
+ r = mailsession_remove_message(folder->fld_session,mail->getNumber());
+ if (r != MAIL_NO_ERROR) {
+ ; // << "error deleting mail" << oendl;
+ }
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+}
+
+void MBOXwrapper::answeredMail(const RecMailP&)
+{
+}
+
+RecBodyP MBOXwrapper::fetchBody( const RecMailP &mail )
+{
+ RecBodyP body = new RecBody();
+ mailstorage*storage = mailstorage_new(NULL);
+ QString p = MBOXPath+"/";
+ p+=mail->getMbox();
+ mailmessage * msg;
+ char*data=0;
+ size_t size;
+
+ int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
+ mailfolder*folder;
+ folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
+ r = mailfolder_connect(folder);
+ if (r != MAIL_NO_ERROR) {
+ ; // << "Error initializing mbox" << oendl;
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ return body;
+ }
+ r = mailsession_get_message(folder->fld_session, mail->getNumber(), &msg);
+ if (r != MAIL_NO_ERROR) {
+ ; // << "Error fetching mail " << mail->getNumber() << "" << oendl;
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ return body;
+ }
+ r = mailmessage_fetch(msg,&data,&size);
+ if (r != MAIL_NO_ERROR) {
+ ; // << "Error fetching mail " << mail->getNumber() << "" << oendl;
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ mailmessage_free(msg);
+ return body;
+ }
+ body = parseMail(msg);
+ mailmessage_fetch_result_free(msg,data);
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+
+ return body;
+}
+
+void MBOXwrapper::mbox_progress( size_t current, size_t maximum )
+{
+ ; // << "MBOX " << current << " von " << maximum << "" << oendl;
+}
+
+int MBOXwrapper::createMbox(const QString&folder,const FolderP&,const QString&,bool )
+{
+ QString p = MBOXPath+"/";
+ p+=folder;
+ QFileInfo fi(p);
+ if (fi.exists()) {
+ Global::statusMessage(tr("Mailbox exists."));
+ return 0;
+ }
+ mailmbox_folder*f = 0;
+ if (mailmbox_init(p.latin1(),0,1,0,&f) != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error init folder"));
+ return 0;
+ }
+ if (f) mailmbox_done(f);
+ return 1;
+}
+
+void MBOXwrapper::storeMessage(const char*msg,size_t length, const QString&folder)
+{
+ QString p = MBOXPath+"/";
+ p+=folder;
+ mailmbox_folder*f = 0;
+ int r = mailmbox_init(p.latin1(),0,1,0,&f);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error init folder"));
+ return;
+ }
+ r = mailmbox_append_message(f,msg,length);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error writing to message folder"));
+ }
+ mailmbox_done(f);
+}
+
+encodedString* MBOXwrapper::fetchRawBody(const RecMailP&mail)
+{
+ RecBody body;
+ mailstorage*storage = mailstorage_new(NULL);
+ QString p = MBOXPath+"/";
+ p+=mail->getMbox();
+ mailmessage * msg;
+ char*data=0;
+ size_t size;
+
+ int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
+ mailfolder*folder;
+ folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
+ r = mailfolder_connect(folder);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error initializing mbox"));
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ return 0;
+ }
+ r = mailsession_get_message(folder->fld_session, mail->getNumber(), &msg);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ return 0;
+ }
+ r = mailmessage_fetch(msg,&data,&size);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ mailmessage_free(msg);
+ return 0;
+ }
+ encodedString*result = new encodedString(data,size);
+
+ mailfolder_free(folder);
+ mailstorage_free(storage);
+ mailmessage_free(msg);
+ return result;
+}
+
+void MBOXwrapper::deleteMails(const QString & mailbox,const QValueList<RecMailP> &target)
+{
+ QString p = MBOXPath+"/";
+ p+=mailbox;
+ mailmbox_folder*f = 0;
+ int r = mailmbox_init(p.latin1(),0,1,0,&f);
+ if (r != MAIL_NO_ERROR) {
+ ; // << "Error init folder" << oendl;
+ return;
+ }
+ deleteMails(f,target);
+ mailmbox_done(f);
+}
+
+void MBOXwrapper::deleteMails(mailmbox_folder*f,const QValueList<RecMailP> &target)
+{
+ if (!f) return;
+ int r;
+ QValueList<RecMailP>::ConstIterator it;
+ for (it=target.begin(); it != target.end();++it) {
+ r = mailmbox_delete_msg(f,(*it)->getNumber());
+ if (r!=MAILMBOX_NO_ERROR) {
+ ; // << "error delete mail" << oendl;
+ }
+ }
+ r = mailmbox_expunge(f);
+ if (r != MAILMBOX_NO_ERROR) {
+ ; // << "error expunge mailbox" << oendl;
+ }
+}
+
+int MBOXwrapper::deleteAllMail(const FolderP&tfolder)
+{
+ if (!tfolder) return 0;
+ QString p = MBOXPath+"/"+tfolder->getDisplayName();
+ int res = 1;
+
+ mailfolder*folder = 0;
+ mailmessage_list*l=0;
+ mailstorage*storage = mailstorage_new(NULL);
+ int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error initializing mbox"));
+ res = 0;
+ }
+ if (res) {
+ folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
+ r = mailfolder_connect(folder);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error initializing mbox"));
+ res = 0;
+ }
+ }
+ if (res) {
+ r = mailsession_get_messages_list(folder->fld_session,&l);
+ if (r != MAIL_NO_ERROR) {
+ ; // << "Error message list" << oendl;
+ res=0;
+ }
+ }
+ for(unsigned int i = 0 ; l!= 0 && res==1 && i < carray_count(l->msg_tab) ; ++i) {
+ r = mailsession_remove_message(folder->fld_session,i+1);
+ if (r != MAIL_NO_ERROR) {
+ Global::statusMessage(tr("Error deleting mail %1").arg(i+1));
+ res = 0;
+ break;
+ }
+ }
+ if (l) mailmessage_list_free(l);
+ if (folder) mailfolder_free(folder);
+ if (storage) mailstorage_free(storage);
+ return res;
+}
+
+int MBOXwrapper::deleteMbox(const FolderP&tfolder)
+{
+ if (!tfolder) return 0;
+ QString p = MBOXPath+"/"+tfolder->getDisplayName();
+ QFile fi(p);
+ if (!fi.exists()) {
+ Global::statusMessage(tr("Mailbox doesn't exist."));
+ return 0;
+ }
+ if (!fi.remove()) {
+ Global::statusMessage(tr("Error deleting Mailbox."));
+ return 0;
+ }
+ return 1;
+}
+
+void MBOXwrapper::statusFolder(folderStat&target_stat,const QString & mailbox)
+{
+ mailfolder*folder = 0;
+ mailstorage*storage = mailstorage_new(NULL);
+ target_stat.message_count = 0;
+ target_stat.message_unseen = 0;
+ target_stat.message_recent = 0;
+ QString p = MBOXPath+"/"+mailbox;
+ QFile fi(p);
+ if (!fi.exists()) {
+ Global::statusMessage(tr("Mailbox doesn't exist."));
+ return;
+ }
+ int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
+ folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
+ r = mailfolder_connect(folder);
+ r = mailsession_status_folder(folder->fld_session,(char*)mailbox.latin1(),&target_stat.message_count,
+ &target_stat.message_recent,&target_stat.message_unseen);
+ if (folder) mailfolder_free(folder);
+ if (storage) mailstorage_free(storage);
+}
+
+MAILLIB::ATYPE MBOXwrapper::getType()const
+{
+ return MAILLIB::A_MBOX;
+}
+
+const QString&MBOXwrapper::getName()const
+{
+ return MBOXName;
+}