diff --git a/v3/exif-read-tool/main.go b/v3/exif-read-tool/main.go index 275ba85..aec752c 100644 --- a/v3/exif-read-tool/main.go +++ b/v3/exif-read-tool/main.go @@ -106,7 +106,7 @@ func main() { // Run the parse. - entries, err := exif.GetFlatExifData(rawExif) + entries, _, err := exif.GetFlatExifData(rawExif, nil) log.PanicIf(err) // Write the thumbnail is requested and present. diff --git a/v3/exif.go b/v3/exif.go index 607b88b..bc392a7 100644 --- a/v3/exif.go +++ b/v3/exif.go @@ -192,7 +192,7 @@ func ParseExifHeader(data []byte) (eh ExifHeader, err error) { } // Visit recursively invokes a callback for every tag. -func Visit(rootIfdIdentity *exifcommon.IfdIdentity, ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []byte, visitor TagVisitorFn) (eh ExifHeader, furthestOffset uint32, err error) { +func Visit(rootIfdIdentity *exifcommon.IfdIdentity, ifdMapping *exifcommon.IfdMapping, tagIndex *TagIndex, exifData []byte, visitor TagVisitorFn, so *ScanOptions) (eh ExifHeader, furthestOffset uint32, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) @@ -205,7 +205,7 @@ func Visit(rootIfdIdentity *exifcommon.IfdIdentity, ifdMapping *exifcommon.IfdMa ebs := NewExifReadSeekerWithBytes(exifData) ie := NewIfdEnumerate(ifdMapping, tagIndex, ebs, eh.ByteOrder) - _, err = ie.Scan(rootIfdIdentity, eh.FirstIfdOffset, visitor) + _, err = ie.Scan(rootIfdIdentity, eh.FirstIfdOffset, visitor, so) log.PanicIf(err) furthestOffset = ie.FurthestOffset() diff --git a/v3/exif_test.go b/v3/exif_test.go index 410c51e..b9343c1 100644 --- a/v3/exif_test.go +++ b/v3/exif_test.go @@ -98,7 +98,7 @@ func TestVisit(t *testing.T) { return nil } - _, furthestOffset, err := Visit(exifcommon.IfdStandardIfdIdentity, im, ti, data[foundAt:], visitor) + _, furthestOffset, err := Visit(exifcommon.IfdStandardIfdIdentity, im, ti, data[foundAt:], visitor, nil) log.PanicIf(err) if furthestOffset != 32935 { diff --git a/v3/ifd_enumerate.go b/v3/ifd_enumerate.go index 6097543..080b597 100644 --- a/v3/ifd_enumerate.go +++ b/v3/ifd_enumerate.go @@ -597,9 +597,14 @@ func (med *MiscellaneousExifData) UnknownTags() map[exifcommon.BasicTag]exifcomm return med.unknownTags } +// ScanOptions tweaks parser behavior/choices. +type ScanOptions struct { + // NOTE(dustin): Reserved for future usage. +} + // Scan enumerates the different EXIF blocks (called IFDs). `rootIfdName` will // be "IFD" in the TIFF standard. -func (ie *IfdEnumerate) Scan(iiRoot *exifcommon.IfdIdentity, ifdOffset uint32, visitor TagVisitorFn) (med *MiscellaneousExifData, err error) { +func (ie *IfdEnumerate) Scan(iiRoot *exifcommon.IfdIdentity, ifdOffset uint32, visitor TagVisitorFn, so *ScanOptions) (med *MiscellaneousExifData, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) diff --git a/v3/utility.go b/v3/utility.go index fe31082..78c0cfd 100644 --- a/v3/utility.go +++ b/v3/utility.go @@ -68,10 +68,8 @@ func (et ExifTag) String() string { len(et.ValueBytes), et.ChildIfdPath) } -// RELEASE(dustin): In the next release, add an options struct to Scan() and GetFlatExifData(), and put the MiscellaneousExifData in the return. - // GetFlatExifData returns a simple, flat representation of all tags. -func GetFlatExifData(exifData []byte) (exifTags []ExifTag, err error) { +func GetFlatExifData(exifData []byte, so *ScanOptions) (exifTags []ExifTag, med *MiscellaneousExifData, err error) { defer func() { if state := recover(); state != nil { err = log.Wrap(state.(error)) @@ -137,10 +135,10 @@ func GetFlatExifData(exifData []byte) (exifTags []ExifTag, err error) { return nil } - _, err = ie.Scan(exifcommon.IfdStandardIfdIdentity, eh.FirstIfdOffset, visitor) + med, err = ie.Scan(exifcommon.IfdStandardIfdIdentity, eh.FirstIfdOffset, visitor, nil) log.PanicIf(err) - return exifTags, nil + return exifTags, med, nil } // GpsDegreesEquals returns true if the two `GpsDegrees` are identical.