int QuotedPrintableEncoderBuf::writeToDevice(char c)
{
	if (_pending != -1)
	{
		if (_pending == '\r' && c == '\n')
			writeRaw((char) _pending);
		else if (c == '\r' || c == '\n')
			writeEncoded((char) _pending);
		else
			writeRaw((char) _pending);
		_pending = -1;
	}
	if (c == '\t' || c == ' ')
	{
		_pending = charToInt(c);
		return _pending;
	}
	else if (c == '\r' || c == '\n' || c > 32 && c < 127 && c != '=')
	{
		writeRaw(c);
	}
	else
	{
		writeEncoded(c);
	}
	return charToInt(c);
}
示例#2
0
void MailMessage::write(std::ostream& ostr) const
{
	MessageHeader header(*this);
	setRecipientHeaders(header);
	if (isMultipart())
	{
		writeMultipart(header, ostr);
	}
	else
	{
		writeHeader(header, ostr);
		std::istringstream istr(_content);
		writeEncoded(istr, ostr, _encoding);
	}
}
示例#3
0
void MailMessage::writePart(MultipartWriter& writer, const Part& part) const
{
	MessageHeader partHeader(part.pSource->headers());
	MediaType mediaType(part.pSource->mediaType());
	if (!part.name.empty())
		mediaType.setParameter("name", part.name);
	partHeader.set(HEADER_CONTENT_TYPE, mediaType.toString());
	partHeader.set(HEADER_CONTENT_TRANSFER_ENCODING, contentTransferEncodingToString(part.encoding));
	std::string disposition;
	if (part.disposition == CONTENT_ATTACHMENT)
	{
		disposition = "attachment";
		const std::string& filename = part.pSource->filename();
		if (!filename.empty())
		{
			disposition.append("; filename=");
			quote(filename, disposition);
		}
	}
	else disposition = "inline";
	partHeader.set(HEADER_CONTENT_DISPOSITION, disposition);
	writer.nextPart(partHeader);
	writeEncoded(part.pSource->stream(), writer.stream(), part.encoding);
}