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