diff options
Diffstat (limited to 'src/base/ostream_ref_data_destination.cc')
-rw-r--r-- | src/base/ostream_ref_data_destination.cc | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/base/ostream_ref_data_destination.cc b/src/base/ostream_ref_data_destination.cc new file mode 100644 index 0000000..3658022 --- /dev/null +++ b/src/base/ostream_ref_data_destination.cc @@ -0,0 +1,44 @@ +#include "image_io/base/ostream_ref_data_destination.h" + +#include "image_io/base/data_range.h" +#include "image_io/base/data_segment.h" + +namespace photos_editing_formats { +namespace image_io { + +using std::ostream; + +void OStreamRefDataDestination::StartTransfer() {} + +DataDestination::TransferStatus OStreamRefDataDestination::Transfer( + const DataRange& transfer_range, const DataSegment& data_segment) { + if (transfer_range.IsValid() && !HasError()) { + size_t bytes_written = 0; + size_t bytes_to_write = transfer_range.GetLength(); + const Byte* buffer = data_segment.GetBuffer(transfer_range.GetBegin()); + if (buffer) { + ostream::pos_type prewrite_pos = ostream_ref_.tellp(); + ostream_ref_.write(reinterpret_cast<const char*>(buffer), bytes_to_write); + ostream::pos_type postwrite_pos = ostream_ref_.tellp(); + if (postwrite_pos != EOF) { + bytes_written = ostream_ref_.tellp() - prewrite_pos; + bytes_transferred_ += bytes_written; + } + } + if (bytes_written != bytes_to_write) { + if (message_handler_) { + message_handler_->ReportMessage(Message::kStdLibError, name_); + } + has_error_ = true; + return kTransferError; + } + } + return kTransferOk; +} + +void OStreamRefDataDestination::FinishTransfer() { + ostream_ref_.flush(); +} + +} // namespace image_io +} // namespace photos_editing_formats |