| #ifndef IMAGE_IO_BASE_DATA_DESTINATION_H_ // NOLINT |
| #define IMAGE_IO_BASE_DATA_DESTINATION_H_ // NOLINT |
| |
| #include "image_io/base/data_range.h" |
| #include "image_io/base/data_segment.h" |
| #include "image_io/base/types.h" |
| |
| namespace photos_editing_formats { |
| namespace image_io { |
| |
| /// DataDestination is the abstract base class for implementations that can |
| /// efficiently move data from one location and/or form to another. In such |
| /// a transfer, the StartTransfer() and FinishTransfer() functions are always |
| /// called, and in between the Transfer() function may be called zero or more |
| /// times. See the DataSource class to see how to initiate a transfer operation. |
| class DataDestination { |
| public: |
| /// These values indicate what should be done after a DataSource calls a |
| /// DataDestination's Transfer() function. |
| enum TransferStatus { |
| /// An error occurred in the transfer process. DataSource's TransferData() |
| /// function should stop calling DataDestination's Transfer() function, and |
| /// return to its caller. |
| kTransferError, |
| |
| /// The transfer was successful. DataSource's TransferData() function can |
| /// keep calling DataDestination's Transfer() of needed, or if not, |
| /// return to its caller. |
| kTransferOk, |
| |
| /// The transfer was successful and the DataDestination has decided that |
| /// it has enough data. DataSource's TransferData() function should stop |
| /// calling DataDestination's Transfer() function and return to its caller. |
| kTransferDone |
| }; |
| |
| virtual ~DataDestination() = default; |
| |
| /// This function is called prior to the first call to the Transfer() function |
| /// to allow implementation subclasses a chance to initialize their data |
| /// members for the transfer process. If a data destination sends its bytes |
| /// to another data destination, this function must call its StartTransfer() |
| /// function. |
| virtual void StartTransfer() = 0; |
| |
| /// This function is called to transfer a portion or all of the data in the |
| /// data segment from the caller to wherever the receiver needs it to go. |
| /// @param transfer_range The portion of the data in the data_segment that is |
| /// to be transferred. |
| /// @param data_segment The data, some or all of which is to be transferred. |
| /// @return A transfer status value indicating what should be done next. |
| virtual TransferStatus Transfer(const DataRange& transfer_range, |
| const DataSegment& data_segment) = 0; |
| |
| /// This function is called after the final call to the Transfer() function to |
| /// allow implementation subclasses a chance to finalize their transfer |
| /// operations. If a data destination sends its bytes to another data |
| /// destination, this function must call its FinishTransfer() function. |
| virtual void FinishTransfer() = 0; |
| |
| /// @return The number of bytes written to the data destination. There is some |
| /// flexibility in the actual value returned. Most "end-point" destination |
| /// subclasses return the actual number of bytes received/written. Other |
| /// "mid-point" destinations are allowed to return the value from the next |
| /// destination in the chain, or the actual number of bytes they are asked |
| /// to transfer via the transfer_range parameter of the Transfer() |
| /// function. |
| virtual size_t GetBytesTransferred() const = 0; |
| }; |
| |
| } // namespace image_io |
| } // namespace photos_editing_formats |
| |
| #endif // IMAGE_IO_BASE_DATA_DESTINATION_H_ // NOLINT |