Diffstat (limited to 'noncore/net/mail/imapwrapper.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/net/mail/imapwrapper.cpp | 976 |
1 files changed, 0 insertions, 976 deletions
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp deleted file mode 100644 index f1d42c2..0000000 --- a/noncore/net/mail/imapwrapper.cpp +++ b/dev/null @@ -1,976 +0,0 @@ -#include <stdlib.h> -#include <libetpan/libetpan.h> -#include <qpe/global.h> - -#include "imapwrapper.h" -#include "mailtypes.h" -#include "logindialog.h" - -IMAPwrapper::IMAPwrapper( IMAPaccount *a ) - : AbstractMail() -{ - account = a; - m_imap = 0; -} - -IMAPwrapper::~IMAPwrapper() -{ - logout(); -} - -void IMAPwrapper::imap_progress( size_t current, size_t maximum ) -{ - qDebug( "IMAP: %i of %i", current, maximum ); -} - -void IMAPwrapper::login() -{ - const char *server, *user, *pass; - uint16_t port; - int err = MAILIMAP_NO_ERROR; - - /* we are connected this moment */ - /* TODO: setup a timer holding the line or if connection closed - delete the value */ - if (m_imap) { - err = mailimap_noop(m_imap); - if (err!=MAILIMAP_NO_ERROR) { - logout(); - } else { - mailstream_flush(m_imap->imap_stream); - return; - } - } - server = account->getServer().latin1(); - port = account->getPort().toUInt(); - if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { - LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); - login.show(); - if ( QDialog::Accepted == login.exec() ) { - // ok - user = strdup( login.getUser().latin1() ); - pass = strdup( login.getPassword().latin1() ); - } else { - // cancel - qDebug( "IMAP: Login canceled" ); - return; - } - } else { - user = account->getUser().latin1(); - pass = account->getPassword().latin1(); - } - - m_imap = mailimap_new( 20, &imap_progress ); - - /* connect */ - if (account->getSSL()) { - err = mailimap_ssl_connect( m_imap, (char*)server, port ); - } else { - err = mailimap_socket_connect( m_imap, (char*)server, port ); - } - - if ( err != MAILIMAP_NO_ERROR && - err != MAILIMAP_NO_ERROR_AUTHENTICATED && - err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { - QString failure = ""; - if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) { - failure="Connection refused"; - } else { - failure="Unknown failure"; - } - Global::statusMessage(tr("error connecting imap server: %1").arg(failure)); - mailimap_free( m_imap ); - m_imap = 0; - return; - } - - /* login */ - err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); - if ( err != MAILIMAP_NO_ERROR ) { - Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response)); - err = mailimap_close( m_imap ); - mailimap_free( m_imap ); - m_imap = 0; - } -} - -void IMAPwrapper::logout() -{ - int err = MAILIMAP_NO_ERROR; - if (!m_imap) return; - err = mailimap_logout( m_imap ); - err = mailimap_close( m_imap ); - mailimap_free( m_imap ); - m_imap = 0; -} - -void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) -{ - const char *mb = 0; - int err = MAILIMAP_NO_ERROR; - clist *result = 0; - clistcell *current; -// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; - mailimap_fetch_type *fetchType = 0; - mailimap_set *set = 0; - - mb = mailbox.latin1(); - login(); - if (!m_imap) { - return; - } - /* select mailbox READONLY for operations */ - err = mailimap_examine( m_imap, (char*)mb); - if ( err != MAILIMAP_NO_ERROR ) { - Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); - return; - } - - int last = m_imap->imap_selection_info->sel_exists; - - if (last == 0) { - Global::statusMessage(tr("Mailbox has no mails")); - return; - } else { - Global::statusMessage(tr("Mailbox has %1 mails").arg(last)); - } - - /* the range has to start at 1!!! not with 0!!!! */ - set = mailimap_set_new_interval( 1, last ); - fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); - mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); - mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); - mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); - mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); - - err = mailimap_fetch( m_imap, set, fetchType, &result ); - mailimap_set_free( set ); - mailimap_fetch_type_free( fetchType ); - - QString date,subject,from; - - if ( err == MAILIMAP_NO_ERROR ) { - mailimap_msg_att * msg_att; - int i = 0; - for (current = clist_begin(result); current != 0; current=clist_next(current)) { - ++i; - msg_att = (mailimap_msg_att*)current->data; - RecMail*m = parse_list_result(msg_att); - if (m) { - m->setNumber(i); - m->setMbox(mailbox); - m->setWrapper(this); - target.append(m); - } - } - } else { - Global::statusMessage(tr("Error fetching headers: %1").arg(m_imap->imap_response)); - } - if (result) mailimap_fetch_list_free(result); -} - -QList<Folder>* IMAPwrapper::listFolders() -{ - const char *path, *mask; - int err = MAILIMAP_NO_ERROR; - clist *result = 0; - clistcell *current = 0; - clistcell*cur_flag = 0; - mailimap_mbx_list_flags*bflags = 0; - - QList<Folder> * folders = new QList<Folder>(); - folders->setAutoDelete( false ); - login(); - if (!m_imap) { - return folders; - } - -/* - * First we have to check for INBOX 'cause it sometimes it's not inside the path. - * We must not forget to filter them out in next loop! - * it seems like ugly code. and yes - it is ugly code. but the best way. - */ - QString temp; - mask = "INBOX" ; - mailimap_mailbox_list *list; - err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); - QString del; - bool selectable = true; - bool no_inferiors = false; - if ( err == MAILIMAP_NO_ERROR ) { - current = result->first; - for ( int i = result->count; i > 0; i-- ) { - list = (mailimap_mailbox_list *) current->data; - // it is better use the deep copy mechanism of qt itself - // instead of using strdup! - temp = list->mb_name; - del = list->mb_delimiter; - current = current->next; - if ( (bflags = list->mb_flag) ) { - selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& - bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); - for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { - if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { - no_inferiors = true; - } - } - } - folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); - } - } else { - qDebug("error fetching folders: %s",m_imap->imap_response); - } - mailimap_list_result_free( result ); - -/* - * second stage - get the other then inbox folders - */ - mask = "*" ; - path = account->getPrefix().latin1(); - if (!path) path = ""; - qDebug(path); - err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); - if ( err == MAILIMAP_NO_ERROR ) { - current = result->first; - for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { - no_inferiors = false; - list = (mailimap_mailbox_list *) current->data; - // it is better use the deep copy mechanism of qt itself - // instead of using strdup! - temp = list->mb_name; - if (temp.lower()=="inbox") - continue; - if (temp.lower()==account->getPrefix().lower()) - continue; - if ( (bflags = list->mb_flag) ) { - selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& - bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); - for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { - if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { - no_inferiors = true; - } - } - } - del = list->mb_delimiter; - folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); - } - } else { - qDebug("error fetching folders %s",m_imap->imap_response); - } - if (result) mailimap_list_result_free( result ); - return folders; -} - -RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) -{ - RecMail * m = 0; - mailimap_msg_att_item *item=0; - clistcell *current,*c,*cf; - mailimap_msg_att_dynamic*flist; - mailimap_flag_fetch*cflag; - int size; - QBitArray mFlags(7); - QStringList addresslist; - - if (!m_att) { - return m; - } - m = new RecMail(); - for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { - current = c; - size = 0; - item = (mailimap_msg_att_item*)current->data; - if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { - flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; - if (!flist->att_list) { - continue; - } - cf = flist->att_list->first; - for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { - cflag = (mailimap_flag_fetch*)cf->data; - if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { - switch (cflag->fl_flag->fl_type) { - case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ - mFlags.setBit(FLAG_ANSWERED); - break; - case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ - mFlags.setBit(FLAG_FLAGGED); - break; - case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ - mFlags.setBit(FLAG_DELETED); - break; - case MAILIMAP_FLAG_SEEN: /* \Seen flag */ - mFlags.setBit(FLAG_SEEN); - break; - case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ - mFlags.setBit(FLAG_DRAFT); - break; - case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ - break; - case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ - break; - default: - break; - } - } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { - mFlags.setBit(FLAG_RECENT); - } - } - continue; - } - if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { - mailimap_envelope * head = item->att_data.att_static->att_data.att_env; - m->setDate(head->env_date); - m->setSubject(convert_String((const char*)head->env_subject)); - //m->setSubject(head->env_subject); - if (head->env_from!=NULL) { - addresslist = address_list_to_stringlist(head->env_from->frm_list); - if (addresslist.count()) { - m->setFrom(addresslist.first()); - } - } - if (head->env_to!=NULL) { - addresslist = address_list_to_stringlist(head->env_to->to_list); - m->setTo(addresslist); - } - if (head->env_cc!=NULL) { - addresslist = address_list_to_stringlist(head->env_cc->cc_list); - m->setCC(addresslist); - } - if (head->env_bcc!=NULL) { - addresslist = address_list_to_stringlist(head->env_bcc->bcc_list); - m->setBcc(addresslist); - } - if (head->env_reply_to!=NULL) { - addresslist = address_list_to_stringlist(head->env_reply_to->rt_list); - if (addresslist.count()) { - m->setReplyto(addresslist.first()); - } - } - m->setMsgid(QString(head->env_message_id)); - } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) { -#if 0 - mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date; - QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); - qDebug("%i %i %i - %i %i %i",d->dt_year,d->dt_month,d->dt_day,d->dt_hour,d->dt_min,d->dt_sec); - qDebug(da.toString()); -#endif - } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) { - size = item->att_data.att_static->att_data.att_rfc822_size; - } - } - /* msg is already deleted */ - if (mFlags.testBit(FLAG_DELETED) && m) { - delete m; - m = 0; - } - if (m) { - m->setFlags(mFlags); - m->setMsgsize(size); - } - return m; -} - -RecBody IMAPwrapper::fetchBody(const RecMail&mail) -{ - RecBody body; - const char *mb; - int err = MAILIMAP_NO_ERROR; - clist *result = 0; - clistcell *current; - mailimap_fetch_att *fetchAtt = 0; - mailimap_fetch_type *fetchType = 0; - mailimap_set *set = 0; - mailimap_body*body_desc = 0; - - mb = mail.getMbox().latin1(); - - login(); - if (!m_imap) { - return body; - } - - err = mailimap_select( m_imap, (char*)mb); - if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error selecting mailbox: %s",m_imap->imap_response); - return body; - } - - /* the range has to start at 1!!! not with 0!!!! */ - set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); - fetchAtt = mailimap_fetch_att_new_bodystructure(); - fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); - err = mailimap_fetch( m_imap, set, fetchType, &result ); - mailimap_set_free( set ); - mailimap_fetch_type_free( fetchType ); - - if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { - mailimap_msg_att * msg_att; - msg_att = (mailimap_msg_att*)current->data; - mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data; - QValueList<int> path; - body_desc = item->att_data.att_static->att_data.att_body; - traverseBody(mail,body_desc,body,0,path); - } else { - qDebug("error fetching body: %s",m_imap->imap_response); - } - if (result) mailimap_fetch_list_free(result); - return body; -} - -QStringList IMAPwrapper::address_list_to_stringlist(clist*list) -{ - QStringList l; - QString from; - bool named_from; - clistcell *current = NULL; - mailimap_address * current_address=NULL; - if (!list) { - return l; - } - unsigned int count = 0; - for (current=clist_begin(list);current!= NULL;current=clist_next(current)) { - from = ""; - named_from = false; - current_address=(mailimap_address*)current->data; - if (current_address->ad_personal_name){ - from+=convert_String((const char*)current_address->ad_personal_name); - from+=" "; - named_from = true; - } - if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { - from+="<"; - } - if (current_address->ad_mailbox_name) { - from+=QString(current_address->ad_mailbox_name); - from+="@"; - } - if (current_address->ad_host_name) { - from+=QString(current_address->ad_host_name); - } - if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { - from+=">"; - } - l.append(QString(from)); - if (++count > 99) { - break; - } - } - return l; -} - -encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call) -{ - encodedString*res=new encodedString; - const char*mb; - int err; - mailimap_fetch_type *fetchType; - mailimap_set *set; - clistcell*current,*cur; - - login(); - if (!m_imap) { - return res; - } - if (!internal_call) { - mb = mail.getMbox().latin1(); - err = mailimap_select( m_imap, (char*)mb); - if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error selecting mailbox: %s",m_imap->imap_response); - return res; - } - } - set = mailimap_set_new_single(mail.getNumber()); - clist*id_list=clist_new(); - for (unsigned j=0; j < path.count();++j) { - uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id)); - *p_id = path[j]; - clist_append(id_list,p_id); - } - mailimap_section_part * section_part = mailimap_section_part_new(id_list); - mailimap_section_spec * section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL); - mailimap_section * section = mailimap_section_new(section_spec); - mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section); - - fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); - - clist*result = 0; - - err = mailimap_fetch( m_imap, set, fetchType, &result ); - mailimap_set_free( set ); - mailimap_fetch_type_free( fetchType ); - - if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { - mailimap_msg_att * msg_att; - msg_att = (mailimap_msg_att*)current->data; - mailimap_msg_att_item*msg_att_item; - for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { - msg_att_item = (mailimap_msg_att_item*)clist_content(cur); - if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { - if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { - char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; - /* detach - we take over the content */ - msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; - res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length); - } - } - } - } else { - qDebug("error fetching text: %s",m_imap->imap_response); - } - if (result) mailimap_fetch_list_free(result); - return res; -} - -/* current_recursion is for recursive calls. - current_count means the position inside the internal loop! */ -void IMAPwrapper::traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body, - int current_recursion,QValueList<int>recList,int current_count) -{ - if (!body || current_recursion>=10) { - return; - } - switch (body->bd_type) { - case MAILIMAP_BODY_1PART: - { - QValueList<int>countlist = recList; - countlist.append(current_count); - RecPart currentPart; - mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part; - QString id(""); - currentPart.setPositionlist(countlist); - for (unsigned int j = 0; j < countlist.count();++j) { - id+=(j>0?" ":""); - id+=QString("%1").arg(countlist[j]); - } - qDebug("ID = %s",id.latin1()); - currentPart.setIdentifier(id); - fillSinglePart(currentPart,part1); - /* important: Check for is NULL 'cause a body can be empty! - And we put it only into the mail if it is the FIRST part */ - if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body.Bodytext().isNull() && countlist[0]==1) { - QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding()); - target_body.setDescription(currentPart); - target_body.setBodytext(body_text); - if (countlist.count()>1) { - target_body.addPart(currentPart); - } - } else { - target_body.addPart(currentPart); - } - if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) { - traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist); - } - } - break; - case MAILIMAP_BODY_MPART: - { - QValueList<int>countlist = recList; - clistcell*current=0; - mailimap_body*current_body=0; - unsigned int ccount = 1; - mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart; - for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) { - current_body = (mailimap_body*)current->data; - if (current_body->bd_type==MAILIMAP_BODY_MPART) { - RecPart targetPart; - targetPart.setType("multipart"); - fillMultiPart(targetPart,mailDescription); - countlist.append(current_count); - targetPart.setPositionlist(countlist); - target_body.addPart(targetPart); - QString id(""); - for (unsigned int j = 0; j < countlist.count();++j) { - id+=(j>0?" ":""); - id+=QString("%1").arg(countlist[j]); - } - qDebug("ID(mpart) = %s",id.latin1()); - } - traverseBody(mail,current_body,target_body,current_recursion+1,countlist,ccount); - if (current_body->bd_type==MAILIMAP_BODY_MPART) { - countlist = recList; - } - ++ccount; - } - } - break; - default: - break; - } -} - -void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description) -{ - if (!Description) { - return; - } - switch (Description->bd_type) { - case MAILIMAP_BODY_TYPE_1PART_TEXT: - target_part.setType("text"); - fillSingleTextPart(target_part,Description->bd_data.bd_type_text); - break; - case MAILIMAP_BODY_TYPE_1PART_BASIC: - fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); - break; - case MAILIMAP_BODY_TYPE_1PART_MSG: - target_part.setType("message"); - fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); - break; - default: - break; - } -} - -void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which) -{ - if (!which) { - return; - } - QString sub; - sub = which->bd_media_text; - qDebug("Type= text/%s",which->bd_media_text); - target_part.setSubtype(sub.lower()); - target_part.setLines(which->bd_lines); - fillBodyFields(target_part,which->bd_fields); -} - -void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which) -{ - if (!which) { - return; - } - target_part.setSubtype("rfc822"); - qDebug("Message part"); - /* we set this type to text/plain */ - target_part.setLines(which->bd_lines); - fillBodyFields(target_part,which->bd_fields); -} - -void IMAPwrapper::fillMultiPart(RecPart&target_part,mailimap_body_type_mpart*which) -{ - if (!which) return; - QString sub = which->bd_media_subtype; - target_part.setSubtype(sub.lower()); - if (which->bd_ext_mpart && which->bd_ext_mpart->bd_parameter && which->bd_ext_mpart->bd_parameter->pa_list) { - clistcell*cur = 0; - mailimap_single_body_fld_param*param=0; - for (cur = clist_begin(which->bd_ext_mpart->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { - param = (mailimap_single_body_fld_param*)cur->data; - if (param) { - target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); - } - } - } -} - -void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) -{ - if (!which) { - return; - } - QString type,sub; - switch (which->bd_media_basic->med_type) { - case MAILIMAP_MEDIA_BASIC_APPLICATION: - type = "application"; - break; - case MAILIMAP_MEDIA_BASIC_AUDIO: - type = "audio"; - break; - case MAILIMAP_MEDIA_BASIC_IMAGE: - type = "image"; - break; - case MAILIMAP_MEDIA_BASIC_MESSAGE: - type = "message"; - break; - case MAILIMAP_MEDIA_BASIC_VIDEO: - type = "video"; - break; - case MAILIMAP_MEDIA_BASIC_OTHER: - default: - if (which->bd_media_basic->med_basic_type) { - type = which->bd_media_basic->med_basic_type; - } else { - type = ""; - } - break; - } - if (which->bd_media_basic->med_subtype) { - sub = which->bd_media_basic->med_subtype; - } else { - sub = ""; - } - qDebug("Type = %s/%s",type.latin1(),sub.latin1()); - target_part.setType(type.lower()); - target_part.setSubtype(sub.lower()); - fillBodyFields(target_part,which->bd_fields); -} - -void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which) -{ - if (!which) return; - if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) { - clistcell*cur; - mailimap_single_body_fld_param*param=0; - for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { - param = (mailimap_single_body_fld_param*)cur->data; - if (param) { - target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); - } - } - } - mailimap_body_fld_enc*enc = which->bd_encoding; - QString encoding(""); - switch (enc->enc_type) { - case MAILIMAP_BODY_FLD_ENC_7BIT: - encoding = "7bit"; - break; - case MAILIMAP_BODY_FLD_ENC_8BIT: - encoding = "8bit"; - break; - case MAILIMAP_BODY_FLD_ENC_BINARY: - encoding="binary"; - break; - case MAILIMAP_BODY_FLD_ENC_BASE64: - encoding="base64"; - break; - case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE: - encoding="quoted-printable"; - break; - case MAILIMAP_BODY_FLD_ENC_OTHER: - default: - if (enc->enc_value) { - char*t=enc->enc_value; - encoding=QString(enc->enc_value); - enc->enc_value=0L; - free(t); - } - } - if (which->bd_description) { - target_part.setDescription(QString(which->bd_description)); - } - target_part.setEncoding(encoding); - target_part.setSize(which->bd_size); -} - -void IMAPwrapper::deleteMail(const RecMail&mail) -{ - mailimap_flag_list*flist; - mailimap_set *set; - mailimap_store_att_flags * store_flags; - int err; - login(); - if (!m_imap) { - return; - } - const char *mb = mail.getMbox().latin1(); - err = mailimap_select( m_imap, (char*)mb); - if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error selecting mailbox for delete: %s",m_imap->imap_response); - return; - } - flist = mailimap_flag_list_new_empty(); - mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); - store_flags = mailimap_store_att_flags_new_set_flags(flist); - set = mailimap_set_new_single(mail.getNumber()); - err = mailimap_store(m_imap,set,store_flags); - mailimap_set_free( set ); - mailimap_store_att_flags_free(store_flags); - - if (err != MAILIMAP_NO_ERROR) { - qDebug("error deleting mail: %s",m_imap->imap_response); - return; - } - qDebug("deleting mail: %s",m_imap->imap_response); - /* should we realy do that at this moment? */ - err = mailimap_expunge(m_imap); - if (err != MAILIMAP_NO_ERROR) { - qDebug("error deleting mail: %s",m_imap->imap_response); - } - qDebug("Delete successfull %s",m_imap->imap_response); -} - -void IMAPwrapper::answeredMail(const RecMail&mail) -{ - mailimap_flag_list*flist; - mailimap_set *set; - mailimap_store_att_flags * store_flags; - int err; - login(); - if (!m_imap) { - return; - } - const char *mb = mail.getMbox().latin1(); - err = mailimap_select( m_imap, (char*)mb); - if ( err != MAILIMAP_NO_ERROR ) { - qDebug("error selecting mailbox for mark: %s",m_imap->imap_response); - return; - } - flist = mailimap_flag_list_new_empty(); - mailimap_flag_list_add(flist,mailimap_flag_new_answered()); - store_flags = mailimap_store_att_flags_new_add_flags(flist); - set = mailimap_set_new_single(mail.getNumber()); - err = mailimap_store(m_imap,set,store_flags); - mailimap_set_free( set ); - mailimap_store_att_flags_free(store_flags); - - if (err != MAILIMAP_NO_ERROR) { - qDebug("error marking mail: %s",m_imap->imap_response); - return; - } -} - -QString IMAPwrapper::fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call,const QString&enc) -{ - QString body(""); - encodedString*res = fetchRawPart(mail,path,internal_call); - encodedString*r = decode_String(res,enc); - delete res; - if (r) { - if (r->Length()>0) { - body = r->Content(); - } - delete r; - } - return body; -} - -QString IMAPwrapper::fetchTextPart(const RecMail&mail,const RecPart&part) -{ - return fetchTextPart(mail,part.Positionlist(),false,part.Encoding()); -} - -encodedString* IMAPwrapper::fetchDecodedPart(const RecMail&mail,const RecPart&part) -{ - encodedString*res = fetchRawPart(mail,part.Positionlist(),false); - encodedString*r = decode_String(res,part.Encoding()); - delete res; - return r; -} - -encodedString* IMAPwrapper::fetchRawPart(const RecMail&mail,const RecPart&part) -{ - return fetchRawPart(mail,part.Positionlist(),false); -} - -int IMAPwrapper::deleteAllMail(const Folder*folder) -{ - login(); - if (!m_imap) { - return 0; - } - mailimap_flag_list*flist; - mailimap_set *set; - mailimap_store_att_flags * store_flags; - int err = mailimap_select( m_imap, folder->getName().latin1()); - if ( err != MAILIMAP_NO_ERROR ) { - Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); - return 0; - } - int last = m_imap->imap_selection_info->sel_exists; - if (last == 0) { - Global::statusMessage(tr("Mailbox has no mails!")); - return 0; - } - flist = mailimap_flag_list_new_empty(); - mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); - store_flags = mailimap_store_att_flags_new_set_flags(flist); - set = mailimap_set_new_interval( 1, last ); - err = mailimap_store(m_imap,set,store_flags); - mailimap_set_free( set ); - mailimap_store_att_flags_free(store_flags); - if (err != MAILIMAP_NO_ERROR) { - Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); - return 0; - } - qDebug("deleting mail: %s",m_imap->imap_response); - /* should we realy do that at this moment? */ - err = mailimap_expunge(m_imap); - if (err != MAILIMAP_NO_ERROR) { - Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); - return 0; - } - qDebug("Delete successfull %s",m_imap->imap_response); - return 1; -} - -int IMAPwrapper::createMbox(const QString&folder,const Folder*parentfolder,const QString& delemiter,bool getsubfolder) -{ - if (folder.length()==0) return 0; - login(); - if (!m_imap) {return 0;} - QString pre = account->getPrefix(); - if (delemiter.length()>0 && pre.findRev(delemiter)!=pre.length()-1) { - pre+=delemiter; - } - if (parentfolder) { - pre += parentfolder->getDisplayName()+delemiter; - } - pre+=folder; - if (getsubfolder) { - if (delemiter.length()>0) { - pre+=delemiter; - } else { - Global::statusMessage(tr("Cannot create folder %1 for holding subfolders").arg(pre)); - return 0; - } - } - qDebug("Creating %s",pre.latin1()); - int res = mailimap_create(m_imap,pre.latin1()); - if (res != MAILIMAP_NO_ERROR) { - Global::statusMessage(tr("%1").arg(m_imap->imap_response)); - return 0; - } - return 1; -} - -int IMAPwrapper::deleteMbox(const Folder*folder) -{ - if (!folder) return 0; - login(); - if (!m_imap) {return 0;} - int res = mailimap_delete(m_imap,folder->getName()); - if (res != MAILIMAP_NO_ERROR) { - Global::statusMessage(tr("%1").arg(m_imap->imap_response)); - return 0; - } - return 1; -} - -void IMAPwrapper::statusFolder(folderStat&target_stat,const QString & mailbox) -{ - mailimap_status_att_list * att_list =0; - mailimap_mailbox_data_status * status=0; - clistiter * cur = 0; - int r = 0; - int res = 0; - target_stat.message_count = 0; - target_stat.message_unseen = 0; - target_stat.message_recent = 0; - login(); - if (!m_imap) { - return; - } - att_list = mailimap_status_att_list_new_empty(); - if (!att_list) return; - r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_MESSAGES); - r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_RECENT); - r = mailimap_status_att_list_add(att_list, MAILIMAP_STATUS_ATT_UNSEEN); - r = mailimap_status(m_imap, mailbox.latin1(), att_list, &status); - for (cur = clist_begin(status->st_info_list); - cur != NULL ; cur = clist_next(cur)) { - mailimap_status_info * status_info; - status_info = (mailimap_status_info *)clist_content(cur); - switch (status_info->st_att) { - case MAILIMAP_STATUS_ATT_MESSAGES: - target_stat.message_count = status_info->st_value; - break; - case MAILIMAP_STATUS_ATT_RECENT: - target_stat.message_recent = status_info->st_value; - break; - case MAILIMAP_STATUS_ATT_UNSEEN: - target_stat.message_unseen = status_info->st_value; - break; - } - } - mailimap_mailbox_data_status_free(status); - mailimap_status_att_list_free(att_list); -} |