53 Commits

Author SHA1 Message Date
Dustin Oprea
254a6b902a ifd_builder.go: Very minor simplification 2020-01-02 00:01:06 -05:00
Dustin Oprea
9aa2497f7b Revert "type.go: Deinegrated ErrUnhandledUnknownTypedTag"
This reverts commit 4f2f9044e60d16b189cd13acf41089dd83c79c0e.

Reintroduces errors from `UndefinedValue()` when the undefined-type is
unhandled.

- We now just return it rather than panic with it so that we can check
  for it directly rather than use `log.Is()`.

- We've updated the checks across the code accordingly.
2020-01-01 09:05:06 -05:00
Dustin Oprea
439148e767 Add commenting to unknown-type handling 2020-01-01 02:57:34 -05:00
Dustin Oprea
78e9e28053 ifd_enumerate_test.go: Moved and refactored some ITEVR tests to be for ValueContext instead
Per our recent change to deimplement ITEVRs.

- ifd_enumerate_test.go: Fixed some test naming.
- ifd_builder_test.go: Dropped some now-unnecessary implementations of
  ITEVRs.
2020-01-01 02:22:28 -05:00
Dustin Oprea
88612c1cf8 ifd_builder.go: No longer use ITEVRs
This was an early way of resolving tag values that is now obsolete.
`ValueContext` structs should be used, and these, in many cases, should
be able to be constructed from the current context without passing
additional arguments.

- ifd_builder_test.go: Refactors to several tests due to loss of ITEVR support.
- ifd_builder_encode_test.go: Moved test-IB populate to testing_common.go .
- ifd_builder.go: Fixed test naming (in most cases, omitted type name).
2020-01-01 00:16:11 -05:00
Dustin Oprea
9946007f05 ifd_builder.go: Bugfix for incorrectly-sized undefined-value copy
Fixes #14
2019-12-31 18:45:21 -05:00
Dustin Oprea
4f2f9044e6 type.go: Deinegrated ErrUnhandledUnknownTypedTag
Not actually used anywhere.
2019-12-31 07:39:41 -05:00
Dustin Oprea
e5cdeb0aa4 ifd_builder.go: Fix (*IfdBuilder).printTagTree() printing of child IFDs 2019-12-29 20:56:35 -05:00
Dustin Oprea
69821c417f value_context.go: ValueContext now embeds value processing
The upshot of this is that generating a list of type-correct slices or a
string from a tag's value is now stupidly easy.

- Broke parsing into an independent type (parser.go:Parser).

- Moved primary value-processing logic to `ValueContext` so that it
  coexists with the actual data (though as much basic functionality as
  possible is implemented independently and reused here). This
  eliminates extremely ridiculously obtuse usage procedure.

- Deprecated almost all existing TagType functionality (in order to
  distance us from this now-legacy usage pattern). Existing
  functionality maintained for now. We'll drop it when we do the next
  release major.

- `ValueContext` is now passed by reference.
2019-12-29 05:48:34 -05:00
Dustin Oprea
a69c3987eb type.go: Created TagTypePrimitive alias for uint16
Added a `Size()` method to it and decommissioned redundant
`TagTypeSize()` and `(TagType).Size()`.

- ifd_enumerate.go: Moved `ValueContext` definition to
  value_context.go .
2019-12-29 00:03:58 -05:00
Dustin Oprea
483dbacf14 type.go: Bugfix for math with embedded data. Add Format().
- ifd_builder.go
  - `BuilderTag` now embeds `ByteOrder`.
  - `BuilderTag` `String()` now prints value.

- type.go
  - `TagType` `ValueIsEmbedded()` renamed to `valueIsEmbedded()`.
  - Add `readRawEncoded()` method to `TagType`.
  - Add `Format()` method to `TagType` to isolate code for processing
    output strings for all types.
    - This will also print a suffixing ellipsis when `justFirst` is
      `true`.

  - Important bugfix for embedded values always being presented as
    four-bytes rather than being truncated to their reported unit-count
    bytes first. We tripped over this when some of our corresponding
    math was found to be wrong elsewhere.

