int popLine( std::string& out, bool append = false ) { char* newline = findNewLine(); if( newline == 0 ) { return 0; } else { // Put the data into the string if( append == false ) { out.clear(); } int length = (int)(newline - &buffer_[data_begin_] + 1); out.append( &buffer_[data_begin_], length ); // Move the start of the buffer data_begin_ += length; data_cnt_ -= length; return length; } }
/** * Get the next bodypart from the message body string. * * @param rfcBody (in) - message content * @param boundary (in) - mime boundary string * @param ret (out) - parsed BodyPart * @param next (i/o) - offset of the new boundary * @param isAttach (in) - says if the current body part is an attachment or not */ static bool getBodyPart(StringBuffer &rfcBody, StringBuffer &boundary, BodyPart &ret, size_t &next, bool isAttach) { LOG.debug("getBodyPart START"); StringBuffer newline; // The part starts on the next line size_t begin = findNewLine(rfcBody, next); if (begin == StringBuffer::npos) return false; // find the end of the part next = rfcBody.find(boundary, begin); if (next == StringBuffer::npos) return false; // get the part StringBuffer part = rfcBody.substr(begin, next-begin); // If it is a multipart alternative part, get the text part only. // check only until the first new line not on all the message (it could be // a message inside another message) size_t headers_len = getHeadersLen(part, newline); StringBuffer headers_part = part.substr(0, headers_len); if (headers_part.ifind("Content-Type: multipart/alternative") != StringBuffer::npos) { if(part.ifind("Content-Type: multipart/alternative") != StringBuffer::npos) { size_t b_pos = part.ifind("boundary="); if( b_pos != StringBuffer::npos ) { size_t begin = part.find("=\"", b_pos) + 2 ; size_t end = part.find("\"", begin) ; StringBuffer inner_boundary("\n--"); inner_boundary += part.substr( begin, end-begin ); begin = part.find(inner_boundary, end); begin += inner_boundary.length(); end = part.find(inner_boundary, begin); if (begin != StringBuffer::npos && end != StringBuffer::npos) { part = part.substr(begin, end-begin); LOG.debug("Bodypart is multipart/alternative: " "getting first alternative only: \n%s\n", part.c_str() ); } } } } // Split headers and body size_t hdrlen = getHeadersLen(part, newline); // Get headers StringBuffer headers = part.substr(0, hdrlen); // Join header parts using \t or 8 blank StringBuffer joinlinetab("\t"); headers.replaceAll(joinlinetab, " "); StringBuffer joinlinespaces(newline); joinlinespaces+=" "; // 8 blanks headers.replaceAll(joinlinespaces, " "); ArrayList lines; const StringBuffer *line; // parse the bodypart headers headers.split(lines, newline); for ( line=(StringBuffer *)lines.front(); line; line=(StringBuffer *)lines.next() ) { if( *line == "\r" ) continue; // The first empty line marks the end of the header section //if( line->empty() ){ // break; //} // Process the headers if( line->ifind(MIMETYPE) == 0 ) { // it must at the beginning ret.setMimeType(getTokenValue(line, MIMETYPE)); if (line->ifind(CT_NAME) != StringBuffer::npos) { ret.setName(MailMessage::decodeHeader(getTokenValue(line, CT_NAME,false))); } if (line->ifind(CT_CHARSET) != StringBuffer::npos ) { ret.setCharset(getTokenValue(line, CT_CHARSET)); } } else if( line->ifind(DISPOSITION) == 0 ) { ret.setDisposition( getTokenValue(line, DISPOSITION)); if (line->ifind(CD_FILENAME) != StringBuffer::npos ) { ret.setFilename( MailMessage::decodeHeader( getTokenValue(line, CD_FILENAME, false) ) ); } } else if( line->ifind(ENCODING) == 0 ) { ret.setEncoding( getTokenValue(line, ENCODING)); } } // move to the beginning of the content hdrlen += strlen(newline) + strlen(newline); // added 2 new line that separate the bodyparts // get bodypart content if( isAttach == false) { // || !ret.getFilename() ) { // this is not an attachment if(ret.getEncoding() && strcmp(ret.getEncoding(), "quoted-printable") == 0 ) { char *decoded = qp_decode( part.substr(hdrlen) ); ret.setContent ( decoded ); delete [] decoded; } else if (ret.getEncoding() && strcmp(ret.getEncoding(), "base64") == 0 ) { char *decoded = ""; size_t len = 0; if( uudecode( part.substr(hdrlen), &decoded, &len ) ) { LOG.error("Error decoding content"); } ret.setContent ( decoded ); delete [] decoded; } else { bool found = true; if (part.substr(hdrlen).length() < 6) { StringBuffer s(part.substr(hdrlen)); for (unsigned int i = 0; i < s.length(); i++) { if (s.c_str()[i] != '\r' && s.c_str()[i] != '\n') { found = true; break; } else { found = false; } } } if (found) { ret.setContent ( part.substr(hdrlen) ); } } } else { LOG.debug("Attachment"); ret.setContent( mkTempFileName( ret.getFilename() ) ); LOG.debug("%s", ret.getContent()); StringBuffer p = part.substr(hdrlen); if (p.length()) { LOG.debug("Saving..."); if( convertAndSave(ret.getContent(), p.c_str(), ret.getEncoding()) ) { LOG.error("Error in convertAndSave"); } else { LOG.debug("convertAndSave success"); } } } LOG.debug("getBodyPart END"); // return true if there are more parts return (next != StringBuffer::npos); }
bool hasLine() { return ( findNewLine() != 0 ); }
/** Jeśli terminalMode == true to czytamy z terminala, jeśli nie to z pliku. Funkcja wczytuje maksymalnie MAX_LINE_LENGTH znaków. Potem dzieli bufor na linie i wykonuje je po kolei. */ void getLines(bool terminalMode) { int i; int k = 0 ; if(buffer_position == end) /** tylko wtedy czytamy dalej */ { if(buffer[buffer_position] == '\n') { end_of_command = true; } shiftBufferLeft(); if(end==0) { if(buffer[0] == 0) /** bufor jest pusty */ { k= read(0, buffer, MAX_LINE_LENGTH + 1); end = k-1; } else /** jeden znak z nowej komendy jest już wczytany */ { k = read(0, buffer+1, MAX_LINE_LENGTH + 1); end = k; } } else if(end>0) { k = read(0, buffer+end+1, MAX_LINE_LENGTH + 1); buffer_position = end + 1; buffer_to_parse_position = end + 1; end += k; } if(k == -1) { ///printf("BLAD READ!\n"); ///printf("%s\n", strerror(errno)); exit(1); } if(k == 0) { ///printf("%d\n", strlen(buffer_to_parse)); if(strlen(buffer_to_parse)) { buffer_to_parse[buffer_to_parse_position] = 0; execute(); } if(stdin_status) printf("\n"); /** jesli czytamy z terminala to przejdź do nowej linii */ /// printf("KONIEC INPUTU\n"); fflush(stdout); exit(0); } ///printf("END= %d\n", end); } ///printf("BUFFER %s\n", buffer); ///printf("czytanie: k== %d\n", k); while(buffer_position != end) { findNewLine(); ///printf("END=%d endline =%d\n", end, line_end); for(buffer_position=start;buffer_position<=line_end; ++buffer_position, ++buffer_to_parse_position) { buffer_to_parse[buffer_to_parse_position] = buffer[buffer_position]; ///printf("WCZYTANO %c na pozycje %d\n", buffer[buffer_position], buffer_to_parse_position); if(buffer_position == end) { if(buffer[buffer_position] == '\n') { buffer_to_parse[buffer_to_parse_position] = 0; execute(); end_of_command = true; for(int i=0;i<MAX_LINE_LENGTH+10;++i) buffer_to_parse[i] = 0; buffer_to_parse_position = 0; } return ; } else if(buffer_position == line_end) { if(buffer[buffer_position] == '\n') /** koniec linii ale nie bufora */ { ///printf("\nstart %d ENDLINE na %d, end %d\n", start, line_end, end); buffer_to_parse[buffer_to_parse_position] = 0; if(start != line_end) /** Jesli start == end to linia pusta, nie robimy execute() żeby uniknąć Syntax error. */ execute(); buffer_position++; start = buffer_position; for(int i=0;i<MAX_LINE_LENGTH+10;++i) buffer_to_parse[i] = 0; buffer_to_parse_position = 0; break; } } } } }