Make FileRotatingStream independent of StreamInterface
Bug: webrtc:7811
Change-Id: Ia5c07ad00e90d5b982750004eeb2c8e1cfbae4eb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/212969
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33579}
diff --git a/rtc_base/file_rotating_stream.cc b/rtc_base/file_rotating_stream.cc
index 826e674..b7d64ba 100644
--- a/rtc_base/file_rotating_stream.cc
+++ b/rtc_base/file_rotating_stream.cc
@@ -193,49 +193,40 @@
FileRotatingStream::~FileRotatingStream() {}
-StreamState FileRotatingStream::GetState() const {
- return (file_.is_open() ? SS_OPEN : SS_CLOSED);
+bool FileRotatingStream::IsOpen() const {
+ return file_.is_open();
}
-StreamResult FileRotatingStream::Read(void* buffer,
- size_t buffer_len,
- size_t* read,
- int* error) {
- RTC_DCHECK(buffer);
- RTC_NOTREACHED();
- return SR_EOS;
-}
-
-StreamResult FileRotatingStream::Write(const void* data,
- size_t data_len,
- size_t* written,
- int* error) {
+bool FileRotatingStream::Write(const void* data, size_t data_len) {
if (!file_.is_open()) {
std::fprintf(stderr, "Open() must be called before Write.\n");
- return SR_ERROR;
+ return false;
}
- // Write as much as will fit in to the current file.
- RTC_DCHECK_LT(current_bytes_written_, max_file_size_);
- size_t remaining_bytes = max_file_size_ - current_bytes_written_;
- size_t write_length = std::min(data_len, remaining_bytes);
+ while (data_len > 0) {
+ // Write as much as will fit in to the current file.
+ RTC_DCHECK_LT(current_bytes_written_, max_file_size_);
+ size_t remaining_bytes = max_file_size_ - current_bytes_written_;
+ size_t write_length = std::min(data_len, remaining_bytes);
- if (!file_.Write(data, write_length)) {
- return SR_ERROR;
- }
- if (disable_buffering_ && !file_.Flush()) {
- return SR_ERROR;
- }
+ if (!file_.Write(data, write_length)) {
+ return false;
+ }
+ if (disable_buffering_ && !file_.Flush()) {
+ return false;
+ }
- current_bytes_written_ += write_length;
- if (written) {
- *written = write_length;
+ current_bytes_written_ += write_length;
+
+ // If we're done with this file, rotate it out.
+ if (current_bytes_written_ >= max_file_size_) {
+ RTC_DCHECK_EQ(current_bytes_written_, max_file_size_);
+ RotateFiles();
+ }
+ data_len -= write_length;
+ data =
+ static_cast<const void*>(static_cast<const char*>(data) + write_length);
}
- // If we're done with this file, rotate it out.
- if (current_bytes_written_ >= max_file_size_) {
- RTC_DCHECK_EQ(current_bytes_written_, max_file_size_);
- RotateFiles();
- }
- return SR_SUCCESS;
+ return true;
}
bool FileRotatingStream::Flush() {
diff --git a/rtc_base/file_rotating_stream.h b/rtc_base/file_rotating_stream.h
index 117cf20..5826a81 100644
--- a/rtc_base/file_rotating_stream.h
+++ b/rtc_base/file_rotating_stream.h
@@ -27,13 +27,8 @@
// constructor. It rotates the files once the current file is full. The
// individual file size and the number of files used is configurable in the
// constructor. Open() must be called before using this stream.
-class FileRotatingStream : public StreamInterface {
+class FileRotatingStream {
public:
- // Use this constructor for reading a directory previously written to with
- // this stream.
- FileRotatingStream(const std::string& dir_path,
- const std::string& file_prefix);
-
// Use this constructor for writing to a directory. Files in the directory
// matching the prefix will be deleted on open.
FileRotatingStream(const std::string& dir_path,
@@ -41,20 +36,13 @@
size_t max_file_size,
size_t num_files);
- ~FileRotatingStream() override;
+ virtual ~FileRotatingStream();
- // StreamInterface methods.
- StreamState GetState() const override;
- StreamResult Read(void* buffer,
- size_t buffer_len,
- size_t* read,
- int* error) override;
- StreamResult Write(const void* data,
- size_t data_len,
- size_t* written,
- int* error) override;
- bool Flush() override;
- void Close() override;
+ bool IsOpen() const;
+
+ bool Write(const void* data, size_t data_len);
+ bool Flush();
+ void Close();
// Opens the appropriate file(s). Call this before using the stream.
bool Open();
@@ -63,6 +51,8 @@
// enabled by default for performance.
bool DisableBuffering();
+ // Below two methods are public for testing only.
+
// Returns the path used for the i-th newest file, where the 0th file is the
// newest file. The file may or may not exist, this is just used for
// formatting. Index must be less than GetNumFiles().
@@ -72,8 +62,6 @@
size_t GetNumFiles() const { return file_names_.size(); }
protected:
- size_t GetMaxFileSize() const { return max_file_size_; }
-
void SetMaxFileSize(size_t size) { max_file_size_ = size; }
size_t GetRotationIndex() const { return rotation_index_; }
diff --git a/rtc_base/file_rotating_stream_unittest.cc b/rtc_base/file_rotating_stream_unittest.cc
index c2ba067..4718b6f 100644
--- a/rtc_base/file_rotating_stream_unittest.cc
+++ b/rtc_base/file_rotating_stream_unittest.cc
@@ -72,7 +72,7 @@
// Writes the data to the stream and flushes it.
void WriteAndFlush(const void* data, const size_t data_len) {
- EXPECT_EQ(SR_SUCCESS, stream_->WriteAll(data, data_len, nullptr, nullptr));
+ EXPECT_EQ(SR_SUCCESS, stream_->Write(data, data_len));
EXPECT_TRUE(stream_->Flush());
}
@@ -114,11 +114,11 @@
TEST_F(MAYBE_FileRotatingStreamTest, State) {
Init("FileRotatingStreamTestState", kFilePrefix, kMaxFileSize, 3);
- EXPECT_EQ(SS_CLOSED, stream_->GetState());
+ EXPECT_FALSE(stream_->IsOpen());
ASSERT_TRUE(stream_->Open());
- EXPECT_EQ(SS_OPEN, stream_->GetState());
+ EXPECT_TRUE(stream_->IsOpen());
stream_->Close();
- EXPECT_EQ(SS_CLOSED, stream_->GetState());
+ EXPECT_FALSE(stream_->IsOpen());
}
// Tests that nothing is written to file when data of length zero is written.
@@ -277,7 +277,7 @@
// Writes the data to the stream and flushes it.
void WriteAndFlush(const void* data, const size_t data_len) {
- EXPECT_EQ(SR_SUCCESS, stream_->WriteAll(data, data_len, nullptr, nullptr));
+ EXPECT_TRUE(stream_->Write(data, data_len));
EXPECT_TRUE(stream_->Flush());
}
@@ -334,8 +334,7 @@
std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
for (int i = 0; i < 8; i++) {
memset(buffer.get(), i, buffer_size);
- EXPECT_EQ(SR_SUCCESS,
- stream_->WriteAll(buffer.get(), buffer_size, nullptr, nullptr));
+ EXPECT_EQ(SR_SUCCESS, stream_->Write(buffer.get(), buffer_size));
}
const int expected_vals[] = {0, 1, 2, 6, 7};
@@ -369,8 +368,7 @@
std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
for (int i = 0; i < 2; i++) {
memset(buffer.get(), i, buffer_size);
- EXPECT_EQ(SR_SUCCESS,
- stream_->WriteAll(buffer.get(), buffer_size, nullptr, nullptr));
+ EXPECT_EQ(SR_SUCCESS, stream_->Write(buffer.get(), buffer_size));
}
const int expected_vals[] = {0, 1};
diff --git a/rtc_base/log_sinks.cc b/rtc_base/log_sinks.cc
index a3019b9..4365142 100644
--- a/rtc_base/log_sinks.cc
+++ b/rtc_base/log_sinks.cc
@@ -16,7 +16,6 @@
#include <string>
#include "rtc_base/checks.h"
-#include "rtc_base/stream.h"
namespace rtc {
@@ -37,23 +36,23 @@
FileRotatingLogSink::~FileRotatingLogSink() {}
void FileRotatingLogSink::OnLogMessage(const std::string& message) {
- if (stream_->GetState() != SS_OPEN) {
+ if (!stream_->IsOpen()) {
std::fprintf(stderr, "Init() must be called before adding this sink.\n");
return;
}
- stream_->WriteAll(message.c_str(), message.size(), nullptr, nullptr);
+ stream_->Write(message.c_str(), message.size());
}
void FileRotatingLogSink::OnLogMessage(const std::string& message,
LoggingSeverity sev,
const char* tag) {
- if (stream_->GetState() != SS_OPEN) {
+ if (!stream_->IsOpen()) {
std::fprintf(stderr, "Init() must be called before adding this sink.\n");
return;
}
- stream_->WriteAll(tag, strlen(tag), nullptr, nullptr);
- stream_->WriteAll(": ", 2, nullptr, nullptr);
- stream_->WriteAll(message.c_str(), message.size(), nullptr, nullptr);
+ stream_->Write(tag, strlen(tag));
+ stream_->Write(": ", 2);
+ stream_->Write(message.c_str(), message.size());
}
bool FileRotatingLogSink::Init() {