#include #include #include #include "mimeparse.h" #include "rfc822.h" std::string mimeheader2str(const struct mimeheadert &mimeheader) { std::string dest=mimeheader.value; if(mimeheader.subvalue!="") { dest+="/"; dest+=mimeheader.subvalue; } for(unsigned i=0; isubpartm.data) // ignore empty parts { mimestructt subpart; subpart.offset=subpartm.data-rfcm.data+offset; subpart.mimeparse(subpartm); sub.push_back(subpart); } } if(line==boundary2) break; subpart_start=ptr; } previous_line=ptr; } } } void parse_mime_header(const std::string &text, mimeheadert &mimeheader) { std::vector symbols; unsigned i=0; parserfc822symbols(text, symbols, ";=/"); if(symbols[i].type!=rfc822symbolt::ATOM && symbols[i].type!=rfc822symbolt::QUOTED) return; mimeheader.value=symbols[i++].text; if(symbols[i].type!=rfc822symbolt::SPECIAL) return; if(symbols[i].text=="/") // subtype { i++; mimeheader.subvalue=symbols[i++].text; if(symbols[i].type!=rfc822symbolt::SPECIAL) return; } if(symbols[i++].text!=";") return; while(symbols[i].type==rfc822symbolt::ATOM || symbols[i].type==rfc822symbolt::QUOTED) { mimeattributet attribute; attribute.name=symbols[i++].text; if(symbols[i].type==rfc822symbolt::SPECIAL && symbols[i].text=="=" && (symbols[i+1].type==rfc822symbolt::ATOM || symbols[i+1].type==rfc822symbolt::QUOTED)) { i++; do attribute.value+=symbols[i++].text; while(symbols[i].type==rfc822symbolt::ATOM || symbols[i].type==rfc822symbolt::QUOTED || (symbols[i].type==rfc822symbolt::SPECIAL && symbols[i].text!=";")); mimeheader.attributes.push_back(attribute); } if(symbols[i].type!=rfc822symbolt::SPECIAL || symbols[i].text!=";") return; i++; } }