- Minor reformatting.
2019-12-28 23:35:32 -05:00
Dustin Oprea
38a16c885e ifd_builder.go: Add NextIb() so can access sibling IBs 2019-02-26 12:23:16 -05:00
Dustin Oprea
9068786204 Rewired to use IFD-path strings instead of IfdIdentities.
- These are absolute representations of where an IFD is positioned with
  respect to the other IFDs. There is a more-specific, "fully-qualified"
  form of the IFD-path that allows you to express indices in order to
  refer to specific siblings.

- Eliminates issues with IFDs at different levels potentially having the
  same name (if that's what is required with a certain dataset/
  datasource).

- There is a specific IFD registry that controls the heirarchy of IFDs
  that we recognize and the tags associated with the child IFDs. This
  allows custom hierarchies replacing even the TIFF specification for
  which are expected in an image (so we can read other types of images
  or any potential IFD hierarchy, even non-image ones).

- IFD and IB instances embed the IFD-path and FQ IFD-path that they were
  found or built for.
2018-08-01 08:35:21 -04:00
Dustin Oprea
d3b45fae77 We now have to pass a specific tag-index in from the top.
- This will allow us to handle custom tags and, with a little more work,
  custom IFDs.
2018-07-26 22:45:43 -04:00
Dustin Oprea
186facf99e ifd_builder: Fix for error from SetStandard functions not adding new tags. 2018-06-11 04:42:54 -04:00
Dustin Oprea
7e10e5db27 ifd_builder: Added ChildWithIfdIdentity().
- Adjusted some of the tag replacement functionality.
2018-06-10 18:45:38 -04:00
Dustin Oprea
4cd9e35801 ifd_enumerate: Implemented (*Ifd).ChildWithName() .
- Corrected some tabs that weren't correctly changed to spaces.
2018-06-07 21:36:14 -04:00
Dustin Oprea
f4db9f31af tags: We now use a singleton TagIndex internally.
- We now embed the tags data so that we can be used in single,
  distributable binaries..
2018-06-07 05:15:51 -04:00
Dustin Oprea
1c95c159fb ifd_builder: Renamed "FromConfig" functions.
- ..to use the word "Standard" instead, instead of having both.
- Removed original NewStandardBuilderTag function. Just used by a couple
  of tests and it conflicts with one of the renamings.
2018-06-06 19:00:53 -04:00
Dustin Oprea
570c4d582c ifd_builder: renamed builderTag to BuilderTag.
- It's probably a generally good idea.
  - These are usually created by other methods, but they're regularly
    interacted with when you want to make tag changes and by making them
    private we can't public official, testable examples.

- Corrected names for new examples.
2018-05-29 14:47:30 -04:00
Dustin Oprea
abbf7e0d92 ifd_builder: builderTag is now passed by reference. 2018-05-29 01:32:09 -04:00
Dustin Oprea
8ce7625fc9 ifd_builder_encode: Fixed addressing.
- Corrects the resolution issue that we were experiencing in sibling
  IFDs.
2018-05-28 23:47:47 -04:00
Dustin Oprea
080ff7d07d Adjusted some string representations. Fixed some hex-encodings.
- unknown: We no longer truncate UNDEFINED UserComment values.
  - This is one less thing that will be different between what we read
    and how we encode.
2018-05-28 21:14:15 -04:00
Dustin Oprea
3c1c668a9f encode: We now encode child IFDs as they occur.
- ..rather than after the normal tags.
2018-05-28 20:04:02 -04:00
Dustin Oprea
75ff008365 thumbnails: Reimplemented to use normal decode flow.
- We added a trick to overcome the fact that the tag is a slice of longs
  rather than bytes (and would usually cause check errors and alignment
  problems), but this allows us to use the normal allocation and
  decoding flows that are used by normal tags.
  - Made things simpler, but we're still mis-encoding the
    thumbnail, somehow/somewhere.
