void ExtractAddressFromLine(char *finder,char **storeto,char **storetonick) { if(finder==NULL) { *storeto=*storetonick=NULL; return; } while(WS(finder)) finder++; if((*finder)!='<') { char *finderend=finder+1; do { if(ENDLINEWS(finderend)) //after endline information continues finderend+=2; while(!ENDLINE(finderend) && !EOS(finderend)) finderend++; //seek to the end of line or to the end of string }while(ENDLINEWS(finderend)); finderend--; while(WS(finderend) || ENDLINE(finderend)) finderend--; //find the end of text, no whitespace if(*finderend!='>') //not '>' at the end of line CopyToHeader(finder,finderend+1,storeto,MIME_MAIL); else //at the end of line, there's '>' { char *finder2=finderend; while((*finder2!='<') && (finder2>finder)) finder2--; //go to matching '<' or to the start CopyToHeader(finder2,finderend+1,storeto,MIME_MAIL); if(*finder2=='<') //if we found '<', the rest copy as from nick { finder2--; while(WS(finder2) || ENDLINE(finder2)) finder2--; //parse whitespace CopyToHeader(finder,finder2+1,storetonick,MIME_MAIL); //and store nickname } } } else { char *finderend=finder+1; do { if(ENDLINEWS(finderend)) //after endline information continues finderend+=2; while(!ENDLINE(finderend) && (*finderend!='>') && !EOS(finderend)) finderend++; //seek to the matching < or to the end of line or to the end of string }while(ENDLINEWS(finderend)); CopyToHeader(finder,finderend+1,storeto,MIME_MAIL); //go to first '>' or to the end and copy finder=finderend+1; while(WS(finder)) finder++; //parse whitespace if(!ENDLINE(finder) && !EOS(finder)) //if there are chars yet, it's nick { finderend=finder+1; while(!ENDLINE(finderend) && !EOS(finderend)) finderend++; //seek to the end of line or to the end of string finderend--; while(WS(finderend)) finderend--; //find the end of line, no whitespace CopyToHeader(finder,finderend+1,storetonick,MIME_MAIL); } } }
void ExtractStringFromLine(char *finder,char **storeto) { if(finder==NULL) { *storeto=NULL; return; } while(WS(finder)) finder++; char *finderend=finder; do { if(ENDLINEWS(finderend)) finderend++; //after endline information continues while(!ENDLINE(finderend) && !EOS(finderend)) finderend++; }while(ENDLINEWS(finderend)); finderend--; while(WS(finderend)) finderend--; //find the end of line, no whitespace CopyToHeader(finder,finderend+1,storeto,MIME_PLAIN); }
void WINAPI TranslateHeaderFcn(char *stream,int len,struct CMimeItem **head) { try { char *finder=stream; char *prev1,*prev2,*prev3; struct CMimeItem *Item=NULL; while(finder<=(stream+len)) { while(ENDLINEWS(finder)) finder++; //at the start of line if (DOTLINE(finder+1)) //at the end of stream break; prev1=finder; while(*finder != ':' && !EOS(finder)) finder++; if (!EOS(finder)) prev2=finder++; else break; while(WS(finder) && !EOS(finder)) finder++; if (!EOS(finder)) prev3=finder; else break; do { if (ENDLINEWS(finder)) finder+=2; //after endline information continues while(!ENDLINE(finder) && !EOS(finder)) finder++; }while(ENDLINEWS(finder)); if (Item != NULL) { if (NULL==(Item->Next=new struct CMimeItem)) break; Item=Item->Next; } else { Item = new CMimeItem; *head = Item; } Item->Next=NULL; Item->name=new char [prev2-prev1+1]; lstrcpynA(Item->name,prev1,prev2-prev1+1); Item->value=new char [finder-prev3+1]; lstrcpynA(Item->value,prev3,finder-prev3+1); if (EOS(finder)) break; finder++; if (ENDLINE(finder)) { finder++; if (ENDLINE(finder)) { // end of headers. message body begins finder++; if (ENDLINE(finder))finder++; prev1 = finder; while (!DOTLINE(finder+1))finder++; if (ENDLINE(finder))finder--; prev2 = finder; if (prev2>prev1) { // yes, we have body if (NULL==(Item->Next=new struct CMimeItem)) break; // Cant create new item?! Item=Item->Next; Item->Next=NULL;//just in case; Item->name=new char[5]; strncpy(Item->name,"Body",5); Item->value=new char [prev2-prev1]; lstrcpynA(Item->value,prev1,prev2-prev1-1); } break; // there is nothing else } } } } catch(...) { MessageBoxA(NULL,"Translate header error","",0); } }
void ParseAPart(APartDataType *data) { size_t len = strlen(data->Src); try { char *finder=data->Src; char *prev1,*prev2,*prev3; while(finder<=(data->Src+len)) { while(ENDLINEWS(finder)) finder++; //at the start of line if (finder>data->Src){ if (*(finder-2)=='\r' || *(finder-2)=='\n') *(finder-2)=0; if (*(finder-1)=='\r' || *(finder-1)=='\n') *(finder-1)=0; } prev1=finder; while(*finder!=':' && !EOS(finder) && !ENDLINE(finder)) finder++; if (ENDLINE(finder)||EOS(finder)){ // no ":" in the line? here the body begins; data->body = prev1; break; } prev2=finder++; while(WS(finder) && !EOS(finder)) finder++; if(!EOS(finder)) prev3=finder; else break; do { if(ENDLINEWS(finder)) finder+=2; //after endline information continues while(!ENDLINE(finder) && !EOS(finder)) finder++; }while(ENDLINEWS(finder)); if (!_strnicmp(prev1,"Content-type",prev2-prev1)){ data->ContType = prev3; } else if (!_strnicmp(prev1,"Content-Transfer-Encoding",prev2-prev1)){ data->TransEnc = prev3; } if(EOS(finder)) break; finder++; if(ENDLINE(finder)) { finder++; if(ENDLINE(finder)) { // end of headers. message body begins if (finder>data->Src){ if (*(finder-2)=='\r' || *(finder-2)=='\n') *(finder-2)=0; if (*(finder-1)=='\r' || *(finder-1)=='\n') *(finder-1)=0; } finder++; if(ENDLINE(finder))finder++; prev1 = finder; while (!EOS(finder+1))finder++; if (ENDLINE(finder))finder--; prev2 = finder; if (prev2>prev1){ // yes, we have body data->body = prev1; } break; // there is nothing else } } } } catch(...) { MessageBox(NULL,_T("Translate header error"),_T(""),0); } if (data->body) data->bodyLen = (int)strlen(data->body); }