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