2018-05-25 21:12:24 -04:00
Dustin Oprea
d7ff9ccbbe Tag dumps now include indices. 2018-05-24 03:19:46 -04:00
Dustin Oprea
843976865e ifdBuilder.dumpToStrings: Fixed usage of II.
- We were ambiguously treating it as both the parent II in some places
  and the child II in others. It's supposed to be the parent II.
2018-05-24 01:58:58 -04:00
Dustin Oprea
3cee9b956b ifd_builder_encoder: Fixed subtle but detrimental bugs.
- ifd_builder_encode
  - Bugfix: We were assigning the "next" IFD in correctly (so, chaining
    was broken).
  - Bugfix: We weren't using the right value when *writing* the "next"
    IFD offset (so, chaining was, again, broken).
    - The same IFD was showing as both a child and a sibling, so we were
      seeing the EXIF IFD also being chained-to by the first root IFD
      instead of the *actual* sibling, but only after encoding and then
      decoding (so, this had to be tracked down in the encoding
      semantics, which was non-trivial).

  - Added a test for the stuff that we fixed.
  - Implemented journaling, where we can dump a hierarchically-formatted
    list of operations involved in a completed encode.

- ifd_enumerate: Added (Ifd).TagValueBytes() to return the raw tag-
  value's bytes (rather than just having (Ifd).TagValue(), which returns
  the value marshaled into a string). Good for comparing raw encoded
  and decoded values without imposing interpretation (which gets us into
  trouble with unknown-type tags whose values are non-standard and
  undocumentedand, therefore, not actually parseable).

- Rewired a lot of print and dump functions.
  - For naming-specificity as well as functionality.

- Removed from debugging.
2018-05-21 13:14:42 -04:00
Dustin Oprea
6207bd6200 Checkpoint. 2018-05-12 23:12:53 -04:00
Dustin Oprea
75b2c75c5a ifd_builder_encode: Added tests for encoding child IBs to EXIF.
- Big step. This is the most complicated thing we can do.
- ifd_builder_encode: Need to debug encoding linked IFDs to EXIF.
- ifd_builder: Renamed `SetNextIfd()` to `SetNextIb()`.
- ifd_builder: Bugfix to size assertion on return of
  (IfdBuilderEncode).encodeIfdToBytes().
- ifd_enumerate: Rename PrintNode() to PrintTree().
- ifd_enumerate: Added DumpTree() (to return a list of strings).
2018-05-03 12:43:06 -04:00
Dustin Oprea
b75f980bc4 ifd_enumerate: Create II when Ifd is constructed.
- ..rather than on-the-fly. Now efficient, especially now that it's used
  for find operations.
2018-05-03 11:13:34 -04:00
Dustin Oprea
8c09d04212 ifd_enumerate: Added find-by-id and find-by-name to tags in ifd.
- Made `(Ifd).Entries` a slice of pointers ([]*IfdTagEntry).
2018-05-03 04:09:06 -04:00
Dustin Oprea
35ddc4f803 ifd_builder_encode: Fixed tests from previous change.
- Simplified `builderTag` use.
2018-05-02 07:04:47 -04:00
Dustin Oprea
16586eb8cb ifd_builder: Now embed type in builderTag.
- We were automatically looking this up but this will prevent users from
  having a mechanism to use custom tags.
2018-05-02 06:40:36 -04:00
Dustin Oprea
b748843a75 tags_unknown: Seeded a first test for encode/decode.
- type_encode: `EncodeWithType` can now encode TypeAsciiNoNul.
- Resolved/removed a bunch of to-do's.
2018-05-02 06:04:14 -04:00
Dustin Oprea
54e4cb73eb IfdBuilder: Added AddFromConfigWithName().
- IfdBuilder: Added NewBuilderTagFromConfigWithName().
- TagIndex: Added GetWithName().
- IfdByteEncoder: Updated example to use names.
2018-05-01 12:22:48 -04:00
Dustin Oprea
bbc7f976af ifd_builder: Added test for encoding a complete IFD. 2018-04-29 01:51:12 -04:00
Dustin Oprea
18d527eb72 ifd_builder_encode: Added tests for child-IFD encoding and allocation.
- ifd_enumerate: Added utility functions to parse individual, encoded
  IFDs and tags.
