blob: 98e5b06ead5a4b59efd9a5254668ba19a3945836 [file] [log] [blame]
#include "image_io/base/data_range_tracking_destination.h"
namespace photos_editing_formats {
namespace image_io {
void DataRangeTrackingDestination::StartTransfer() {
tracked_data_range_ = DataRange();
bytes_transferred_ = 0;
has_disjoint_transfer_ranges_ = false;
if (destination_ != nullptr) {
destination_->StartTransfer();
}
}
DataDestination::TransferStatus DataRangeTrackingDestination::Transfer(
const DataRange& transfer_range, const DataSegment& data_segment) {
DataDestination::TransferStatus transfer_status =
destination_ ? destination_->Transfer(transfer_range, data_segment)
: DataDestination::kTransferOk;
if (transfer_status != kTransferError) {
bytes_transferred_ += transfer_range.GetLength();
}
if (has_disjoint_transfer_ranges_) {
return transfer_status;
}
if (!tracked_data_range_.IsValid()) {
tracked_data_range_ = transfer_range;
return transfer_status;
}
if (tracked_data_range_.GetEnd() == transfer_range.GetBegin()) {
tracked_data_range_ =
DataRange(tracked_data_range_.GetBegin(), transfer_range.GetEnd());
return transfer_status;
} else {
has_disjoint_transfer_ranges_ = true;
return transfer_status;
}
}
void DataRangeTrackingDestination::FinishTransfer() {
if (destination_ != nullptr) {
destination_->FinishTransfer();
}
}
} // namespace image_io
} // namespace photos_editing_formats