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