blob: 01fbf15af88329a90db990e053706c0c4f8872f1 [file] [log] [blame]
#ifndef IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_ // NOLINT
#define IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_ // NOLINT
#include "image_io/base/data_destination.h"
#include "image_io/base/data_range.h"
namespace photos_editing_formats {
namespace image_io {
/// A DataDestination that tracks the transfer_range values as they are passed
/// from the caller of the Transfer() function to next DataDestination.
/// Instances of this class can be used to track the number of bytes transferred
/// and/or to ensure that multiple calls to the Transfer() function are called
/// with transfer_range values that join in a end-to-begin fashion. This data
/// can be used to make sure that the data transferred meets the expectations of
/// the client.
class DataRangeTrackingDestination : public DataDestination {
public:
/// @param destination The DataDestination that is next in the chain, or
/// nullptr if there is no destination.
explicit DataRangeTrackingDestination(DataDestination* destination)
: destination_(destination),
bytes_transferred_(0),
has_disjoint_transfer_ranges_(false) {}
/// @return The number of bytes written to the data destination. Bytes are
/// considered "written" even if the next destination is a nullptr.
size_t GetBytesTransferred() const override { return bytes_transferred_; }
/// @return The tracked data range (see the class comment for how this value
/// is computed).
const DataRange& GetTrackedDataRange() const { return tracked_data_range_; }
/// @return Whether disjoint transfer data ranges were detected by the
/// Transfer() function. Disjoint transfer ranges occur when two calls
/// to the Transfer() function occur where first_range.GetEnd() is not
//// equal to the second_range.GetBegin().
bool HasDisjointTransferRanges() const {
return has_disjoint_transfer_ranges_;
}
void StartTransfer() override;
TransferStatus Transfer(const DataRange& transfer_range,
const DataSegment& data_segment) override;
void FinishTransfer() override;
private:
DataDestination* destination_;
DataRange tracked_data_range_;
size_t bytes_transferred_;
bool has_disjoint_transfer_ranges_;
};
} // namespace image_io
} // namespace photos_editing_formats
#endif // IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_ // NOLINT