diff options
Diffstat (limited to 'src/base/data_range_tracking_destination.cc')
-rw-r--r-- | src/base/data_range_tracking_destination.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/base/data_range_tracking_destination.cc b/src/base/data_range_tracking_destination.cc new file mode 100644 index 0000000..98e5b06 --- /dev/null +++ b/src/base/data_range_tracking_destination.cc @@ -0,0 +1,47 @@ +#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 |