Home | History | Annotate | Download | only in base
      1 #ifndef IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_  // NOLINT
      2 #define IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_  // NOLINT
      3 
      4 #include "image_io/base/data_destination.h"
      5 #include "image_io/base/data_range.h"
      6 
      7 namespace photos_editing_formats {
      8 namespace image_io {
      9 
     10 /// A DataDestination that tracks the transfer_range values as they are passed
     11 /// from the caller of the Transfer() function to next DataDestination.
     12 /// Instances of this class can be used to track the number of bytes transferred
     13 /// and/or to ensure that multiple calls to the Transfer() function are called
     14 /// with transfer_range values that join in a end-to-begin fashion. This data
     15 /// can be used to make sure that the data transferred meets the expectations of
     16 /// the client.
     17 class DataRangeTrackingDestination : public DataDestination {
     18  public:
     19   /// @param destination The DataDestination that is next in the chain, or
     20   ///     nullptr if there is no destination.
     21   explicit DataRangeTrackingDestination(DataDestination* destination)
     22       : destination_(destination),
     23         bytes_transferred_(0),
     24         has_disjoint_transfer_ranges_(false) {}
     25 
     26   /// @return The number of bytes written to the data destination. Bytes are
     27   /// considered "written" even if the next destination is a nullptr.
     28   size_t GetBytesTransferred() const override { return bytes_transferred_; }
     29 
     30   /// @return The tracked data range (see the class comment for how this value
     31   ///     is computed).
     32   const DataRange& GetTrackedDataRange() const { return tracked_data_range_; }
     33 
     34   /// @return Whether disjoint transfer data ranges were detected by the
     35   ///     Transfer() function. Disjoint transfer ranges occur when two calls
     36   ///     to the Transfer() function occur where first_range.GetEnd() is not
     37   ////    equal to the second_range.GetBegin().
     38   bool HasDisjointTransferRanges() const {
     39     return has_disjoint_transfer_ranges_;
     40   }
     41 
     42   void StartTransfer() override;
     43   TransferStatus Transfer(const DataRange& transfer_range,
     44                           const DataSegment& data_segment) override;
     45   void FinishTransfer() override;
     46 
     47  private:
     48   DataDestination* destination_;
     49   DataRange tracked_data_range_;
     50   size_t bytes_transferred_;
     51   bool has_disjoint_transfer_ranges_;
     52 };
     53 
     54 }  // namespace image_io
     55 }  // namespace photos_editing_formats
     56 
     57 #endif // IMAGE_IO_BASE_DATA_RANGE_TRACKING_DESTINATION_H_  // NOLINT
     58