void streamContentHandler::generate(utility::outputStream& os, const vmime::encoding& enc, const string::size_type maxLineLength) const { if (!m_stream) return; // Managed data is already encoded if (isEncoded()) { // The data is already encoded but the encoding specified for // the generation is different from the current one. We need // to re-encode data: decode from input buffer to temporary // buffer, and then re-encode to output stream... if (m_encoding != enc) { ref <utility::encoder::encoder> theDecoder = m_encoding.getEncoder(); ref <utility::encoder::encoder> theEncoder = enc.getEncoder(); theEncoder->getProperties()["maxlinelength"] = maxLineLength; theEncoder->getProperties()["text"] = (m_contentType.getType() == mediaTypes::TEXT); m_stream->reset(); // may not work... std::ostringstream oss; utility::outputStreamAdapter tempOut(oss); theDecoder->decode(*m_stream, tempOut); string str = oss.str(); utility::inputStreamStringAdapter tempIn(str); theEncoder->encode(tempIn, os); } // No encoding to perform else { m_stream->reset(); // may not work... utility::bufferedStreamCopy(*m_stream, os); } } // Need to encode data before else { ref <utility::encoder::encoder> theEncoder = enc.getEncoder(); theEncoder->getProperties()["maxlinelength"] = maxLineLength; theEncoder->getProperties()["text"] = (m_contentType.getType() == mediaTypes::TEXT); m_stream->reset(); // may not work... theEncoder->encode(*m_stream, os); } }
void stringContentHandler::generate(utility::outputStream& os, const vmime::encoding& enc, const size_t maxLineLength) const { // Managed data is already encoded if (isEncoded()) { // The data is already encoded but the encoding specified for // the generation is different from the current one. We need // to re-encode data: decode from input buffer to temporary // buffer, and then re-encode to output stream... if (m_encoding != enc) { shared_ptr <utility::encoder::encoder> theDecoder = m_encoding.getEncoder(); shared_ptr <utility::encoder::encoder> theEncoder = enc.getEncoder(); theEncoder->getProperties()["maxlinelength"] = maxLineLength; theEncoder->getProperties()["text"] = (m_contentType.getType() == mediaTypes::TEXT); utility::inputStreamStringProxyAdapter in(m_string); std::ostringstream oss; utility::outputStreamAdapter tempOut(oss); theDecoder->decode(in, tempOut); string str = oss.str(); utility::inputStreamStringAdapter tempIn(str); theEncoder->encode(tempIn, os); } // No encoding to perform else { m_string.extract(os); } } // Need to encode data before else { shared_ptr <utility::encoder::encoder> theEncoder = enc.getEncoder(); theEncoder->getProperties()["maxlinelength"] = maxLineLength; theEncoder->getProperties()["text"] = (m_contentType.getType() == mediaTypes::TEXT); utility::inputStreamStringProxyAdapter in(m_string); theEncoder->encode(in, os); } }
void IMAPMessagePartContentHandler::generate (utility::outputStream& os, const vmime::encoding& enc, size_t maxLineLength) const { shared_ptr <IMAPMessage> msg = constCast <IMAPMessage>(m_message.lock()); shared_ptr <messagePart> part = constCast <messagePart>(m_part.lock()); // Data is already encoded if (isEncoded()) { // The data is already encoded but the encoding specified for // the generation is different from the current one. We need // to re-encode data: decode from input buffer to temporary // buffer, and then re-encode to output stream... if (m_encoding != enc) { // Extract part contents to temporary buffer std::ostringstream oss; utility::outputStreamAdapter tmp(oss); msg->extractPart(part, tmp, NULL); // Decode to another temporary buffer utility::inputStreamStringProxyAdapter in(oss.str()); std::ostringstream oss2; utility::outputStreamAdapter tmp2(oss2); shared_ptr <utility::encoder::encoder> theDecoder = m_encoding.getEncoder(); theDecoder->decode(in, tmp2); // Reencode to output stream string str = oss2.str(); utility::inputStreamStringAdapter tempIn(str); shared_ptr <utility::encoder::encoder> theEncoder = enc.getEncoder(); theEncoder->getProperties()["maxlinelength"] = maxLineLength; theEncoder->getProperties()["text"] = (m_contentType.getType() == mediaTypes::TEXT); theEncoder->encode(tempIn, os); } // No encoding to perform else { msg->extractPart(part, os); } } // Need to encode data before else { // Extract part contents to temporary buffer std::ostringstream oss; utility::outputStreamAdapter tmp(oss); msg->extractPart(part, tmp, NULL); // Encode temporary buffer to output stream shared_ptr <utility::encoder::encoder> theEncoder = enc.getEncoder(); theEncoder->getProperties()["maxlinelength"] = maxLineLength; theEncoder->getProperties()["text"] = (m_contentType.getType() == mediaTypes::TEXT); utility::inputStreamStringAdapter is(oss.str()); theEncoder->encode(is, os); } }