Index: webrtc/base/stream.cc |
diff --git a/webrtc/base/stream.cc b/webrtc/base/stream.cc |
index 520d1dd202e59cb29ff92f40dba293b2a28fefb0..67ef104044e3158ebe7cf37bc88b29e296ab36c7 100644 |
--- a/webrtc/base/stream.cc |
+++ b/webrtc/base/stream.cc |
@@ -238,6 +238,61 @@ void StreamAdapterInterface::OnEvent(StreamInterface* stream, |
} |
/////////////////////////////////////////////////////////////////////////////// |
+// StreamTap |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+StreamTap::StreamTap(StreamInterface* stream, StreamInterface* tap) |
+ : StreamAdapterInterface(stream), tap_(), tap_result_(SR_SUCCESS), |
+ tap_error_(0) { |
+ AttachTap(tap); |
+} |
+ |
+StreamTap::~StreamTap() = default; |
+ |
+void StreamTap::AttachTap(StreamInterface* tap) { |
+ tap_.reset(tap); |
+} |
+ |
+StreamInterface* StreamTap::DetachTap() { |
+ return tap_.release(); |
+} |
+ |
+StreamResult StreamTap::GetTapResult(int* error) { |
+ if (error) { |
+ *error = tap_error_; |
+ } |
+ return tap_result_; |
+} |
+ |
+StreamResult StreamTap::Read(void* buffer, size_t buffer_len, |
+ size_t* read, int* error) { |
+ size_t backup_read; |
+ if (!read) { |
+ read = &backup_read; |
+ } |
+ StreamResult res = StreamAdapterInterface::Read(buffer, buffer_len, |
+ read, error); |
+ if ((res == SR_SUCCESS) && (tap_result_ == SR_SUCCESS)) { |
+ tap_result_ = tap_->WriteAll(buffer, *read, nullptr, &tap_error_); |
+ } |
+ return res; |
+} |
+ |
+StreamResult StreamTap::Write(const void* data, size_t data_len, |
+ size_t* written, int* error) { |
+ size_t backup_written; |
+ if (!written) { |
+ written = &backup_written; |
+ } |
+ StreamResult res = StreamAdapterInterface::Write(data, data_len, |
+ written, error); |
+ if ((res == SR_SUCCESS) && (tap_result_ == SR_SUCCESS)) { |
+ tap_result_ = tap_->WriteAll(data, *written, nullptr, &tap_error_); |
+ } |
+ return res; |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
// NullStream |
/////////////////////////////////////////////////////////////////////////////// |
@@ -607,6 +662,24 @@ StreamResult MemoryStream::DoReserve(size_t size, int* error) { |
} |
/////////////////////////////////////////////////////////////////////////////// |
+ |
+ExternalMemoryStream::ExternalMemoryStream() { |
+} |
+ |
+ExternalMemoryStream::ExternalMemoryStream(void* data, size_t length) { |
+ SetData(data, length); |
+} |
+ |
+ExternalMemoryStream::~ExternalMemoryStream() { |
+} |
+ |
+void ExternalMemoryStream::SetData(void* data, size_t length) { |
+ data_length_ = buffer_length_ = length; |
+ buffer_ = static_cast<char*>(data); |
+ seek_position_ = 0; |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
// FifoBuffer |
/////////////////////////////////////////////////////////////////////////////// |
@@ -821,6 +894,66 @@ StreamResult FifoBuffer::WriteOffsetLocked(const void* buffer, |
return SR_SUCCESS; |
} |
+ |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// LoggingAdapter |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+LoggingAdapter::LoggingAdapter(StreamInterface* stream, LoggingSeverity level, |
+ const std::string& label, bool hex_mode) |
+ : StreamAdapterInterface(stream), level_(level), hex_mode_(hex_mode) { |
+ set_label(label); |
+} |
+ |
+void LoggingAdapter::set_label(const std::string& label) { |
+ label_.assign("["); |
+ label_.append(label); |
+ label_.append("]"); |
+} |
+ |
+StreamResult LoggingAdapter::Read(void* buffer, size_t buffer_len, |
+ size_t* read, int* error) { |
+ size_t local_read; if (!read) read = &local_read; |
+ StreamResult result = StreamAdapterInterface::Read(buffer, buffer_len, read, |
+ error); |
+ if (result == SR_SUCCESS) { |
+ LogMultiline(level_, label_.c_str(), true, buffer, *read, hex_mode_, &lms_); |
+ } |
+ return result; |
+} |
+ |
+StreamResult LoggingAdapter::Write(const void* data, size_t data_len, |
+ size_t* written, int* error) { |
+ size_t local_written; |
+ if (!written) written = &local_written; |
+ StreamResult result = StreamAdapterInterface::Write(data, data_len, written, |
+ error); |
+ if (result == SR_SUCCESS) { |
+ LogMultiline(level_, label_.c_str(), false, data, *written, hex_mode_, |
+ &lms_); |
+ } |
+ return result; |
+} |
+ |
+void LoggingAdapter::Close() { |
+ LogMultiline(level_, label_.c_str(), false, nullptr, 0, hex_mode_, &lms_); |
+ LogMultiline(level_, label_.c_str(), true, nullptr, 0, hex_mode_, &lms_); |
+ LOG_V(level_) << label_ << " Closed locally"; |
+ StreamAdapterInterface::Close(); |
+} |
+ |
+void LoggingAdapter::OnEvent(StreamInterface* stream, int events, int err) { |
+ if (events & SE_OPEN) { |
+ LOG_V(level_) << label_ << " Open"; |
+ } else if (events & SE_CLOSE) { |
+ LogMultiline(level_, label_.c_str(), false, nullptr, 0, hex_mode_, &lms_); |
+ LogMultiline(level_, label_.c_str(), true, nullptr, 0, hex_mode_, &lms_); |
+ LOG_V(level_) << label_ << " Closed with error: " << err; |
+ } |
+ StreamAdapterInterface::OnEvent(stream, events, err); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
// StringStream - Reads/Writes to an external std::string |
/////////////////////////////////////////////////////////////////////////////// |
@@ -900,6 +1033,31 @@ bool StringStream::ReserveSize(size_t size) { |
} |
/////////////////////////////////////////////////////////////////////////////// |
+// StreamReference |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+StreamReference::StreamReference(StreamInterface* stream) |
+ : StreamAdapterInterface(stream, false) { |
+ // owner set to false so the destructor does not free the stream. |
+ stream_ref_count_ = new StreamRefCount(stream); |
+} |
+ |
+StreamInterface* StreamReference::NewReference() { |
+ stream_ref_count_->AddReference(); |
+ return new StreamReference(stream_ref_count_, stream()); |
+} |
+ |
+StreamReference::~StreamReference() { |
+ stream_ref_count_->Release(); |
+} |
+ |
+StreamReference::StreamReference(StreamRefCount* stream_ref_count, |
+ StreamInterface* stream) |
+ : StreamAdapterInterface(stream, false), |
+ stream_ref_count_(stream_ref_count) { |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
StreamResult Flow(StreamInterface* source, |
char* buffer, |