#include "image_io/jpeg/jpeg_xmp_info_builder.h" #include namespace photos_editing_formats { namespace image_io { void JpegXmpInfoBuilder::ProcessSegment(const JpegSegment& segment) { // If the property has not yet been found, look for it, and if found, add the // segment's range to the vector of ranges. size_t extended_xmp_data_begin = segment.GetPayloadDataLocation() + kXmpExtendedHeaderSize; size_t property_value_begin = extended_xmp_data_begin; if (property_segment_ranges_.empty()) { std::string property_name = JpegXmpInfo::GetDataPropertyName(xmp_info_type_); property_value_begin = segment.FindXmpPropertyValueBegin( extended_xmp_data_begin, property_name.c_str()); if (property_value_begin != segment.GetEnd()) { property_segment_ranges_.push_back(segment.GetDataRange()); } } else if (!property_end_segment_range_.IsValid()) { // The start of the property value was encountered in a previous segment - // if the closing quote has not yet been found, then add the segment's range // to the vector or ranges. property_segment_ranges_.push_back(segment.GetDataRange()); } // If the start of the property value has been found but the end has not, look // for the end in this segment. if (!property_segment_ranges_.empty() && !property_end_segment_range_.IsValid()) { size_t property_value_end = segment.FindXmpPropertyValueEnd(property_value_begin); if (property_value_end != segment.GetEnd()) { property_end_segment_range_ = segment.GetDataRange(); } } } } // namespace image_io } // namespace photos_editing_formats