diff options
Diffstat (limited to 'src/vmime/net/smtp/SMTPChunkingOutputStreamAdapter.cpp')
-rw-r--r-- | src/vmime/net/smtp/SMTPChunkingOutputStreamAdapter.cpp | 94 |
1 files changed, 54 insertions, 40 deletions
diff --git a/src/vmime/net/smtp/SMTPChunkingOutputStreamAdapter.cpp b/src/vmime/net/smtp/SMTPChunkingOutputStreamAdapter.cpp index f6ecc54d..3b242d1b 100644 --- a/src/vmime/net/smtp/SMTPChunkingOutputStreamAdapter.cpp +++ b/src/vmime/net/smtp/SMTPChunkingOutputStreamAdapter.cpp @@ -1,6 +1,6 @@ // // VMime library (http://www.vmime.org) -// Copyright (C) 2002-2013 Vincent Richard <[email protected]> +// Copyright (C) 2002 Vincent Richard <[email protected]> // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -40,21 +40,31 @@ namespace net { namespace smtp { -SMTPChunkingOutputStreamAdapter::SMTPChunkingOutputStreamAdapter - (shared_ptr <SMTPConnection> conn, const size_t size, utility::progressListener* progress) - : m_connection(conn), m_bufferSize(0), m_chunkCount(0), - m_totalSize(size), m_totalSent(0), m_progress(progress) -{ - if (progress) +SMTPChunkingOutputStreamAdapter::SMTPChunkingOutputStreamAdapter( + const shared_ptr <SMTPConnection>& conn, + const size_t size, + utility::progressListener* progress +) + : m_connection(conn), + m_bufferSize(0), + m_chunkCount(0), + m_totalSize(size), + m_totalSent(0), + m_progress(progress) { + + if (progress) { progress->start(size); + } } -void SMTPChunkingOutputStreamAdapter::sendChunk - (const byte_t* const data, const size_t count, const bool last) -{ - if (count == 0 && !last) - { +void SMTPChunkingOutputStreamAdapter::sendChunk( + const byte_t* const data, + const size_t count, + const bool last +) { + + if (count == 0 && !last) { // Nothing to send return; } @@ -65,45 +75,45 @@ void SMTPChunkingOutputStreamAdapter::sendChunk ++m_chunkCount; - if (m_progress) - { + if (m_progress) { + m_totalSent += count; m_totalSize = std::max(m_totalSize, m_totalSent); m_progress->progress(m_totalSent, m_totalSize); } - if (m_connection->getTracer()) + if (m_connection->getTracer()) { m_connection->getTracer()->traceSendBytes(count); + } // If PIPELINING is not supported, read one response for this BDAT command - if (!m_connection->hasExtension("PIPELINING")) - { + if (!m_connection->hasExtension("PIPELINING")) { + shared_ptr <SMTPResponse> resp = m_connection->readResponse(); - if (resp->getCode() != 250) - { + if (resp->getCode() != 250) { m_connection->getTransport()->disconnect(); throw exceptions::command_error("BDAT", resp->getText()); } - } + // If PIPELINING is supported, read one response for each chunk (ie. number // of BDAT commands issued) after the last chunk has been sent - else if (last) - { + } else if (last) { + bool invalidReply = false; shared_ptr <SMTPResponse> resp; - for (unsigned int i = 0 ; i < m_chunkCount ; ++i) - { + for (unsigned int i = 0 ; i < m_chunkCount ; ++i) { + resp = m_connection->readResponse(); - if (resp->getCode() != 250) + if (resp->getCode() != 250) { invalidReply = true; + } } - if (invalidReply) - { + if (invalidReply) { m_connection->getTransport()->disconnect(); throw exceptions::command_error("BDAT", resp->getText()); } @@ -111,14 +121,16 @@ void SMTPChunkingOutputStreamAdapter::sendChunk } -void SMTPChunkingOutputStreamAdapter::writeImpl - (const byte_t* const data, const size_t count) -{ +void SMTPChunkingOutputStreamAdapter::writeImpl( + const byte_t* const data, + const size_t count +) { + const byte_t* curData = data; size_t curCount = count; - while (curCount != 0) - { + while (curCount != 0) { + // Fill the buffer const size_t remaining = sizeof(m_buffer) - m_bufferSize; const size_t bytesToCopy = std::min(remaining, curCount); @@ -130,8 +142,8 @@ void SMTPChunkingOutputStreamAdapter::writeImpl curCount -= bytesToCopy; // If the buffer is full, send this chunk - if (m_bufferSize >= sizeof(m_buffer)) - { + if (m_bufferSize >= sizeof(m_buffer)) { + sendChunk(m_buffer, m_bufferSize, /* last */ false); m_bufferSize = 0; } @@ -139,21 +151,23 @@ void SMTPChunkingOutputStreamAdapter::writeImpl } -void SMTPChunkingOutputStreamAdapter::flush() -{ +void SMTPChunkingOutputStreamAdapter::flush() { + sendChunk(m_buffer, m_bufferSize, /* last */ true); m_bufferSize = 0; - if (m_progress) + if (m_progress) { m_progress->stop(m_totalSize); + } - if (m_connection->getTracer()) + if (m_connection->getTracer()) { m_connection->getTracer()->traceSendBytes(m_bufferSize); + } } -size_t SMTPChunkingOutputStreamAdapter::getBlockSize() -{ +size_t SMTPChunkingOutputStreamAdapter::getBlockSize() { + return sizeof(m_buffer); } |