#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(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