From dd4c4068d9f17cc17b26f03a968535e193c59123 Mon Sep 17 00:00:00 2001 From: Harald Alvestrand Date: Wed, 16 Nov 2022 07:29:57 +0000 Subject: [PATCH] Convert MemoryStream to use new StreamInterface Bug: webrtc:14632 Change-Id: Id6a7e011a6102e829a14de246d07a9aab1e6934f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/283620 Commit-Queue: Harald Alvestrand Reviewed-by: Tomas Gunnarsson Cr-Commit-Position: refs/heads/main@{#38639} --- p2p/base/pseudo_tcp_unittest.cc | 54 ++++++++++++++++++------- rtc_base/memory_stream.cc | 38 +++++++++-------- rtc_base/memory_stream.h | 14 +++---- rtc_base/ssl_stream_adapter_unittest.cc | 15 ++++--- 4 files changed, 73 insertions(+), 48 deletions(-) diff --git a/p2p/base/pseudo_tcp_unittest.cc b/p2p/base/pseudo_tcp_unittest.cc index debddb217e..e56c6fa2c5 100644 --- a/p2p/base/pseudo_tcp_unittest.cc +++ b/p2p/base/pseudo_tcp_unittest.cc @@ -232,8 +232,10 @@ class PseudoTcpTest : public PseudoTcpTestBase { // Create some dummy data to send. send_stream_.ReserveSize(size); for (int i = 0; i < size; ++i) { - char ch = static_cast(i); - send_stream_.Write(&ch, 1, NULL, NULL); + uint8_t ch = static_cast(i); + size_t written; + int error; + send_stream_.Write(rtc::MakeArrayView(&ch, 1), written, error); } send_stream_.Rewind(); // Prepare the receive stream. @@ -296,7 +298,11 @@ class PseudoTcpTest : public PseudoTcpTestBase { do { rcvd = remote_.Recv(block, sizeof(block)); if (rcvd != -1) { - recv_stream_.Write(block, rcvd, NULL, NULL); + size_t written; + int error; + recv_stream_.Write( + rtc::MakeArrayView(reinterpret_cast(block), rcvd), + written, error); recv_stream_.GetPosition(&position); RTC_LOG(LS_VERBOSE) << "Received: " << position; } @@ -308,8 +314,10 @@ class PseudoTcpTest : public PseudoTcpTestBase { char block[kBlockSize]; do { send_stream_.GetPosition(&position); - if (send_stream_.Read(block, sizeof(block), &tosend, NULL) != - rtc::SR_EOS) { + int error; + if (send_stream_.Read( + rtc::MakeArrayView(reinterpret_cast(block), kBlockSize), + tosend, error) != rtc::SR_EOS) { sent = local_.Send(block, tosend); UpdateLocalClock(); if (sent != -1) { @@ -347,8 +355,10 @@ class PseudoTcpTestPingPong : public PseudoTcpTestBase { // Create some dummy data to send. send_stream_.ReserveSize(size); for (int i = 0; i < size; ++i) { - char ch = static_cast(i); - send_stream_.Write(&ch, 1, NULL, NULL); + uint8_t ch = static_cast(i); + size_t written; + int error; + send_stream_.Write(rtc::MakeArrayView(&ch, 1), written, error); } send_stream_.Rewind(); // Prepare the receive stream. @@ -411,7 +421,11 @@ class PseudoTcpTestPingPong : public PseudoTcpTestBase { do { rcvd = receiver_->Recv(block, sizeof(block)); if (rcvd != -1) { - recv_stream_.Write(block, rcvd, NULL, NULL); + size_t written; + int error; + recv_stream_.Write( + rtc::MakeArrayView(reinterpret_cast(block), rcvd), + written, error); recv_stream_.GetPosition(&position); RTC_LOG(LS_VERBOSE) << "Received: " << position; } @@ -424,7 +438,10 @@ class PseudoTcpTestPingPong : public PseudoTcpTestBase { do { send_stream_.GetPosition(&position); tosend = bytes_per_send_ ? bytes_per_send_ : sizeof(block); - if (send_stream_.Read(block, tosend, &tosend, NULL) != rtc::SR_EOS) { + int error; + if (send_stream_.Read( + rtc::MakeArrayView(reinterpret_cast(block), tosend), + tosend, error) != rtc::SR_EOS) { sent = sender_->Send(block, tosend); UpdateLocalClock(); if (sent != -1) { @@ -458,8 +475,10 @@ class PseudoTcpTestReceiveWindow : public PseudoTcpTestBase { // Create some dummy data to send. send_stream_.ReserveSize(size); for (int i = 0; i < size; ++i) { - char ch = static_cast(i); - send_stream_.Write(&ch, 1, NULL, NULL); + uint8_t ch = static_cast(i); + size_t written; + int error; + send_stream_.Write(rtc::MakeArrayView(&ch, 1), written, error); } send_stream_.Rewind(); @@ -510,7 +529,11 @@ class PseudoTcpTestReceiveWindow : public PseudoTcpTestBase { do { rcvd = remote_.Recv(block, sizeof(block)); if (rcvd != -1) { - recv_stream_.Write(block, rcvd, NULL, NULL); + size_t written; + int error; + recv_stream_.Write( + rtc::MakeArrayView(reinterpret_cast(block), rcvd), + written, error); recv_stream_.GetPosition(&position); RTC_LOG(LS_VERBOSE) << "Received: " << position; } @@ -534,8 +557,11 @@ class PseudoTcpTestReceiveWindow : public PseudoTcpTestBase { char block[kBlockSize]; do { send_stream_.GetPosition(&position); - if (send_stream_.Read(block, sizeof(block), &tosend, NULL) != - rtc::SR_EOS) { + int error; + if (send_stream_.Read( + rtc::MakeArrayView(reinterpret_cast(block), + sizeof(block)), + tosend, error) != rtc::SR_EOS) { sent = local_.Send(block, tosend); UpdateLocalClock(); if (sent != -1) { diff --git a/rtc_base/memory_stream.cc b/rtc_base/memory_stream.cc index cbd78ac14a..8ceab7aa9b 100644 --- a/rtc_base/memory_stream.cc +++ b/rtc_base/memory_stream.cc @@ -23,38 +23,37 @@ StreamState MemoryStream::GetState() const { return SS_OPEN; } -StreamResult MemoryStream::Read(void* buffer, - size_t bytes, - size_t* bytes_read, - int* error) { +StreamResult MemoryStream::Read(rtc::ArrayView buffer, + size_t& bytes_read, + int& error) { if (seek_position_ >= data_length_) { return SR_EOS; } size_t available = data_length_ - seek_position_; - if (bytes > available) { + size_t bytes; + if (buffer.size() > available) { // Read partial buffer bytes = available; + } else { + bytes = buffer.size(); } - memcpy(buffer, &buffer_[seek_position_], bytes); + memcpy(buffer.data(), &buffer_[seek_position_], bytes); seek_position_ += bytes; - if (bytes_read) { - *bytes_read = bytes; - } + bytes_read = bytes; return SR_SUCCESS; } -StreamResult MemoryStream::Write(const void* buffer, - size_t bytes, - size_t* bytes_written, - int* error) { +StreamResult MemoryStream::Write(rtc::ArrayView buffer, + size_t& bytes_written, + int& error) { size_t available = buffer_length_ - seek_position_; if (0 == available) { // Increase buffer size to the larger of: // a) new position rounded up to next 256 bytes // b) double the previous length - size_t new_buffer_length = - std::max(((seek_position_ + bytes) | 0xFF) + 1, buffer_length_ * 2); - StreamResult result = DoReserve(new_buffer_length, error); + size_t new_buffer_length = std::max( + ((seek_position_ + buffer.size()) | 0xFF) + 1, buffer_length_ * 2); + StreamResult result = DoReserve(new_buffer_length, &error); if (SR_SUCCESS != result) { return result; } @@ -62,17 +61,16 @@ StreamResult MemoryStream::Write(const void* buffer, available = buffer_length_ - seek_position_; } + size_t bytes = buffer.size(); if (bytes > available) { bytes = available; } - memcpy(&buffer_[seek_position_], buffer, bytes); + memcpy(&buffer_[seek_position_], buffer.data(), bytes); seek_position_ += bytes; if (data_length_ < seek_position_) { data_length_ = seek_position_; } - if (bytes_written) { - *bytes_written = bytes; - } + bytes_written = bytes; return SR_SUCCESS; } diff --git a/rtc_base/memory_stream.h b/rtc_base/memory_stream.h index 7deb4b3006..07e07f0694 100644 --- a/rtc_base/memory_stream.h +++ b/rtc_base/memory_stream.h @@ -25,14 +25,12 @@ class MemoryStream final : public StreamInterface { ~MemoryStream() override; StreamState GetState() const override; - StreamResult Read(void* buffer, - size_t bytes, - size_t* bytes_read, - int* error) override; - StreamResult Write(const void* buffer, - size_t bytes, - size_t* bytes_written, - int* error) override; + StreamResult Read(rtc::ArrayView buffer, + size_t& bytes_read, + int& error) override; + StreamResult Write(rtc::ArrayView buffer, + size_t& bytes_written, + int& error) override; void Close() override; bool GetSize(size_t* size) const; bool ReserveSize(size_t size); diff --git a/rtc_base/ssl_stream_adapter_unittest.cc b/rtc_base/ssl_stream_adapter_unittest.cc index f8a015dc04..6736f31b10 100644 --- a/rtc_base/ssl_stream_adapter_unittest.cc +++ b/rtc_base/ssl_stream_adapter_unittest.cc @@ -815,8 +815,10 @@ class SSLStreamAdapterTestTLS send_stream_.ReserveSize(size); for (int i = 0; i < size; ++i) { - char ch = static_cast(i); - send_stream_.Write(&ch, 1, nullptr, nullptr); + uint8_t ch = static_cast(i); + size_t written; + int error; + send_stream_.Write(rtc::MakeArrayView(&ch, 1), written, error); } send_stream_.Rewind(); @@ -849,8 +851,8 @@ class SSLStreamAdapterTestTLS for (;;) { send_stream_.GetPosition(&position); - if (send_stream_.Read(block, sizeof(block), &tosend, nullptr) != - rtc::SR_EOS) { + int dummy_error; + if (send_stream_.Read(block, tosend, dummy_error) != rtc::SR_EOS) { int error; rv = client_ssl_->Write(rtc::MakeArrayView(block, tosend), sent, error); @@ -895,8 +897,9 @@ class SSLStreamAdapterTestTLS ASSERT_EQ(rtc::SR_SUCCESS, r); RTC_LOG(LS_VERBOSE) << "Read " << bread; - - recv_stream_.Write(buffer, bread, nullptr, nullptr); + size_t written; + int error; + recv_stream_.Write(rtc::MakeArrayView(buffer, bread), written, error); } }