From c2ae897b02bfb67ed2ecc6048ecc494eb61be52a Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Fri, 2 Sep 2016 20:53:45 -0700 Subject: [PATCH] Change API of raw_istream to be more similar to raw_ostream. --- src/WireDecoder.h | 4 ++-- wpiutil/include/support/raw_istream.h | 24 ++++++++++++++++---- wpiutil/include/support/raw_socket_istream.h | 10 ++++---- wpiutil/src/support/leb128.cpp | 3 ++- wpiutil/src/support/raw_istream.cpp | 10 +++++--- wpiutil/src/support/raw_socket_istream.cpp | 9 +++++--- 6 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/WireDecoder.h b/src/WireDecoder.h index 1063072c88..0136910843 100644 --- a/src/WireDecoder.h +++ b/src/WireDecoder.h @@ -52,7 +52,7 @@ class WireDecoder { bool Read(const char** buf, std::size_t len) { if (len > m_allocated) Realloc(len); *buf = m_buf; - bool rv = m_is.read(m_buf, len); + m_is.read(m_buf, len); #if 0 nt::Logger& logger = nt::Logger::GetInstance(); if (logger.min_level() <= NT_LOG_DEBUG4 && logger.HasLogger()) { @@ -67,7 +67,7 @@ class WireDecoder { logger.Log(NT_LOG_DEBUG4, __FILE__, __LINE__, oss.str().c_str()); } #endif - return rv; + return !m_is.has_error(); } /* Reads a single byte. */ diff --git a/wpiutil/include/support/raw_istream.h b/wpiutil/include/support/raw_istream.h index aeca34fe88..9407b94922 100644 --- a/wpiutil/include/support/raw_istream.h +++ b/wpiutil/include/support/raw_istream.h @@ -16,21 +16,37 @@ class raw_istream { public: raw_istream() = default; virtual ~raw_istream() = default; - virtual bool read(void* data, std::size_t len) = 0; + + raw_istream& read(void* data, std::size_t len) { + read_impl(data, len); + return *this; + } + virtual void close() = 0; + bool has_error() const { return m_error; } + void clear_error() { m_error = false; } + raw_istream(const raw_istream&) = delete; raw_istream& operator=(const raw_istream&) = delete; + + protected: + void error_detected() { m_error = true; } + + private: + virtual void read_impl(void* data, std::size_t len) = 0; + + bool m_error = false; }; class raw_mem_istream : public raw_istream { public: raw_mem_istream(const char* mem, std::size_t len) : m_cur(mem), m_left(len) {} - virtual ~raw_mem_istream() = default; - virtual bool read(void* data, std::size_t len); - virtual void close() {} + void close() override; private: + void read_impl(void* data, std::size_t len) override; + const char* m_cur; std::size_t m_left; }; diff --git a/wpiutil/include/support/raw_socket_istream.h b/wpiutil/include/support/raw_socket_istream.h index 78b0517325..ab65f73b29 100644 --- a/wpiutil/include/support/raw_socket_istream.h +++ b/wpiutil/include/support/raw_socket_istream.h @@ -9,19 +9,21 @@ #define WPIUTIL_SUPPORT_RAW_SOCKET_ISTREAM_H_ #include "support/raw_istream.h" -#include "tcpsockets/NetworkStream.h" namespace wpi { +class NetworkStream; + class raw_socket_istream : public raw_istream { public: raw_socket_istream(NetworkStream& stream, int timeout = 0) : m_stream(stream), m_timeout(timeout) {} - virtual ~raw_socket_istream() = default; - virtual bool read(void* data, std::size_t len); - virtual void close(); + + void close() override; private: + void read_impl(void* data, std::size_t len) override; + NetworkStream& m_stream; int m_timeout; }; diff --git a/wpiutil/src/support/leb128.cpp b/wpiutil/src/support/leb128.cpp index 002ee43673..11605bc3d6 100644 --- a/wpiutil/src/support/leb128.cpp +++ b/wpiutil/src/support/leb128.cpp @@ -103,7 +103,8 @@ bool ReadUleb128(raw_istream& is, unsigned long* ret) { while (1) { unsigned char byte; - if (!is.read((char*)&byte, 1)) return false; + is.read((char*)&byte, 1); + if (is.has_error()) return false; result |= (byte & 0x7f) << shift; shift += 7; diff --git a/wpiutil/src/support/raw_istream.cpp b/wpiutil/src/support/raw_istream.cpp index 13af6b97a8..24e8f08b83 100644 --- a/wpiutil/src/support/raw_istream.cpp +++ b/wpiutil/src/support/raw_istream.cpp @@ -11,10 +11,14 @@ using namespace wpi; -bool raw_mem_istream::read(void* data, std::size_t len) { - if (len > m_left) return false; +void raw_mem_istream::close() {} + +void raw_mem_istream::read_impl(void* data, std::size_t len) { + if (len > m_left) { + error_detected(); + return; + } std::memcpy(data, m_cur, len); m_cur += len; m_left -= len; - return true; } diff --git a/wpiutil/src/support/raw_socket_istream.cpp b/wpiutil/src/support/raw_socket_istream.cpp index a4dd1e4d5a..4d311b25b5 100644 --- a/wpiutil/src/support/raw_socket_istream.cpp +++ b/wpiutil/src/support/raw_socket_istream.cpp @@ -6,10 +6,11 @@ /*----------------------------------------------------------------------------*/ #include "support/raw_socket_istream.h" +#include "tcpsockets/NetworkStream.h" using namespace wpi; -bool raw_socket_istream::read(void* data, std::size_t len) { +void raw_socket_istream::read_impl(void* data, std::size_t len) { char* cdata = static_cast(data); std::size_t pos = 0; @@ -17,10 +18,12 @@ bool raw_socket_istream::read(void* data, std::size_t len) { NetworkStream::Error err; std::size_t count = m_stream.receive(&cdata[pos], len - pos, &err, m_timeout); - if (count == 0) return false; + if (count == 0) { + error_detected(); + return; + } pos += count; } - return true; } void raw_socket_istream::close() { m_stream.close(); }