blob: 97915c9b68b7748a660fef4ebedde58bf0da7a9f [file] [log] [blame]
#include "image_io/base/ostream_data_destination.h"
#include "image_io/base/data_range.h"
#include "image_io/base/data_segment.h"
#include "image_io/base/message_handler.h"
namespace photos_editing_formats {
namespace image_io {
using std::ostream;
void OStreamDataDestination::StartTransfer() {}
DataDestination::TransferStatus OStreamDataDestination::Transfer(
const DataRange& transfer_range, const DataSegment& data_segment) {
if (ostream_ && 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_->tellp();
ostream_->write(reinterpret_cast<const char*>(buffer), bytes_to_write);
ostream::pos_type postwrite_pos = ostream_->tellp();
if (postwrite_pos != EOF) {
bytes_written = ostream_->tellp() - prewrite_pos;
bytes_transferred_ += bytes_written;
}
}
if (bytes_written != bytes_to_write) {
MessageHandler::Get()->ReportMessage(Message::kStdLibError, name_);
has_error_ = true;
return kTransferError;
}
}
return kTransferOk;
}
void OStreamDataDestination::FinishTransfer() {
if (ostream_) {
ostream_->flush();
}
}
} // namespace image_io
} // namespace photos_editing_formats