diff --git a/src/utility/stream.cpp b/src/utility/stream.cpp index 06d4ba27..15c2e8eb 100644 --- a/src/utility/stream.cpp +++ b/src/utility/stream.cpp @@ -127,6 +127,13 @@ const stream::size_type inputStreamAdapter::read } +const stream::size_type inputStreamAdapter::skip(const size_type count) +{ + m_stream.ignore(count); + return (m_stream.gcount()); +} + + // inputStreamStringAdapter @@ -175,6 +182,22 @@ const stream::size_type inputStreamStringAdapter::read } +const stream::size_type inputStreamStringAdapter::skip(const size_type count) +{ + if (m_pos + count >= m_end) + { + const size_type remaining = m_end - m_pos; + m_pos = m_end; + return (remaining); + } + else + { + m_pos += count; + return (count); + } +} + + // inputStreamStringProxyAdapter @@ -216,6 +239,23 @@ const stream::size_type inputStreamStringProxyAdapter::read } +const stream::size_type inputStreamStringProxyAdapter::skip(const size_type count) +{ + const size_type remaining = m_buffer.length() - m_pos; + + if (count > remaining) + { + m_pos = m_buffer.length(); + return (remaining); + } + else + { + m_pos += count; + return (count); + } +} + + // inputStreamPointerAdapter @@ -253,5 +293,12 @@ const stream::size_type inputStreamPointerAdapter::read } +const stream::size_type inputStreamPointerAdapter::skip(const size_type count) +{ + m_stream->ignore(count); + return (m_stream->gcount()); +} + + } // utility } // vmime diff --git a/src/utility/stream.hpp b/src/utility/stream.hpp index 8f8de54c..a34e6153 100644 --- a/src/utility/stream.hpp +++ b/src/utility/stream.hpp @@ -97,6 +97,13 @@ public: * @return number of bytes read */ virtual const size_type read(value_type* const data, const size_type count) = 0; + + /** Skip a number of bytes. + * + * @param count maximum number of bytes to ignore + * @return number of bytes skipped + */ + virtual const size_type skip(const size_type count) = 0; }; @@ -179,6 +186,7 @@ public: const bool eof() const; void reset(); const size_type read(value_type* const data, const size_type count); + const size_type skip(const size_type count); private: @@ -199,6 +207,7 @@ public: const bool eof() const; void reset(); const size_type read(value_type* const data, const size_type count); + const size_type skip(const size_type count); private: @@ -223,6 +232,7 @@ public: const bool eof() const; void reset(); const size_type read(value_type* const data, const size_type count); + const size_type skip(const size_type count); private: @@ -248,6 +258,7 @@ public: const bool eof() const; void reset(); const size_type read(value_type* const data, const size_type count); + const size_type skip(const size_type count); private: