00001 #include "mboxwrapper.h"
00002 #include "mailtypes.h"
00003 #include "mailwrapper.h"
00004 #include <libetpan/libetpan.h>
00005 #include <qdir.h>
00006 #include <stdlib.h>
00007
00008 #include <opie2/odebug.h>
00009 #include <qpe/global.h>
00010
00011 using namespace Opie::Core;
00012 MBOXwrapper::MBOXwrapper(const QString & mbox_dir,const QString&mbox_name)
00013 : Genericwrapper(),MBOXPath(mbox_dir),MBOXName(mbox_name)
00014 {
00015 QDir dir(MBOXPath);
00016 if (!dir.exists()) {
00017 dir.mkdir(MBOXPath);
00018 }
00019 }
00020
00021 MBOXwrapper::~MBOXwrapper()
00022 {
00023 }
00024
00025 void MBOXwrapper::listMessages(const QString & mailbox, QValueList<RecMailP> &target )
00026 {
00027 mailstorage*storage = mailstorage_new(NULL);
00028 QString p = MBOXPath+"/";
00029 p+=mailbox;
00030
00031 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
00032 mailfolder*folder;
00033 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
00034 r = mailfolder_connect(folder);
00035 if (r != MAIL_NO_ERROR) {
00036 odebug << "Error initializing mbox" << oendl;
00037 mailfolder_free(folder);
00038 mailstorage_free(storage);
00039 return;
00040 }
00041
00042 parseList(target,folder->fld_session,mailbox);
00043
00044 mailfolder_disconnect(folder);
00045 mailfolder_free(folder);
00046 mailstorage_free(storage);
00047 Global::statusMessage(tr("Mailbox has %1 mail(s)").arg(target.count()));
00048 }
00049
00050 QValueList<Opie::Core::OSmartPointer<Folder> >* MBOXwrapper::listFolders()
00051 {
00052 QValueList<Opie::Core::OSmartPointer<Folder> >* folders = new QValueList<Opie::Core::OSmartPointer<Folder> >();
00053 QDir dir(MBOXPath);
00054 if (!dir.exists()) return folders;
00055 dir.setFilter(QDir::Files|QDir::Writable|QDir::Readable);
00056 QStringList entries = dir.entryList();
00057 QStringList::ConstIterator it = entries.begin();
00058 for (;it!=entries.end();++it) {
00059 FolderP inb=new Folder(*it,"/");
00060 folders->append(inb);
00061 }
00062 return folders;
00063 }
00064
00065 void MBOXwrapper::deleteMail(const RecMailP & mail)
00066 {
00067 mailstorage*storage = mailstorage_new(NULL);
00068 QString p = MBOXPath+"/";
00069 p+=mail->getMbox();
00070 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
00071 mailfolder*folder;
00072 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
00073 r = mailfolder_connect(folder);
00074 if (r != MAIL_NO_ERROR) {
00075 odebug << "Error initializing mbox" << oendl;
00076 mailfolder_free(folder);
00077 mailstorage_free(storage);
00078 return;
00079 }
00080 r = mailsession_remove_message(folder->fld_session,mail->getNumber());
00081 if (r != MAIL_NO_ERROR) {
00082 odebug << "error deleting mail" << oendl;
00083 }
00084 mailfolder_free(folder);
00085 mailstorage_free(storage);
00086 }
00087
00088 void MBOXwrapper::answeredMail(const RecMailP&)
00089 {
00090 }
00091
00092 RecBodyP MBOXwrapper::fetchBody( const RecMailP &mail )
00093 {
00094 RecBodyP body = new RecBody();
00095 mailstorage*storage = mailstorage_new(NULL);
00096 QString p = MBOXPath+"/";
00097 p+=mail->getMbox();
00098 mailmessage * msg;
00099 char*data=0;
00100 size_t size;
00101
00102 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
00103 mailfolder*folder;
00104 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
00105 r = mailfolder_connect(folder);
00106 if (r != MAIL_NO_ERROR) {
00107 odebug << "Error initializing mbox" << oendl;
00108 mailfolder_free(folder);
00109 mailstorage_free(storage);
00110 return body;
00111 }
00112 r = mailsession_get_message(folder->fld_session, mail->getNumber(), &msg);
00113 if (r != MAIL_NO_ERROR) {
00114 odebug << "Error fetching mail " << mail->getNumber() << "" << oendl;
00115 mailfolder_free(folder);
00116 mailstorage_free(storage);
00117 return body;
00118 }
00119 r = mailmessage_fetch(msg,&data,&size);
00120 if (r != MAIL_NO_ERROR) {
00121 odebug << "Error fetching mail " << mail->getNumber() << "" << oendl;
00122 mailfolder_free(folder);
00123 mailstorage_free(storage);
00124 mailmessage_free(msg);
00125 return body;
00126 }
00127 body = parseMail(msg);
00128 mailmessage_fetch_result_free(msg,data);
00129 mailfolder_free(folder);
00130 mailstorage_free(storage);
00131
00132 return body;
00133 }
00134
00135 void MBOXwrapper::mbox_progress( size_t current, size_t maximum )
00136 {
00137 odebug << "MBOX " << current << " von " << maximum << "" << oendl;
00138 }
00139
00140 int MBOXwrapper::createMbox(const QString&folder,const FolderP&,const QString&,bool )
00141 {
00142 QString p = MBOXPath+"/";
00143 p+=folder;
00144 QFileInfo fi(p);
00145 if (fi.exists()) {
00146 Global::statusMessage(tr("Mailbox exists."));
00147 return 0;
00148 }
00149 mailmbox_folder*f = 0;
00150 if (mailmbox_init(p.latin1(),0,1,0,&f) != MAIL_NO_ERROR) {
00151 Global::statusMessage(tr("Error init folder"));
00152 return 0;
00153 }
00154 if (f) mailmbox_done(f);
00155 return 1;
00156 }
00157
00158 void MBOXwrapper::storeMessage(const char*msg,size_t length, const QString&folder)
00159 {
00160 QString p = MBOXPath+"/";
00161 p+=folder;
00162 mailmbox_folder*f = 0;
00163 int r = mailmbox_init(p.latin1(),0,1,0,&f);
00164 if (r != MAIL_NO_ERROR) {
00165 Global::statusMessage(tr("Error init folder"));
00166 return;
00167 }
00168 r = mailmbox_append_message(f,msg,length);
00169 if (r != MAIL_NO_ERROR) {
00170 Global::statusMessage(tr("Error writing to message folder"));
00171 }
00172 mailmbox_done(f);
00173 }
00174
00175 encodedString* MBOXwrapper::fetchRawBody(const RecMailP&mail)
00176 {
00177 RecBody body;
00178 mailstorage*storage = mailstorage_new(NULL);
00179 QString p = MBOXPath+"/";
00180 p+=mail->getMbox();
00181 mailmessage * msg;
00182 char*data=0;
00183 size_t size;
00184
00185 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
00186 mailfolder*folder;
00187 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
00188 r = mailfolder_connect(folder);
00189 if (r != MAIL_NO_ERROR) {
00190 Global::statusMessage(tr("Error initializing mbox"));
00191 mailfolder_free(folder);
00192 mailstorage_free(storage);
00193 return 0;
00194 }
00195 r = mailsession_get_message(folder->fld_session, mail->getNumber(), &msg);
00196 if (r != MAIL_NO_ERROR) {
00197 Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
00198 mailfolder_free(folder);
00199 mailstorage_free(storage);
00200 return 0;
00201 }
00202 r = mailmessage_fetch(msg,&data,&size);
00203 if (r != MAIL_NO_ERROR) {
00204 Global::statusMessage(tr("Error fetching mail %i").arg(mail->getNumber()));
00205 mailfolder_free(folder);
00206 mailstorage_free(storage);
00207 mailmessage_free(msg);
00208 return 0;
00209 }
00210 encodedString*result = new encodedString(data,size);
00211
00212 mailfolder_free(folder);
00213 mailstorage_free(storage);
00214 mailmessage_free(msg);
00215 return result;
00216 }
00217
00218 void MBOXwrapper::deleteMails(const QString & mailbox,const QValueList<RecMailP> &target)
00219 {
00220 QString p = MBOXPath+"/";
00221 p+=mailbox;
00222 mailmbox_folder*f = 0;
00223 int r = mailmbox_init(p.latin1(),0,1,0,&f);
00224 if (r != MAIL_NO_ERROR) {
00225 odebug << "Error init folder" << oendl;
00226 return;
00227 }
00228 deleteMails(f,target);
00229 mailmbox_done(f);
00230 }
00231
00232 void MBOXwrapper::deleteMails(mailmbox_folder*f,const QValueList<RecMailP> &target)
00233 {
00234 if (!f) return;
00235 int r;
00236 QValueList<RecMailP>::ConstIterator it;
00237 for (it=target.begin(); it != target.end();++it) {
00238 r = mailmbox_delete_msg(f,(*it)->getNumber());
00239 if (r!=MAILMBOX_NO_ERROR) {
00240 odebug << "error delete mail" << oendl;
00241 }
00242 }
00243 r = mailmbox_expunge(f);
00244 if (r != MAILMBOX_NO_ERROR) {
00245 odebug << "error expunge mailbox" << oendl;
00246 }
00247 }
00248
00249 int MBOXwrapper::deleteAllMail(const FolderP&tfolder)
00250 {
00251 if (!tfolder) return 0;
00252 QString p = MBOXPath+"/"+tfolder->getDisplayName();
00253 int res = 1;
00254
00255 mailfolder*folder = 0;
00256 mailmessage_list*l=0;
00257 mailstorage*storage = mailstorage_new(NULL);
00258 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
00259 if (r != MAIL_NO_ERROR) {
00260 Global::statusMessage(tr("Error initializing mbox"));
00261 res = 0;
00262 }
00263 if (res) {
00264 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
00265 r = mailfolder_connect(folder);
00266 if (r != MAIL_NO_ERROR) {
00267 Global::statusMessage(tr("Error initializing mbox"));
00268 res = 0;
00269 }
00270 }
00271 if (res) {
00272 r = mailsession_get_messages_list(folder->fld_session,&l);
00273 if (r != MAIL_NO_ERROR) {
00274 odebug << "Error message list" << oendl;
00275 res=0;
00276 }
00277 }
00278 for(unsigned int i = 0 ; l!= 0 && res==1 && i < carray_count(l->msg_tab) ; ++i) {
00279 r = mailsession_remove_message(folder->fld_session,i+1);
00280 if (r != MAIL_NO_ERROR) {
00281 Global::statusMessage(tr("Error deleting mail %1").arg(i+1));
00282 res = 0;
00283 break;
00284 }
00285 }
00286 if (l) mailmessage_list_free(l);
00287 if (folder) mailfolder_free(folder);
00288 if (storage) mailstorage_free(storage);
00289 return res;
00290 }
00291
00292 int MBOXwrapper::deleteMbox(const FolderP&tfolder)
00293 {
00294 if (!tfolder) return 0;
00295 QString p = MBOXPath+"/"+tfolder->getDisplayName();
00296 QFile fi(p);
00297 if (!fi.exists()) {
00298 Global::statusMessage(tr("Mailbox doesn't exist."));
00299 return 0;
00300 }
00301 if (!fi.remove()) {
00302 Global::statusMessage(tr("Error deleting Mailbox."));
00303 return 0;
00304 }
00305 return 1;
00306 }
00307
00308 void MBOXwrapper::statusFolder(folderStat&target_stat,const QString & mailbox)
00309 {
00310 mailfolder*folder = 0;
00311 mailstorage*storage = mailstorage_new(NULL);
00312 target_stat.message_count = 0;
00313 target_stat.message_unseen = 0;
00314 target_stat.message_recent = 0;
00315 QString p = MBOXPath+"/"+mailbox;
00316 QFile fi(p);
00317 if (!fi.exists()) {
00318 Global::statusMessage(tr("Mailbox doesn't exist."));
00319 return;
00320 }
00321 int r = mbox_mailstorage_init(storage,(char*)p.latin1(),0,0,0);
00322 folder = mailfolder_new( storage,(char*)p.latin1(),NULL);
00323 r = mailfolder_connect(folder);
00324 r = mailsession_status_folder(folder->fld_session,(char*)mailbox.latin1(),&target_stat.message_count,
00325 &target_stat.message_recent,&target_stat.message_unseen);
00326 if (folder) mailfolder_free(folder);
00327 if (storage) mailstorage_free(storage);
00328 }
00329
00330 MAILLIB::ATYPE MBOXwrapper::getType()const
00331 {
00332 return MAILLIB::A_MBOX;
00333 }
00334
00335 const QString&MBOXwrapper::getName()const
00336 {
00337 return MBOXName;
00338 }