third_party.pigweed.src/pw_stream/std_file_stream.cc
Alexei Frolov fad8e85548 pw_transfer: Use files in integration tests
This updates pw_transfer's integration tests to use local files as
transfer targets. This makes it simpler to coordinate between C++ and
Python and verify the results of transfer operations.

As part of this, a stream reader and writer that operate on files using
the C++ standard library are added to pw_stream.

Change-Id: I93efe3526ea9569b2f67a371fc89872cca0492a8
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/57342
Commit-Queue: Alexei Frolov <frolv@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
2021-09-02 20:29:26 +00:00

73 lines
1.9 KiB
C++

// Copyright 2021 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#include "pw_stream/std_file_stream.h"
namespace pw::stream {
namespace {
std::ios::seekdir WhenceToSeekDir(Stream::Whence whence) {
switch (whence) {
case Stream::Whence::kBeginning:
return std::ios::beg;
case Stream::Whence::kCurrent:
return std::ios::cur;
case Stream::Whence::kEnd:
return std::ios::end;
}
}
} // namespace
StatusWithSize StdFileReader::DoRead(ByteSpan dest) {
if (stream_.eof()) {
return StatusWithSize::OutOfRange();
}
stream_.read(reinterpret_cast<char*>(dest.data()), dest.size());
if (stream_.bad()) {
return StatusWithSize::Unknown();
}
return StatusWithSize(stream_.gcount());
}
Status StdFileReader::DoSeek(ssize_t offset, Whence origin) {
if (!stream_.seekg(offset, WhenceToSeekDir(origin))) {
return Status::Unknown();
}
return OkStatus();
}
Status StdFileWriter::DoWrite(ConstByteSpan data) {
if (stream_.eof()) {
return Status::OutOfRange();
}
if (stream_.write(reinterpret_cast<const char*>(data.data()), data.size())) {
return OkStatus();
}
return Status::Unknown();
}
Status StdFileWriter::DoSeek(ssize_t offset, Whence origin) {
if (!stream_.seekp(offset, WhenceToSeekDir(origin))) {
return Status::Unknown();
}
return OkStatus();
}
} // namespace pw::stream