blob: 29b16b6491ce54ae4527ea776ae22295bc4accab [file] [log] [blame]
#ifndef IMAGE_IO_JPEG_JPEG_XMP_DATA_EXTRACTOR_H_ // NOLINT
#define IMAGE_IO_JPEG_JPEG_XMP_DATA_EXTRACTOR_H_ // NOLINT
#include "image_io/base/data_destination.h"
#include "image_io/base/message_handler.h"
#include "image_io/jpeg/jpeg_info.h"
namespace photos_editing_formats {
namespace image_io {
/// A class that can make use of the data in a JpegInfo instance to extract
/// the xmp data JpegSegments passed to it and forward it to a DataDestination.
class JpegXmpDataExtractor : public DataDestination {
public:
/// @param xmp_info_type The type of xmp data being extracted.
/// @param segment_count The number of segment ranges over which the xmp
/// data is spread.
/// @param data_destination The destination to which the extracted xmp data
/// is to be sent.
JpegXmpDataExtractor(JpegXmpInfo::Type xmp_info_type, size_t segment_count,
DataDestination* data_destination,
MessageHandler* message_handler)
: xmp_info_type_(xmp_info_type),
last_segment_index_(segment_count - 1),
data_destination_(data_destination),
message_handler_(message_handler),
segment_index_(0),
has_error_(false) {}
/// Set the current segment index to the given value.
/// @param segment_index The index of the segment currently being processed.
void SetSegmentIndex(size_t segment_index) { segment_index_ = segment_index; }
/// @return True if there was an error in the extraction process.
bool HasError() const { return has_error_; }
void StartTransfer() override;
TransferStatus Transfer(const DataRange& transfer_range,
const DataSegment& data_segment) override;
void FinishTransfer() override;
/// @return The number of bytes written not to this extractor destination, but
/// to the next destination. Returns zero if the next destination is null.
size_t GetBytesTransferred() const override {
return data_destination_ ? data_destination_->GetBytesTransferred() : 0;
}
private:
/// The type of xmp data being extracted.
JpegXmpInfo::Type xmp_info_type_;
/// The xmp data require special processing when the last segment is being
/// transferred. This value is the index of the last segment.
size_t last_segment_index_;
/// The DataDestination that the extracted xmp data is sent to.
DataDestination* data_destination_;
/// An optional message handler to write messages to.
MessageHandler* message_handler_;
/// The xmp data is spread over one or more segments in the DataSource. This
/// index tracks which one is being transferred.
size_t segment_index_;
/// A true value indicates that an error occurred in the decoding process.
bool has_error_;
};
} // namespace image_io
} // namespace photos_editing_formats
#endif // IMAGE_IO_JPEG_JPEG_XMP_DATA_EXTRACTOR_H_ // NOLINT