- ifd_builder: Corrected `NewBuilderTagFromConfig()` to automatically
  encode whichever type of value-argument it gets.
2018-04-28 19:22:13 -04:00
Dustin Oprea
d06a3c8963 ifd_builder: Implemented NewBuilderTagFromConfig() BT factory for testing.
- Updated IfdByteEncoder tests to use it instead of hacking-together
  their own BT's (makes for more standardized, consistent testing).

- Universally refactored all core IFD knowledge implemented upon a
  single IFD name to instead work with IfdIdentity instances, instead,
  in order to validate that we only recognize the IFDs only in the
  context of the correct parents in the hierarchy.

- Implemented standard testing byte-order (assigned to
  TestDefaultByteOrder).
2018-04-27 03:42:59 -04:00
Dustin Oprea
cabbc2fca1 ifd_builder: Added tests for ancillary builder logic. 2018-04-25 04:32:58 -04:00
Dustin Oprea
04631a36c3 ifd_builder: Wrote encoding and allocation logic.
- All of the major design considerations have been covered (unless we
  overlooked something).

- Completely untested.
2018-04-24 05:12:30 -04:00
Dustin Oprea
d035d20098 ifd_builder: value is now guaranteed to be a byte-slice or child-IFD.
- Using an interface{} required us to validate the encapsulated type or
  risk forgetting to.

- AddTagsFromExisting now just copies the bytes verbatim if no value-
  resolver provided.
2018-04-23 23:58:37 -04:00
Dustin Oprea
1107496d3c ifd_builder: AddChildIb now validates not previously added. 2018-04-23 21:59:42 -04:00
Dustin Oprea
4bea09dc78 ifd_builder: Can now build a complete chain from existing EXIF.
- ifd_builder:
  - We now validate that `builderTag` instances are either a byte array
    or a child Ifd before allowing to add.
  - Renamed `builderTag.valueBytes` to `builderTag.value` (it's not
    necessarily bytes).
  - `builderTag` now gets the child IFD name if representing a child
    IFD.
  - Added ability to dump structure to string slice.
  - Added NewIfdBuilderFromExistingChain to reconstruct whole chain
    from a read IFD chain (collection).
  - Wrote IB dumper.
  - Added structural tests.
  - Moved ifd_tag_entry types to separate file.

- tags_unknown: Unknown-type tags can now satisfy the `UnknownTagValue`
interface to return `[]byte`.
  - `IfdTagEntry.ValueBytes` automatically uses this. Else, error if not
    `[]byte` or `string`.

- ifd_enumerate
  - Now embed `ByteOrder` in `Ifd` (we otherwise require it to be passed
    a bit too often).

- Renamed some occurences of "IFD" to "IB" where an actual IB in order
  to not be confusing.
2018-04-23 04:53:51 -04:00
Dustin Oprea
50eafa98d6 ifd_enumerate: Added tests.
- Refactored (IfdTagEntry).ValueBytes() to handle managed undefined
  values.
2018-04-22 02:35:33 -04:00
Dustin Oprea
f1f23dca82 General intuitivity refactor. Imp'd (IfdTagEntry).ValueBytes().
- Added some assertions and constants. Renamed from variable so it'd be easy to
  tell if the byte-arrays, even though they come directly from the EXIF, which
  specific offsets they start at (so no remove for confusion during enumeration
  and building).
2018-04-21 20:54:56 -04:00
Dustin Oprea
00a5a5ad5b ifd_builder: Fixed so will compile. 2018-04-21 00:24:54 -04:00
Dustin Oprea
83c4834547 ifd_builder: Renamings. 2018-04-20 11:54:42 -04:00
Dustin Oprea
d4740ae5b5 Added TODOs. 2018-04-20 11:52:06 -04:00
Dustin Oprea
88333d9088 ifd_builder: Added main flow and allocation.
- We still need to implement the size calculations and tag encoding.
2018-04-20 11:45:32 -04:00