In lieu of dropping in next release. We needed this in order to write
some unit-tests for exifcommon functionality, and this is common
functionality anyway (by any definition of common thus far).
- common/ifd.go: Added NewIfdIdentityFromString. The above allowed us to
cover this with unit-tests.
- This was required for go-exif-knife, to get IFD-paths from the
command-line.
This allows us to pass around individual tokens that we can use to
generate IDs, names, and qualified and non-qualified IFD paths, rather
than [necessarily] having to pass or store them individually.
The previous global variables were strings. Now they are IfdIdentity structs
and have been renamed to be more accurate (in general, as well as for this).
The previous variables have been kept but are now just assigned to the newer
variables. This is backwards-compatibility that will be removed in the future.
We now keep track of the further offset that we have accessed (though
not necessarily the furthest offset of data that is unparseable by us).
It sometimes supports debugging efforts to have a ballpark idea of how
much EXIF data there is, rather than just "from the signature to the
end of the file" or however big the EXIF container is in the enclosing
image format. The latter can be buggy or ambiguous.
- Added `SearchAndExtractExifWithReader()`.
- `SearchFileAndExtractExif()` now calls `SearchAndExtractExifWithReader()`
instead of reading the whole image first.
Fixes#34
Relates to optimizations in df264b3 as well.
They'll also now embed all of the information they need to know since it
is all known where the ITEs are created. This prevents the user from
having to be involved in it. This makes it much more straightforward and
enjoyable to use.
- ifd_tag_entry.go
- newIfdTagEntry now takes and embeds `addressableBytes` and
`byteOrder`.
- We've dumped the `value` member that let the caller preload a parsed
value (or bytes?). It's no longer necessary since this led to
inconsistencies and the ITE can produce these values directly, now.
- `Value()` obviously no longer takes `addressableValue` and
`byteOrder` since now embedded.
- `Value()` will now see and return ErrUnhandledUnknownTypedTag
directly (not wrapping it, since this is a handled case).
- common/type.go: FormatFromType now uses Stringer as a fallback if
possible. All undefined-tag wrapper types implement it, so the same
function can handle both undefined and non-undefined values, and the
individual types can control the strings presented in simple listing.
- Dropped "resolveValue" parameters from all of the collect, visit, and
parsing functions. Resolution is now a later step performed by the
caller on the ITEs, directly.
- This parameter was protection against undefined-type values
disrupting simple enumeration, but now the user can simply produce
the list of tags and can either choose to decode their value or not,
directly. If they do, they, as of earlier, recent commits, also have
the ability to properly manage unhandled undefined-values so they
don't crash.
- The ITEs can now create ValueContext structs directly
(GetValueContext()), though it might not be necessary now that the
ITEs can produce the values and encodings directly.
- This also allowed us to dump several other GetValueContext()
implementations elsewhere since it is now self-reliant on this type
and those methods were essentially kludges for the lack of this.
- Dump a bunch of "Value" methods from ITEs which just weren't useful or
simple enough. Replaced by the above.
- Fixed `(Ifd).String()` to have a pointer receiver.