diff --git a/include/support/raw_socket_ostream.h b/include/support/raw_socket_ostream.h new file mode 100644 index 0000000000..65793d30ac --- /dev/null +++ b/include/support/raw_socket_ostream.h @@ -0,0 +1,42 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) FIRST 2016. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#ifndef WPIUTIL_SUPPORT_RAW_SOCKET_OSTREAM_H_ +#define WPIUTIL_SUPPORT_RAW_SOCKET_OSTREAM_H_ + +#include "llvm/raw_ostream.h" + +namespace wpi { + +class NetworkStream; + +class raw_socket_ostream : public llvm::raw_ostream { + public: + raw_socket_ostream(NetworkStream& stream, bool shouldClose) + : m_stream(stream), m_shouldClose(shouldClose) {} + ~raw_socket_ostream(); + + void close(); + + bool has_error() const { return m_error; } + void clear_error() { m_error = false; } + + protected: + void error_detected() { m_error = true; } + + private: + void write_impl(const char* data, std::size_t len) override; + uint64_t current_pos() const override; + + NetworkStream& m_stream; + bool m_error = false; + bool m_shouldClose; +}; + +} // namespace wpi + +#endif // WPIUTIL_SUPPORT_RAW_SOCKET_OSTREAM_H_ diff --git a/src/support/raw_socket_ostream.cpp b/src/support/raw_socket_ostream.cpp new file mode 100644 index 0000000000..67bcd8c035 --- /dev/null +++ b/src/support/raw_socket_ostream.cpp @@ -0,0 +1,39 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) FIRST 2015. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "support/raw_socket_ostream.h" +#include "tcpsockets/NetworkStream.h" + +using namespace wpi; + +raw_socket_ostream::~raw_socket_ostream() { + flush(); + if (m_shouldClose) close(); +} + +void raw_socket_ostream::write_impl(const char* data, std::size_t len) { + std::size_t pos = 0; + + while (pos < len) { + NetworkStream::Error err; + std::size_t count = + m_stream.send(&data[pos], len - pos, &err); + if (count == 0) { + error_detected(); + return; + } + pos += count; + } +} + +uint64_t raw_socket_ostream::current_pos() const { return 0; } + +void raw_socket_ostream::close() { + if (!m_shouldClose) return; + flush(); + m_stream.close(); +}